blob: 46532ff9160ccb7903c5bdfa3447ef37a146f855 [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;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002120 bool HasAVX512VBMI = false;
2121 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002122 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002123 bool HasMPX = false;
2124 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002125 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002126 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002127 bool HasXSAVE = false;
2128 bool HasXSAVEOPT = false;
2129 bool HasXSAVEC = false;
2130 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002131 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002132 bool HasCLFLUSHOPT = false;
2133 bool HasPCOMMIT = false;
2134 bool HasCLWB = false;
2135 bool HasUMIP = false;
2136 bool HasMOVBE = false;
2137 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002138
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002139 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2140 ///
2141 /// Each enumeration represents a particular CPU supported by Clang. These
2142 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2143 enum CPUKind {
2144 CK_Generic,
2145
2146 /// \name i386
2147 /// i386-generation processors.
2148 //@{
2149 CK_i386,
2150 //@}
2151
2152 /// \name i486
2153 /// i486-generation processors.
2154 //@{
2155 CK_i486,
2156 CK_WinChipC6,
2157 CK_WinChip2,
2158 CK_C3,
2159 //@}
2160
2161 /// \name i586
2162 /// i586-generation processors, P5 microarchitecture based.
2163 //@{
2164 CK_i586,
2165 CK_Pentium,
2166 CK_PentiumMMX,
2167 //@}
2168
2169 /// \name i686
2170 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2171 //@{
2172 CK_i686,
2173 CK_PentiumPro,
2174 CK_Pentium2,
2175 CK_Pentium3,
2176 CK_Pentium3M,
2177 CK_PentiumM,
2178 CK_C3_2,
2179
2180 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2181 /// Clang however has some logic to suport this.
2182 // FIXME: Warn, deprecate, and potentially remove this.
2183 CK_Yonah,
2184 //@}
2185
2186 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002187 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002188 //@{
2189 CK_Pentium4,
2190 CK_Pentium4M,
2191 CK_Prescott,
2192 CK_Nocona,
2193 //@}
2194
2195 /// \name Core
2196 /// Core microarchitecture based processors.
2197 //@{
2198 CK_Core2,
2199
2200 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2201 /// codename which GCC no longer accepts as an option to -march, but Clang
2202 /// has some logic for recognizing it.
2203 // FIXME: Warn, deprecate, and potentially remove this.
2204 CK_Penryn,
2205 //@}
2206
2207 /// \name Atom
2208 /// Atom processors
2209 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002210 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002211 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002212 //@}
2213
2214 /// \name Nehalem
2215 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002216 CK_Nehalem,
2217
2218 /// \name Westmere
2219 /// Westmere microarchitecture based processors.
2220 CK_Westmere,
2221
2222 /// \name Sandy Bridge
2223 /// Sandy Bridge microarchitecture based processors.
2224 CK_SandyBridge,
2225
2226 /// \name Ivy Bridge
2227 /// Ivy Bridge microarchitecture based processors.
2228 CK_IvyBridge,
2229
2230 /// \name Haswell
2231 /// Haswell microarchitecture based processors.
2232 CK_Haswell,
2233
2234 /// \name Broadwell
2235 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002236 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002237
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002238 /// \name Skylake Client
2239 /// Skylake client microarchitecture based processors.
2240 CK_SkylakeClient,
2241
2242 /// \name Skylake Server
2243 /// Skylake server microarchitecture based processors.
2244 CK_SkylakeServer,
2245
2246 /// \name Cannonlake Client
2247 /// Cannonlake client microarchitecture based processors.
2248 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002249
Craig Topper449314e2013-08-20 07:09:39 +00002250 /// \name Knights Landing
2251 /// Knights Landing processor.
2252 CK_KNL,
2253
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002254 /// \name K6
2255 /// K6 architecture processors.
2256 //@{
2257 CK_K6,
2258 CK_K6_2,
2259 CK_K6_3,
2260 //@}
2261
2262 /// \name K7
2263 /// K7 architecture processors.
2264 //@{
2265 CK_Athlon,
2266 CK_AthlonThunderbird,
2267 CK_Athlon4,
2268 CK_AthlonXP,
2269 CK_AthlonMP,
2270 //@}
2271
2272 /// \name K8
2273 /// K8 architecture processors.
2274 //@{
2275 CK_Athlon64,
2276 CK_Athlon64SSE3,
2277 CK_AthlonFX,
2278 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002279 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002280 CK_Opteron,
2281 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002282 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002283 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002284
Benjamin Kramer569f2152012-01-10 11:50:18 +00002285 /// \name Bobcat
2286 /// Bobcat architecture processors.
2287 //@{
2288 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002289 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002290 //@}
2291
2292 /// \name Bulldozer
2293 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002294 //@{
2295 CK_BDVER1,
2296 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002297 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002298 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002299 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002300
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002301 /// This specification is deprecated and will be removed in the future.
2302 /// Users should prefer \see CK_K8.
2303 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002304 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002305 CK_x86_64,
2306 //@}
2307
2308 /// \name Geode
2309 /// Geode processors.
2310 //@{
2311 CK_Geode
2312 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002313 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002314
Eric Christopherc50738f2015-08-27 00:05:50 +00002315 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002316 return llvm::StringSwitch<CPUKind>(CPU)
2317 .Case("i386", CK_i386)
2318 .Case("i486", CK_i486)
2319 .Case("winchip-c6", CK_WinChipC6)
2320 .Case("winchip2", CK_WinChip2)
2321 .Case("c3", CK_C3)
2322 .Case("i586", CK_i586)
2323 .Case("pentium", CK_Pentium)
2324 .Case("pentium-mmx", CK_PentiumMMX)
2325 .Case("i686", CK_i686)
2326 .Case("pentiumpro", CK_PentiumPro)
2327 .Case("pentium2", CK_Pentium2)
2328 .Case("pentium3", CK_Pentium3)
2329 .Case("pentium3m", CK_Pentium3M)
2330 .Case("pentium-m", CK_PentiumM)
2331 .Case("c3-2", CK_C3_2)
2332 .Case("yonah", CK_Yonah)
2333 .Case("pentium4", CK_Pentium4)
2334 .Case("pentium4m", CK_Pentium4M)
2335 .Case("prescott", CK_Prescott)
2336 .Case("nocona", CK_Nocona)
2337 .Case("core2", CK_Core2)
2338 .Case("penryn", CK_Penryn)
2339 .Case("bonnell", CK_Bonnell)
2340 .Case("atom", CK_Bonnell) // Legacy name.
2341 .Case("silvermont", CK_Silvermont)
2342 .Case("slm", CK_Silvermont) // Legacy name.
2343 .Case("nehalem", CK_Nehalem)
2344 .Case("corei7", CK_Nehalem) // Legacy name.
2345 .Case("westmere", CK_Westmere)
2346 .Case("sandybridge", CK_SandyBridge)
2347 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2348 .Case("ivybridge", CK_IvyBridge)
2349 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2350 .Case("haswell", CK_Haswell)
2351 .Case("core-avx2", CK_Haswell) // Legacy name.
2352 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002353 .Case("skylake", CK_SkylakeClient)
2354 .Case("skylake-avx512", CK_SkylakeServer)
2355 .Case("skx", CK_SkylakeServer) // Legacy name.
2356 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002357 .Case("knl", CK_KNL)
2358 .Case("k6", CK_K6)
2359 .Case("k6-2", CK_K6_2)
2360 .Case("k6-3", CK_K6_3)
2361 .Case("athlon", CK_Athlon)
2362 .Case("athlon-tbird", CK_AthlonThunderbird)
2363 .Case("athlon-4", CK_Athlon4)
2364 .Case("athlon-xp", CK_AthlonXP)
2365 .Case("athlon-mp", CK_AthlonMP)
2366 .Case("athlon64", CK_Athlon64)
2367 .Case("athlon64-sse3", CK_Athlon64SSE3)
2368 .Case("athlon-fx", CK_AthlonFX)
2369 .Case("k8", CK_K8)
2370 .Case("k8-sse3", CK_K8SSE3)
2371 .Case("opteron", CK_Opteron)
2372 .Case("opteron-sse3", CK_OpteronSSE3)
2373 .Case("barcelona", CK_AMDFAM10)
2374 .Case("amdfam10", CK_AMDFAM10)
2375 .Case("btver1", CK_BTVER1)
2376 .Case("btver2", CK_BTVER2)
2377 .Case("bdver1", CK_BDVER1)
2378 .Case("bdver2", CK_BDVER2)
2379 .Case("bdver3", CK_BDVER3)
2380 .Case("bdver4", CK_BDVER4)
2381 .Case("x86-64", CK_x86_64)
2382 .Case("geode", CK_Geode)
2383 .Default(CK_Generic);
2384 }
2385
Rafael Espindolaeb265472013-08-21 21:59:03 +00002386 enum FPMathKind {
2387 FP_Default,
2388 FP_SSE,
2389 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002390 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002391
Eli Friedman3fd920a2008-08-20 02:34:37 +00002392public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002393 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002394 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002395 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002396 }
Craig Topper3164f332014-03-11 03:39:26 +00002397 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002398 // X87 evaluates with 80 bits "long double" precision.
2399 return SSELevel == NoSSE ? 2 : 0;
2400 }
Craig Topper6c03a542015-10-19 04:51:35 +00002401 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2402 return llvm::makeArrayRef(BuiltinInfo,
2403 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002404 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002405 ArrayRef<const char *> getGCCRegNames() const override {
2406 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002407 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002408 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2409 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002410 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002411 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2412 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002413 }
Eric Christopherd9832702015-06-29 21:00:05 +00002414 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002415 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002416 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002417
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002418 bool validateGlobalRegisterVariable(StringRef RegName,
2419 unsigned RegSize,
2420 bool &HasSizeMismatch) const override {
2421 // esp and ebp are the only 32-bit registers the x86 backend can currently
2422 // handle.
2423 if (RegName.equals("esp") || RegName.equals("ebp")) {
2424 // Check that the register size is 32-bit.
2425 HasSizeMismatch = RegSize != 32;
2426 return true;
2427 }
2428
2429 return false;
2430 }
2431
Akira Hatanaka974131e2014-09-18 18:17:18 +00002432 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2433
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002434 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2435
Akira Hatanaka974131e2014-09-18 18:17:18 +00002436 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2437
Craig Topper3164f332014-03-11 03:39:26 +00002438 std::string convertConstraint(const char *&Constraint) const override;
2439 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002440 return "~{dirflag},~{fpsr},~{flags}";
2441 }
Craig Topper3164f332014-03-11 03:39:26 +00002442 void getTargetDefines(const LangOptions &Opts,
2443 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002444 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2445 bool Enabled);
2446 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2447 bool Enabled);
2448 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2449 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002450 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2451 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002452 setFeatureEnabledImpl(Features, Name, Enabled);
2453 }
2454 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002455 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002456 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2457 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002458 bool
2459 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2460 StringRef CPU,
2461 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002462 bool hasFeature(StringRef Feature) const override;
2463 bool handleTargetFeatures(std::vector<std::string> &Features,
2464 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002465 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002466 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2467 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002468 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002469 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002470 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002471 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002472 return "no-mmx";
2473 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002474 }
Craig Topper3164f332014-03-11 03:39:26 +00002475 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002476 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002477
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002478 // Perform any per-CPU checks necessary to determine if this CPU is
2479 // acceptable.
2480 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2481 // invalid without explaining *why*.
2482 switch (CPU) {
2483 case CK_Generic:
2484 // No processor selected!
2485 return false;
2486
2487 case CK_i386:
2488 case CK_i486:
2489 case CK_WinChipC6:
2490 case CK_WinChip2:
2491 case CK_C3:
2492 case CK_i586:
2493 case CK_Pentium:
2494 case CK_PentiumMMX:
2495 case CK_i686:
2496 case CK_PentiumPro:
2497 case CK_Pentium2:
2498 case CK_Pentium3:
2499 case CK_Pentium3M:
2500 case CK_PentiumM:
2501 case CK_Yonah:
2502 case CK_C3_2:
2503 case CK_Pentium4:
2504 case CK_Pentium4M:
2505 case CK_Prescott:
2506 case CK_K6:
2507 case CK_K6_2:
2508 case CK_K6_3:
2509 case CK_Athlon:
2510 case CK_AthlonThunderbird:
2511 case CK_Athlon4:
2512 case CK_AthlonXP:
2513 case CK_AthlonMP:
2514 case CK_Geode:
2515 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002516 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002517 return false;
2518
2519 // Fallthrough
2520 case CK_Nocona:
2521 case CK_Core2:
2522 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002523 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002524 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002525 case CK_Nehalem:
2526 case CK_Westmere:
2527 case CK_SandyBridge:
2528 case CK_IvyBridge:
2529 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002530 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002531 case CK_SkylakeClient:
2532 case CK_SkylakeServer:
2533 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002534 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002535 case CK_Athlon64:
2536 case CK_Athlon64SSE3:
2537 case CK_AthlonFX:
2538 case CK_K8:
2539 case CK_K8SSE3:
2540 case CK_Opteron:
2541 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002542 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002543 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002544 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002545 case CK_BDVER1:
2546 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002547 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002548 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002549 case CK_x86_64:
2550 return true;
2551 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002552 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002553 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002554
Craig Topper3164f332014-03-11 03:39:26 +00002555 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002556
Craig Topper3164f332014-03-11 03:39:26 +00002557 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002558 // We accept all non-ARM calling conventions
2559 return (CC == CC_X86ThisCall ||
2560 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002561 CC == CC_X86StdCall ||
2562 CC == CC_X86VectorCall ||
2563 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002564 CC == CC_X86Pascal ||
2565 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002566 }
2567
Craig Topper3164f332014-03-11 03:39:26 +00002568 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002569 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002570 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002571
2572 bool hasSjLjLowering() const override {
2573 return true;
2574 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002575};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002576
Rafael Espindolaeb265472013-08-21 21:59:03 +00002577bool X86TargetInfo::setFPMath(StringRef Name) {
2578 if (Name == "387") {
2579 FPMath = FP_387;
2580 return true;
2581 }
2582 if (Name == "sse") {
2583 FPMath = FP_SSE;
2584 return true;
2585 }
2586 return false;
2587}
2588
Eric Christopher007b0a02015-08-28 22:32:01 +00002589bool X86TargetInfo::initFeatureMap(
2590 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002591 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002592 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002593 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002594 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002595 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002596
Eric Christopher2b4a7252015-08-27 00:05:52 +00002597 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002598 case CK_Generic:
2599 case CK_i386:
2600 case CK_i486:
2601 case CK_i586:
2602 case CK_Pentium:
2603 case CK_i686:
2604 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 break;
2606 case CK_PentiumMMX:
2607 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002608 case CK_K6:
2609 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002610 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 break;
2612 case CK_Pentium3:
2613 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002614 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002615 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002616 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002617 break;
2618 case CK_PentiumM:
2619 case CK_Pentium4:
2620 case CK_Pentium4M:
2621 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002622 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002623 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 break;
2625 case CK_Yonah:
2626 case CK_Prescott:
2627 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002628 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002629 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002630 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002631 break;
2632 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002633 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002634 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002635 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002636 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 break;
2638 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002639 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002640 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002641 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002643 case CK_Cannonlake:
2644 setFeatureEnabledImpl(Features, "avx512ifma", true);
2645 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2646 setFeatureEnabledImpl(Features, "sha", true);
2647 setFeatureEnabledImpl(Features, "umip", true);
2648 // FALLTHROUGH
2649 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002650 setFeatureEnabledImpl(Features, "avx512f", true);
2651 setFeatureEnabledImpl(Features, "avx512cd", true);
2652 setFeatureEnabledImpl(Features, "avx512dq", true);
2653 setFeatureEnabledImpl(Features, "avx512bw", true);
2654 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002655 setFeatureEnabledImpl(Features, "pku", true);
2656 setFeatureEnabledImpl(Features, "pcommit", true);
2657 setFeatureEnabledImpl(Features, "clwb", true);
2658 // FALLTHROUGH
2659 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002660 setFeatureEnabledImpl(Features, "xsavec", true);
2661 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002662 setFeatureEnabledImpl(Features, "mpx", true);
2663 setFeatureEnabledImpl(Features, "sgx", true);
2664 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002665 // FALLTHROUGH
2666 case CK_Broadwell:
2667 setFeatureEnabledImpl(Features, "rdseed", true);
2668 setFeatureEnabledImpl(Features, "adx", true);
2669 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002670 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002671 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002672 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002673 setFeatureEnabledImpl(Features, "bmi", true);
2674 setFeatureEnabledImpl(Features, "bmi2", true);
2675 setFeatureEnabledImpl(Features, "rtm", true);
2676 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002677 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002678 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002679 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002680 setFeatureEnabledImpl(Features, "rdrnd", true);
2681 setFeatureEnabledImpl(Features, "f16c", true);
2682 setFeatureEnabledImpl(Features, "fsgsbase", true);
2683 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002684 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002685 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002686 setFeatureEnabledImpl(Features, "xsave", true);
2687 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002688 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002689 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002690 case CK_Silvermont:
2691 setFeatureEnabledImpl(Features, "aes", true);
2692 setFeatureEnabledImpl(Features, "pclmul", true);
2693 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002694 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002695 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002696 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002697 setFeatureEnabledImpl(Features, "cx16", true);
2698 break;
2699 case CK_KNL:
2700 setFeatureEnabledImpl(Features, "avx512f", true);
2701 setFeatureEnabledImpl(Features, "avx512cd", true);
2702 setFeatureEnabledImpl(Features, "avx512er", true);
2703 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002704 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002705 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002706 setFeatureEnabledImpl(Features, "rdseed", true);
2707 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002708 setFeatureEnabledImpl(Features, "lzcnt", true);
2709 setFeatureEnabledImpl(Features, "bmi", true);
2710 setFeatureEnabledImpl(Features, "bmi2", true);
2711 setFeatureEnabledImpl(Features, "rtm", true);
2712 setFeatureEnabledImpl(Features, "fma", true);
2713 setFeatureEnabledImpl(Features, "rdrnd", true);
2714 setFeatureEnabledImpl(Features, "f16c", true);
2715 setFeatureEnabledImpl(Features, "fsgsbase", true);
2716 setFeatureEnabledImpl(Features, "aes", true);
2717 setFeatureEnabledImpl(Features, "pclmul", true);
2718 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002719 setFeatureEnabledImpl(Features, "xsaveopt", true);
2720 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002721 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002722 break;
2723 case CK_K6_2:
2724 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 case CK_WinChip2:
2726 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002727 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002728 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002729 case CK_Athlon:
2730 case CK_AthlonThunderbird:
2731 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002732 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002733 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002734 case CK_Athlon4:
2735 case CK_AthlonXP:
2736 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002737 setFeatureEnabledImpl(Features, "sse", true);
2738 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002739 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002740 break;
2741 case CK_K8:
2742 case CK_Opteron:
2743 case CK_Athlon64:
2744 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002745 setFeatureEnabledImpl(Features, "sse2", true);
2746 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002747 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002748 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002749 case CK_AMDFAM10:
2750 setFeatureEnabledImpl(Features, "sse4a", true);
2751 setFeatureEnabledImpl(Features, "lzcnt", true);
2752 setFeatureEnabledImpl(Features, "popcnt", true);
2753 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002754 case CK_K8SSE3:
2755 case CK_OpteronSSE3:
2756 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002757 setFeatureEnabledImpl(Features, "sse3", true);
2758 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002759 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002760 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002761 case CK_BTVER2:
2762 setFeatureEnabledImpl(Features, "avx", true);
2763 setFeatureEnabledImpl(Features, "aes", true);
2764 setFeatureEnabledImpl(Features, "pclmul", true);
2765 setFeatureEnabledImpl(Features, "bmi", true);
2766 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002767 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002768 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002769 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002770 setFeatureEnabledImpl(Features, "ssse3", true);
2771 setFeatureEnabledImpl(Features, "sse4a", true);
2772 setFeatureEnabledImpl(Features, "lzcnt", true);
2773 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002774 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002775 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002776 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002777 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002778 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002779 case CK_BDVER4:
2780 setFeatureEnabledImpl(Features, "avx2", true);
2781 setFeatureEnabledImpl(Features, "bmi2", true);
2782 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002783 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002784 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002785 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002786 // FALLTHROUGH
2787 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002788 setFeatureEnabledImpl(Features, "bmi", true);
2789 setFeatureEnabledImpl(Features, "fma", true);
2790 setFeatureEnabledImpl(Features, "f16c", true);
2791 setFeatureEnabledImpl(Features, "tbm", true);
2792 // FALLTHROUGH
2793 case CK_BDVER1:
2794 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002795 setFeatureEnabledImpl(Features, "xop", true);
2796 setFeatureEnabledImpl(Features, "lzcnt", true);
2797 setFeatureEnabledImpl(Features, "aes", true);
2798 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002799 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002800 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002801 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002802 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002803 break;
Eli Friedman33465822011-07-08 23:31:17 +00002804 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002805 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2806 return false;
2807
2808 // Can't do this earlier because we need to be able to explicitly enable
2809 // or disable these features and the things that they depend upon.
2810
2811 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2812 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002813 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002814 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2815 FeaturesVec.end())
2816 Features["popcnt"] = true;
2817
2818 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2819 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002820 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002821 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2822 FeaturesVec.end())
2823 Features["prfchw"] = true;
2824
Eric Christophera7260af2015-10-08 20:10:18 +00002825 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2826 // then enable MMX.
2827 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002828 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002829 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2830 FeaturesVec.end())
2831 Features["mmx"] = true;
2832
Eric Christopherbbd746d2015-10-08 20:10:14 +00002833 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002834}
2835
Rafael Espindolae62e2792013-08-20 13:44:29 +00002836void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002837 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002838 if (Enabled) {
2839 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002840 case AVX512F:
2841 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 case AVX2:
2843 Features["avx2"] = true;
2844 case AVX:
2845 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002846 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002847 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002848 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002849 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002850 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002851 case SSSE3:
2852 Features["ssse3"] = true;
2853 case SSE3:
2854 Features["sse3"] = true;
2855 case SSE2:
2856 Features["sse2"] = true;
2857 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 Features["sse"] = true;
2859 case NoSSE:
2860 break;
2861 }
2862 return;
2863 }
2864
2865 switch (Level) {
2866 case NoSSE:
2867 case SSE1:
2868 Features["sse"] = false;
2869 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002870 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2871 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002872 case SSE3:
2873 Features["sse3"] = false;
2874 setXOPLevel(Features, NoXOP, false);
2875 case SSSE3:
2876 Features["ssse3"] = false;
2877 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002878 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002879 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002880 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002881 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002882 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2883 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002884 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002885 case AVX2:
2886 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002887 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002888 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002889 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2890 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002891 }
2892}
2893
2894void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002895 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002896 if (Enabled) {
2897 switch (Level) {
2898 case AMD3DNowAthlon:
2899 Features["3dnowa"] = true;
2900 case AMD3DNow:
2901 Features["3dnow"] = true;
2902 case MMX:
2903 Features["mmx"] = true;
2904 case NoMMX3DNow:
2905 break;
2906 }
2907 return;
2908 }
2909
2910 switch (Level) {
2911 case NoMMX3DNow:
2912 case MMX:
2913 Features["mmx"] = false;
2914 case AMD3DNow:
2915 Features["3dnow"] = false;
2916 case AMD3DNowAthlon:
2917 Features["3dnowa"] = false;
2918 }
2919}
2920
2921void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002922 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002923 if (Enabled) {
2924 switch (Level) {
2925 case XOP:
2926 Features["xop"] = true;
2927 case FMA4:
2928 Features["fma4"] = true;
2929 setSSELevel(Features, AVX, true);
2930 case SSE4A:
2931 Features["sse4a"] = true;
2932 setSSELevel(Features, SSE3, true);
2933 case NoXOP:
2934 break;
2935 }
2936 return;
2937 }
2938
2939 switch (Level) {
2940 case NoXOP:
2941 case SSE4A:
2942 Features["sse4a"] = false;
2943 case FMA4:
2944 Features["fma4"] = false;
2945 case XOP:
2946 Features["xop"] = false;
2947 }
2948}
2949
Craig Topper86d79ef2013-09-17 04:51:29 +00002950void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2951 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002952 // This is a bit of a hack to deal with the sse4 target feature when used
2953 // as part of the target attribute. We handle sse4 correctly everywhere
2954 // else. See below for more information on how we handle the sse4 options.
2955 if (Name != "sse4")
2956 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002957
Craig Topper29561122013-09-19 01:13:07 +00002958 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002959 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002960 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002961 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002962 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002963 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002964 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002965 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002966 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002967 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002968 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002969 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002970 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002971 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002972 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002973 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002974 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002975 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002976 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002977 if (Enabled)
2978 setSSELevel(Features, SSE2, Enabled);
2979 } else if (Name == "pclmul") {
2980 if (Enabled)
2981 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002982 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002983 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002984 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002985 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002986 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002987 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002988 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2989 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002990 if (Enabled)
2991 setSSELevel(Features, AVX512F, Enabled);
2992 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002993 if (Enabled)
2994 setSSELevel(Features, AVX, Enabled);
2995 } else if (Name == "fma4") {
2996 setXOPLevel(Features, FMA4, Enabled);
2997 } else if (Name == "xop") {
2998 setXOPLevel(Features, XOP, Enabled);
2999 } else if (Name == "sse4a") {
3000 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003001 } else if (Name == "f16c") {
3002 if (Enabled)
3003 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003004 } else if (Name == "sha") {
3005 if (Enabled)
3006 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003007 } else if (Name == "sse4") {
3008 // We can get here via the __target__ attribute since that's not controlled
3009 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3010 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3011 // disabled.
3012 if (Enabled)
3013 setSSELevel(Features, SSE42, Enabled);
3014 else
3015 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003016 } else if (Name == "xsave") {
3017 if (Enabled)
3018 setSSELevel(Features, AVX, Enabled);
3019 else
3020 Features["xsaveopt"] = false;
3021 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
3022 if (Enabled) {
3023 Features["xsave"] = true;
3024 setSSELevel(Features, AVX, Enabled);
3025 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003026 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003027}
3028
Eric Christopher3ff21b32013-10-16 21:26:26 +00003029/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003030/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003031bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003032 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003033 for (const auto &Feature : Features) {
3034 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003035 continue;
3036
Eric Christopher610fe112015-08-26 08:21:55 +00003037 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003038 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003039 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003040 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003041 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003042 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003043 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003044 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003045 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003046 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003047 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003048 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003049 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003050 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003051 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003052 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003053 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003054 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003055 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003056 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003057 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003058 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003059 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003060 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003061 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003062 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003064 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003066 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003067 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003068 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003069 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003070 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003072 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003073 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003074 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003075 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003076 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003077 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003078 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003079 } else if (Feature == "+avx512vbmi") {
3080 HasAVX512VBMI = true;
3081 } else if (Feature == "+avx512ifma") {
3082 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003083 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003084 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003085 } else if (Feature == "+mpx") {
3086 HasMPX = true;
3087 } else if (Feature == "+movbe") {
3088 HasMOVBE = true;
3089 } else if (Feature == "+sgx") {
3090 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003091 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003092 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003093 } else if (Feature == "+fxsr") {
3094 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003095 } else if (Feature == "+xsave") {
3096 HasXSAVE = true;
3097 } else if (Feature == "+xsaveopt") {
3098 HasXSAVEOPT = true;
3099 } else if (Feature == "+xsavec") {
3100 HasXSAVEC = true;
3101 } else if (Feature == "+xsaves") {
3102 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003103 } else if (Feature == "+pku") {
3104 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003105 } else if (Feature == "+clflushopt") {
3106 HasCLFLUSHOPT = true;
3107 } else if (Feature == "+pcommit") {
3108 HasPCOMMIT = true;
3109 } else if (Feature == "+clwb") {
3110 HasCLWB = true;
3111 } else if (Feature == "+umip") {
3112 HasUMIP = true;
3113 } else if (Feature == "+prefetchwt1") {
3114 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003115 }
3116
Benjamin Kramer27402c62012-03-05 15:10:44 +00003117 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003118 .Case("+avx512f", AVX512F)
3119 .Case("+avx2", AVX2)
3120 .Case("+avx", AVX)
3121 .Case("+sse4.2", SSE42)
3122 .Case("+sse4.1", SSE41)
3123 .Case("+ssse3", SSSE3)
3124 .Case("+sse3", SSE3)
3125 .Case("+sse2", SSE2)
3126 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003127 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003128 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003129
Eli Friedman33465822011-07-08 23:31:17 +00003130 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003131 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003132 .Case("+3dnowa", AMD3DNowAthlon)
3133 .Case("+3dnow", AMD3DNow)
3134 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003135 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003136 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003137
3138 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003139 .Case("+xop", XOP)
3140 .Case("+fma4", FMA4)
3141 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003142 .Default(NoXOP);
3143 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003144 }
Eli Friedman33465822011-07-08 23:31:17 +00003145
Rafael Espindolaeb265472013-08-21 21:59:03 +00003146 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3147 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003148 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3149 (FPMath == FP_387 && SSELevel >= SSE1)) {
3150 Diags.Report(diag::err_target_unsupported_fpmath) <<
3151 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003152 return false;
3153 }
3154
Alexey Bataev00396512015-07-02 03:40:19 +00003155 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003156 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003157 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003158}
Chris Lattnerecd49032009-03-02 22:27:17 +00003159
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003160/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3161/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003162void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003163 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003164 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003165 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003166 Builder.defineMacro("__amd64__");
3167 Builder.defineMacro("__amd64");
3168 Builder.defineMacro("__x86_64");
3169 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003170 if (getTriple().getArchName() == "x86_64h") {
3171 Builder.defineMacro("__x86_64h");
3172 Builder.defineMacro("__x86_64h__");
3173 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003174 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003175 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003176 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003177
Chris Lattnerecd49032009-03-02 22:27:17 +00003178 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003179 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3180 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 switch (CPU) {
3182 case CK_Generic:
3183 break;
3184 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003185 // The rest are coming from the i386 define above.
3186 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 break;
3188 case CK_i486:
3189 case CK_WinChipC6:
3190 case CK_WinChip2:
3191 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003192 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003193 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003194 case CK_PentiumMMX:
3195 Builder.defineMacro("__pentium_mmx__");
3196 Builder.defineMacro("__tune_pentium_mmx__");
3197 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003198 case CK_i586:
3199 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003200 defineCPUMacros(Builder, "i586");
3201 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003202 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003203 case CK_Pentium3:
3204 case CK_Pentium3M:
3205 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003206 Builder.defineMacro("__tune_pentium3__");
3207 // Fallthrough
3208 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003209 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003210 Builder.defineMacro("__tune_pentium2__");
3211 // Fallthrough
3212 case CK_PentiumPro:
3213 Builder.defineMacro("__tune_i686__");
3214 Builder.defineMacro("__tune_pentiumpro__");
3215 // Fallthrough
3216 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003217 Builder.defineMacro("__i686");
3218 Builder.defineMacro("__i686__");
3219 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3220 Builder.defineMacro("__pentiumpro");
3221 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003222 break;
3223 case CK_Pentium4:
3224 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003225 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003226 break;
3227 case CK_Yonah:
3228 case CK_Prescott:
3229 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003230 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003231 break;
3232 case CK_Core2:
3233 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003234 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003235 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003236 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003237 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003238 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003239 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003240 defineCPUMacros(Builder, "slm");
3241 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003242 case CK_Nehalem:
3243 case CK_Westmere:
3244 case CK_SandyBridge:
3245 case CK_IvyBridge:
3246 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003247 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003248 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003249 // FIXME: Historically, we defined this legacy name, it would be nice to
3250 // remove it at some point. We've never exposed fine-grained names for
3251 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003252 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003253 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003254 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003255 defineCPUMacros(Builder, "skx");
3256 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003257 case CK_Cannonlake:
3258 break;
Craig Topper449314e2013-08-20 07:09:39 +00003259 case CK_KNL:
3260 defineCPUMacros(Builder, "knl");
3261 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003262 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003263 Builder.defineMacro("__k6_2__");
3264 Builder.defineMacro("__tune_k6_2__");
3265 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003266 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003267 if (CPU != CK_K6_2) { // In case of fallthrough
3268 // FIXME: GCC may be enabling these in cases where some other k6
3269 // architecture is specified but -m3dnow is explicitly provided. The
3270 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003271 Builder.defineMacro("__k6_3__");
3272 Builder.defineMacro("__tune_k6_3__");
3273 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003274 // Fallthrough
3275 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003276 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003277 break;
3278 case CK_Athlon:
3279 case CK_AthlonThunderbird:
3280 case CK_Athlon4:
3281 case CK_AthlonXP:
3282 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003283 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003284 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003285 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003286 Builder.defineMacro("__tune_athlon_sse__");
3287 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003288 break;
3289 case CK_K8:
3290 case CK_K8SSE3:
3291 case CK_x86_64:
3292 case CK_Opteron:
3293 case CK_OpteronSSE3:
3294 case CK_Athlon64:
3295 case CK_Athlon64SSE3:
3296 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003297 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003298 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003299 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003300 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003301 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003302 case CK_BTVER1:
3303 defineCPUMacros(Builder, "btver1");
3304 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003305 case CK_BTVER2:
3306 defineCPUMacros(Builder, "btver2");
3307 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003308 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003309 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003310 break;
3311 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003312 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003313 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003314 case CK_BDVER3:
3315 defineCPUMacros(Builder, "bdver3");
3316 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003317 case CK_BDVER4:
3318 defineCPUMacros(Builder, "bdver4");
3319 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003320 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003321 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003322 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003323 }
Chris Lattner96e43572009-03-02 22:40:39 +00003324
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003325 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003326 Builder.defineMacro("__REGISTER_PREFIX__", "");
3327
Chris Lattner6df41af2009-04-19 17:32:33 +00003328 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3329 // functions in glibc header files that use FP Stack inline asm which the
3330 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003331 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003332
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003333 if (HasAES)
3334 Builder.defineMacro("__AES__");
3335
Craig Topper3f122a72012-05-31 05:18:48 +00003336 if (HasPCLMUL)
3337 Builder.defineMacro("__PCLMUL__");
3338
Craig Topper22967d42011-12-25 05:06:45 +00003339 if (HasLZCNT)
3340 Builder.defineMacro("__LZCNT__");
3341
Benjamin Kramer1e250392012-07-07 09:39:18 +00003342 if (HasRDRND)
3343 Builder.defineMacro("__RDRND__");
3344
Craig Topper8c7f2512014-11-03 06:51:41 +00003345 if (HasFSGSBASE)
3346 Builder.defineMacro("__FSGSBASE__");
3347
Craig Topper22967d42011-12-25 05:06:45 +00003348 if (HasBMI)
3349 Builder.defineMacro("__BMI__");
3350
3351 if (HasBMI2)
3352 Builder.defineMacro("__BMI2__");
3353
Craig Topper1de83482011-12-29 16:10:46 +00003354 if (HasPOPCNT)
3355 Builder.defineMacro("__POPCNT__");
3356
Michael Liao625a8752012-11-10 05:17:46 +00003357 if (HasRTM)
3358 Builder.defineMacro("__RTM__");
3359
Michael Liao74f4eaf2013-03-26 17:52:08 +00003360 if (HasPRFCHW)
3361 Builder.defineMacro("__PRFCHW__");
3362
Michael Liaoffaae352013-03-29 05:17:55 +00003363 if (HasRDSEED)
3364 Builder.defineMacro("__RDSEED__");
3365
Robert Khasanov50e6f582014-09-19 09:53:48 +00003366 if (HasADX)
3367 Builder.defineMacro("__ADX__");
3368
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003369 if (HasTBM)
3370 Builder.defineMacro("__TBM__");
3371
Rafael Espindolae62e2792013-08-20 13:44:29 +00003372 switch (XOPLevel) {
3373 case XOP:
3374 Builder.defineMacro("__XOP__");
3375 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003376 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003377 case SSE4A:
3378 Builder.defineMacro("__SSE4A__");
3379 case NoXOP:
3380 break;
3381 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003382
Craig Topperbba778b2012-06-03 21:46:30 +00003383 if (HasFMA)
3384 Builder.defineMacro("__FMA__");
3385
Manman Rena45358c2012-10-11 00:59:55 +00003386 if (HasF16C)
3387 Builder.defineMacro("__F16C__");
3388
Craig Topper679b53a2013-08-21 05:29:10 +00003389 if (HasAVX512CD)
3390 Builder.defineMacro("__AVX512CD__");
3391 if (HasAVX512ER)
3392 Builder.defineMacro("__AVX512ER__");
3393 if (HasAVX512PF)
3394 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003395 if (HasAVX512DQ)
3396 Builder.defineMacro("__AVX512DQ__");
3397 if (HasAVX512BW)
3398 Builder.defineMacro("__AVX512BW__");
3399 if (HasAVX512VL)
3400 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003401
Ben Langmuir58078d02013-09-19 13:22:04 +00003402 if (HasSHA)
3403 Builder.defineMacro("__SHA__");
3404
Craig Toppere33f51f2015-10-16 06:22:36 +00003405 if (HasFXSR)
3406 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003407 if (HasXSAVE)
3408 Builder.defineMacro("__XSAVE__");
3409 if (HasXSAVEOPT)
3410 Builder.defineMacro("__XSAVEOPT__");
3411 if (HasXSAVEC)
3412 Builder.defineMacro("__XSAVEC__");
3413 if (HasXSAVES)
3414 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003415 if (HasPKU)
3416 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003417 if (HasCX16)
3418 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3419
Chris Lattner96e43572009-03-02 22:40:39 +00003420 // Each case falls through to the previous one here.
3421 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003422 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003423 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003424 case AVX2:
3425 Builder.defineMacro("__AVX2__");
3426 case AVX:
3427 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003428 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003429 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003430 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003431 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003432 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003433 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003434 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003435 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003436 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003437 Builder.defineMacro("__SSE2__");
3438 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003439 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003440 Builder.defineMacro("__SSE__");
3441 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003442 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003443 break;
3444 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003445
Derek Schuffc7dd7222012-10-11 15:52:22 +00003446 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003447 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003448 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003449 case AVX2:
3450 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003451 case SSE42:
3452 case SSE41:
3453 case SSSE3:
3454 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003455 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003456 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003457 break;
3458 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003459 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003460 break;
3461 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003462 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003463 }
3464 }
3465
Anders Carlssone437c682010-01-27 03:47:49 +00003466 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003467 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003468 case AMD3DNowAthlon:
3469 Builder.defineMacro("__3dNOW_A__");
3470 case AMD3DNow:
3471 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003472 case MMX:
3473 Builder.defineMacro("__MMX__");
3474 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003475 break;
3476 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003477
3478 if (CPU >= CK_i486) {
3479 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3480 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3481 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3482 }
3483 if (CPU >= CK_i586)
3484 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003485}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003486
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003487bool X86TargetInfo::hasFeature(StringRef Feature) const {
3488 return llvm::StringSwitch<bool>(Feature)
3489 .Case("aes", HasAES)
3490 .Case("avx", SSELevel >= AVX)
3491 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003492 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003493 .Case("avx512cd", HasAVX512CD)
3494 .Case("avx512er", HasAVX512ER)
3495 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003496 .Case("avx512dq", HasAVX512DQ)
3497 .Case("avx512bw", HasAVX512BW)
3498 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003499 .Case("avx512vbmi", HasAVX512VBMI)
3500 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003501 .Case("bmi", HasBMI)
3502 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003503 .Case("clflushopt", HasCLFLUSHOPT)
3504 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003505 .Case("cx16", HasCX16)
3506 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003507 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003508 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003509 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003510 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003511 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003512 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3513 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3514 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003515 .Case("movbe", HasMOVBE)
3516 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003517 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003518 .Case("pcommit", HasPCOMMIT)
3519 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003520 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003521 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003522 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003523 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003524 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003525 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003526 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003527 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003528 .Case("sse", SSELevel >= SSE1)
3529 .Case("sse2", SSELevel >= SSE2)
3530 .Case("sse3", SSELevel >= SSE3)
3531 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003532 .Case("sse4.1", SSELevel >= SSE41)
3533 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003534 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003535 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003536 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003537 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003538 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3539 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003540 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003541 .Case("xsave", HasXSAVE)
3542 .Case("xsavec", HasXSAVEC)
3543 .Case("xsaves", HasXSAVES)
3544 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003545 .Default(false);
3546}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003547
Eric Christopherd9832702015-06-29 21:00:05 +00003548// We can't use a generic validation scheme for the features accepted here
3549// versus subtarget features accepted in the target attribute because the
3550// bitfield structure that's initialized in the runtime only supports the
3551// below currently rather than the full range of subtarget features. (See
3552// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3553bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3554 return llvm::StringSwitch<bool>(FeatureStr)
3555 .Case("cmov", true)
3556 .Case("mmx", true)
3557 .Case("popcnt", true)
3558 .Case("sse", true)
3559 .Case("sse2", true)
3560 .Case("sse3", true)
3561 .Case("sse4.1", true)
3562 .Case("sse4.2", true)
3563 .Case("avx", true)
3564 .Case("avx2", true)
3565 .Case("sse4a", true)
3566 .Case("fma4", true)
3567 .Case("xop", true)
3568 .Case("fma", true)
3569 .Case("avx512f", true)
3570 .Case("bmi", true)
3571 .Case("bmi2", true)
3572 .Default(false);
3573}
3574
Eli Friedman3fd920a2008-08-20 02:34:37 +00003575bool
Anders Carlsson58436352009-02-28 17:11:49 +00003576X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003577 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003578 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003579 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003580 // Constant constraints.
3581 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3582 // instructions.
3583 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3584 // x86_64 instructions.
3585 case 's':
3586 Info.setRequiresImmediate();
3587 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003588 case 'I':
3589 Info.setRequiresImmediate(0, 31);
3590 return true;
3591 case 'J':
3592 Info.setRequiresImmediate(0, 63);
3593 return true;
3594 case 'K':
3595 Info.setRequiresImmediate(-128, 127);
3596 return true;
3597 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003598 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003599 return true;
3600 case 'M':
3601 Info.setRequiresImmediate(0, 3);
3602 return true;
3603 case 'N':
3604 Info.setRequiresImmediate(0, 255);
3605 return true;
3606 case 'O':
3607 Info.setRequiresImmediate(0, 127);
3608 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003609 // Register constraints.
3610 case 'Y': // 'Y' is the first character for several 2-character constraints.
3611 // Shift the pointer to the second character of the constraint.
3612 Name++;
3613 switch (*Name) {
3614 default:
3615 return false;
3616 case '0': // First SSE register.
3617 case 't': // Any SSE register, when SSE2 is enabled.
3618 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3619 case 'm': // Any MMX register, when inter-unit moves enabled.
3620 Info.setAllowsRegister();
3621 return true;
3622 }
3623 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003624 // Constraint 'f' cannot be used for output operands.
3625 if (Info.ConstraintStr[0] == '=')
3626 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003627 Info.setAllowsRegister();
3628 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003629 case 'a': // eax.
3630 case 'b': // ebx.
3631 case 'c': // ecx.
3632 case 'd': // edx.
3633 case 'S': // esi.
3634 case 'D': // edi.
3635 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003636 case 't': // Top of floating point stack.
3637 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003638 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003639 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003640 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003641 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003642 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3643 case 'l': // "Index" registers: any general register that can be used as an
3644 // index in a base+index memory access.
3645 Info.setAllowsRegister();
3646 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003647 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003648 case 'C': // SSE floating point constant.
3649 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003650 return true;
3651 }
3652}
3653
Akira Hatanaka974131e2014-09-18 18:17:18 +00003654bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3655 unsigned Size) const {
3656 // Strip off constraint modifiers.
3657 while (Constraint[0] == '=' ||
3658 Constraint[0] == '+' ||
3659 Constraint[0] == '&')
3660 Constraint = Constraint.substr(1);
3661
3662 return validateOperandSize(Constraint, Size);
3663}
3664
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003665bool X86TargetInfo::validateInputSize(StringRef Constraint,
3666 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003667 return validateOperandSize(Constraint, Size);
3668}
3669
3670bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3671 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003672 switch (Constraint[0]) {
3673 default: break;
3674 case 'y':
3675 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003676 case 'f':
3677 case 't':
3678 case 'u':
3679 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003680 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003681 if (SSELevel >= AVX512F)
3682 // 512-bit zmm registers can be used if target supports AVX512F.
3683 return Size <= 512U;
3684 else if (SSELevel >= AVX)
3685 // 256-bit ymm registers can be used if target supports AVX.
3686 return Size <= 256U;
3687 return Size <= 128U;
3688 case 'Y':
3689 // 'Y' is the first character for several 2-character constraints.
3690 switch (Constraint[1]) {
3691 default: break;
3692 case 'm':
3693 // 'Ym' is synonymous with 'y'.
3694 return Size <= 64;
3695 case 'i':
3696 case 't':
3697 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3698 if (SSELevel >= AVX512F)
3699 return Size <= 512U;
3700 else if (SSELevel >= AVX)
3701 return Size <= 256U;
3702 return SSELevel >= SSE2 && Size <= 128U;
3703 }
3704
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003705 }
3706
3707 return true;
3708}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003709
Eli Friedman3fd920a2008-08-20 02:34:37 +00003710std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003711X86TargetInfo::convertConstraint(const char *&Constraint) const {
3712 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003713 case 'a': return std::string("{ax}");
3714 case 'b': return std::string("{bx}");
3715 case 'c': return std::string("{cx}");
3716 case 'd': return std::string("{dx}");
3717 case 'S': return std::string("{si}");
3718 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003719 case 'p': // address
3720 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003721 case 't': // top of floating point stack.
3722 return std::string("{st}");
3723 case 'u': // second from top of floating point stack.
3724 return std::string("{st(1)}"); // second from top of floating point stack.
3725 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003726 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003727 }
3728}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003729
Eli Friedman3fd920a2008-08-20 02:34:37 +00003730// X86-32 generic target
3731class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003732public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003733 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003734 DoubleAlign = LongLongAlign = 32;
3735 LongDoubleWidth = 96;
3736 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003737 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003738 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003739 SizeType = UnsignedInt;
3740 PtrDiffType = SignedInt;
3741 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003742 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003743
3744 // Use fpret for all types.
3745 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3746 (1 << TargetInfo::Double) |
3747 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003748
3749 // x86-32 has atomics up to 8 bytes
3750 // FIXME: Check that we actually have cmpxchg8b before setting
3751 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3752 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003753 }
Craig Topper3164f332014-03-11 03:39:26 +00003754 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003755 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003756 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003757
Craig Topper3164f332014-03-11 03:39:26 +00003758 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003759 if (RegNo == 0) return 0;
3760 if (RegNo == 1) return 2;
3761 return -1;
3762 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003763 bool validateOperandSize(StringRef Constraint,
3764 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003765 switch (Constraint[0]) {
3766 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003767 case 'R':
3768 case 'q':
3769 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003770 case 'a':
3771 case 'b':
3772 case 'c':
3773 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003774 case 'S':
3775 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003776 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003777 case 'A':
3778 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003779 }
3780
Akira Hatanaka974131e2014-09-18 18:17:18 +00003781 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003782 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003783};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003784
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003785class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3786public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003787 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3788 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003789
Craig Topper3164f332014-03-11 03:39:26 +00003790 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003791 unsigned Major, Minor, Micro;
3792 getTriple().getOSVersion(Major, Minor, Micro);
3793 // New NetBSD uses the default rounding mode.
3794 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3795 return X86_32TargetInfo::getFloatEvalMethod();
3796 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003797 return 1;
3798 }
3799};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003800
Eli Friedmane3aa4542009-07-05 18:47:56 +00003801class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3802public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003803 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3804 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003805 SizeType = UnsignedLong;
3806 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003807 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003808 }
3809};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003810
Eli Friedman9fa28852012-08-08 23:57:20 +00003811class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3812public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003813 BitrigI386TargetInfo(const llvm::Triple &Triple)
3814 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003815 SizeType = UnsignedLong;
3816 IntPtrType = SignedLong;
3817 PtrDiffType = SignedLong;
3818 }
3819};
Eli Friedman9fa28852012-08-08 23:57:20 +00003820
Torok Edwinb2b37c62009-06-30 17:10:35 +00003821class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003822public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003823 DarwinI386TargetInfo(const llvm::Triple &Triple)
3824 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003825 LongDoubleWidth = 128;
3826 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003827 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003828 MaxVectorAlign = 256;
3829 // The watchOS simulator uses the builtin bool type for Objective-C.
3830 llvm::Triple T = llvm::Triple(Triple);
3831 if (T.isWatchOS())
3832 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003833 SizeType = UnsignedLong;
3834 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003835 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003836 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003837 }
3838
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003839 bool handleTargetFeatures(std::vector<std::string> &Features,
3840 DiagnosticsEngine &Diags) override {
3841 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3842 Diags))
3843 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003844 // We now know the features we have: we can decide how to align vectors.
3845 MaxVectorAlign =
3846 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003847 return true;
3848 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003849};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003850
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003851// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003852class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003853public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003854 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3855 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003856 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003857 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003858 bool IsWinCOFF =
3859 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003860 DataLayoutString = IsWinCOFF
3861 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3862 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003863 }
Craig Topper3164f332014-03-11 03:39:26 +00003864 void getTargetDefines(const LangOptions &Opts,
3865 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003866 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3867 }
3868};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003869
3870// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003871class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003872public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003873 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003874 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003875 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003876 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3877 }
Craig Topper3164f332014-03-11 03:39:26 +00003878 void getTargetDefines(const LangOptions &Opts,
3879 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003880 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3881 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3882 // The value of the following reflects processor type.
3883 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3884 // We lost the original triple, so we use the default.
3885 Builder.defineMacro("_M_IX86", "600");
3886 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003887};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003888
David Majnemerae1ed0e2015-05-28 04:36:18 +00003889static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003890 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3891 // supports __declspec natively under -fms-extensions, but we define a no-op
3892 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003893 if (Opts.MicrosoftExt)
3894 Builder.defineMacro("__declspec", "__declspec");
3895 else
3896 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3897
3898 if (!Opts.MicrosoftExt) {
3899 // Provide macros for all the calling convention keywords. Provide both
3900 // single and double underscore prefixed variants. These are available on
3901 // x64 as well as x86, even though they have no effect.
3902 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3903 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003904 std::string GCCSpelling = "__attribute__((__";
3905 GCCSpelling += CC;
3906 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003907 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3908 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3909 }
3910 }
3911}
3912
David Majnemerae1ed0e2015-05-28 04:36:18 +00003913static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3914 Builder.defineMacro("__MSVCRT__");
3915 Builder.defineMacro("__MINGW32__");
3916 addCygMingDefines(Opts, Builder);
3917}
3918
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003919// x86-32 MinGW target
3920class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3921public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003922 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003923 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003924 void getTargetDefines(const LangOptions &Opts,
3925 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003926 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003927 DefineStd(Builder, "WIN32", Opts);
3928 DefineStd(Builder, "WINNT", Opts);
3929 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003930 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003931 }
3932};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003933
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003934// x86-32 Cygwin target
3935class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3936public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003937 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3938 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003939 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003940 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003941 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 +00003942 }
Craig Topper3164f332014-03-11 03:39:26 +00003943 void getTargetDefines(const LangOptions &Opts,
3944 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003945 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003946 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003947 Builder.defineMacro("__CYGWIN__");
3948 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003949 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003950 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003951 if (Opts.CPlusPlus)
3952 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003953 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003954};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003955
Chris Lattnerb986aba2010-04-11 19:29:39 +00003956// x86-32 Haiku target
3957class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3958public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003959 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003960 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003961 IntPtrType = SignedLong;
3962 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003963 ProcessIDType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003964 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003965 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003966 }
Craig Topper3164f332014-03-11 03:39:26 +00003967 void getTargetDefines(const LangOptions &Opts,
3968 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003969 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3970 Builder.defineMacro("__INTEL__");
3971 Builder.defineMacro("__HAIKU__");
3972 }
3973};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003974
Alexey Bataevc99b0492015-11-25 09:24:26 +00003975// X86-32 MCU target
3976class MCUX86_32TargetInfo : public X86_32TargetInfo {
3977public:
3978 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3979 LongDoubleWidth = 64;
3980 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Andrey Turetskiy8170bab2016-02-10 12:56:10 +00003981 DataLayoutString =
3982 "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 +00003983 UserLabelPrefix = "";
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00003984 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003985 }
3986
3987 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3988 // On MCU we support only C calling convention.
3989 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3990 }
3991
3992 void getTargetDefines(const LangOptions &Opts,
3993 MacroBuilder &Builder) const override {
3994 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3995 Builder.defineMacro("__iamcu");
3996 Builder.defineMacro("__iamcu__");
3997 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00003998
3999 bool allowsLargerPreferedTypeAlignment() const override {
4000 return false;
4001 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004002};
4003
Douglas Gregor9fabd852011-07-01 22:41:14 +00004004// RTEMS Target
4005template<typename Target>
4006class RTEMSTargetInfo : public OSTargetInfo<Target> {
4007protected:
Craig Topper3164f332014-03-11 03:39:26 +00004008 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4009 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004010 // RTEMS defines; list based off of gcc output
4011
Douglas Gregor9fabd852011-07-01 22:41:14 +00004012 Builder.defineMacro("__rtems__");
4013 Builder.defineMacro("__ELF__");
4014 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004015
Douglas Gregor9fabd852011-07-01 22:41:14 +00004016public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004017 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +00004018 this->UserLabelPrefix = "";
4019
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004020 switch (Triple.getArch()) {
4021 default:
4022 case llvm::Triple::x86:
4023 // this->MCountName = ".mcount";
4024 break;
4025 case llvm::Triple::mips:
4026 case llvm::Triple::mipsel:
4027 case llvm::Triple::ppc:
4028 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004029 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004030 // this->MCountName = "_mcount";
4031 break;
4032 case llvm::Triple::arm:
4033 // this->MCountName = "__mcount";
4034 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004035 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004036 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004037};
4038
Douglas Gregor9fabd852011-07-01 22:41:14 +00004039// x86-32 RTEMS target
4040class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4041public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004042 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004043 SizeType = UnsignedLong;
4044 IntPtrType = SignedLong;
4045 PtrDiffType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00004046 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00004047 }
Craig Topper3164f332014-03-11 03:39:26 +00004048 void getTargetDefines(const LangOptions &Opts,
4049 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004050 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4051 Builder.defineMacro("__INTEL__");
4052 Builder.defineMacro("__rtems__");
4053 }
4054};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004055
Eli Friedman3fd920a2008-08-20 02:34:37 +00004056// x86-64 generic target
4057class X86_64TargetInfo : public X86TargetInfo {
4058public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004059 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004060 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004061 bool IsWinCOFF =
4062 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004063 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004064 LongDoubleWidth = 128;
4065 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004066 LargeArrayMinWidth = 128;
4067 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004068 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004069 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4070 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4071 IntPtrType = IsX32 ? SignedInt : SignedLong;
4072 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004073 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004074 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004075
Eric Christopher917e9522014-11-18 22:36:15 +00004076 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00004077 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4078 : IsWinCOFF
4079 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4080 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004081
4082 // Use fpret only for long double.
4083 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004084
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004085 // Use fp2ret for _Complex long double.
4086 ComplexLongDoubleUsesFP2Ret = true;
4087
Charles Davisc7d5c942015-09-17 20:55:33 +00004088 // Make __builtin_ms_va_list available.
4089 HasBuiltinMSVaList = true;
4090
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004091 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004092 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004093 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004094 }
Craig Topper3164f332014-03-11 03:39:26 +00004095 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004096 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004097 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004098
Craig Topper3164f332014-03-11 03:39:26 +00004099 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004100 if (RegNo == 0) return 0;
4101 if (RegNo == 1) return 1;
4102 return -1;
4103 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004104
Craig Topper3164f332014-03-11 03:39:26 +00004105 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00004106 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00004107 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00004108 CC == CC_IntelOclBicc ||
4109 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004110 }
4111
Craig Topper3164f332014-03-11 03:39:26 +00004112 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004113 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004114 }
4115
Pavel Chupinfd223e12014-08-04 12:39:43 +00004116 // for x32 we need it here explicitly
4117 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004118 unsigned getUnwindWordWidth() const override { return 64; }
4119 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004120
4121 bool validateGlobalRegisterVariable(StringRef RegName,
4122 unsigned RegSize,
4123 bool &HasSizeMismatch) const override {
4124 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4125 // handle.
4126 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4127 // Check that the register size is 64-bit.
4128 HasSizeMismatch = RegSize != 64;
4129 return true;
4130 }
4131
4132 // Check if the register is a 32-bit register the backend can handle.
4133 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4134 HasSizeMismatch);
4135 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004136};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004137
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004138// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004139class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004140public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004141 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4142 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004143 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004144 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004145 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004146 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004147 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004148 SizeType = UnsignedLongLong;
4149 PtrDiffType = SignedLongLong;
4150 IntPtrType = SignedLongLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00004151 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004152 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004153
Craig Topper3164f332014-03-11 03:39:26 +00004154 void getTargetDefines(const LangOptions &Opts,
4155 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004156 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004157 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004158 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004159
Craig Topper3164f332014-03-11 03:39:26 +00004160 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004161 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004162 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004163
Craig Topper3164f332014-03-11 03:39:26 +00004164 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004165 switch (CC) {
4166 case CC_X86StdCall:
4167 case CC_X86ThisCall:
4168 case CC_X86FastCall:
4169 return CCCR_Ignore;
4170 case CC_C:
4171 case CC_X86VectorCall:
4172 case CC_IntelOclBicc:
4173 case CC_X86_64SysV:
4174 return CCCR_OK;
4175 default:
4176 return CCCR_Warning;
4177 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004178 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004180
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004181// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004182class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004183public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004184 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004185 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004186 LongDoubleWidth = LongDoubleAlign = 64;
4187 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004188 }
Craig Topper3164f332014-03-11 03:39:26 +00004189 void getTargetDefines(const LangOptions &Opts,
4190 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004191 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4192 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004193 Builder.defineMacro("_M_X64", "100");
4194 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004195 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004196};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004197
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004198// x86-64 MinGW target
4199class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4200public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004201 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004202 : WindowsX86_64TargetInfo(Triple) {
4203 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4204 // with x86 FP ops. Weird.
4205 LongDoubleWidth = LongDoubleAlign = 128;
4206 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4207 }
4208
Craig Topper3164f332014-03-11 03:39:26 +00004209 void getTargetDefines(const LangOptions &Opts,
4210 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004211 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004212 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004213 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004214 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004215
4216 // GCC defines this macro when it is using __gxx_personality_seh0.
4217 if (!Opts.SjLjExceptions)
4218 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004219 }
4220};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004221
Yaron Kerend030d112015-07-22 17:38:19 +00004222// x86-64 Cygwin target
4223class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4224public:
4225 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4226 : X86_64TargetInfo(Triple) {
4227 TLSSupported = false;
4228 WCharType = UnsignedShort;
4229 }
4230 void getTargetDefines(const LangOptions &Opts,
4231 MacroBuilder &Builder) const override {
4232 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4233 Builder.defineMacro("__x86_64__");
4234 Builder.defineMacro("__CYGWIN__");
4235 Builder.defineMacro("__CYGWIN64__");
4236 addCygMingDefines(Opts, Builder);
4237 DefineStd(Builder, "unix", Opts);
4238 if (Opts.CPlusPlus)
4239 Builder.defineMacro("_GNU_SOURCE");
4240
4241 // GCC defines this macro when it is using __gxx_personality_seh0.
4242 if (!Opts.SjLjExceptions)
4243 Builder.defineMacro("__SEH__");
4244 }
4245};
4246
Eli Friedman2857ccb2009-07-01 03:36:11 +00004247class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4248public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004249 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4250 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004251 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004252 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4253 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004254 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004255 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004256 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004257 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004258
4259 bool handleTargetFeatures(std::vector<std::string> &Features,
4260 DiagnosticsEngine &Diags) override {
4261 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4262 Diags))
4263 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004264 // We now know the features we have: we can decide how to align vectors.
4265 MaxVectorAlign =
4266 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004267 return true;
4268 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004269};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004270
Eli Friedman245f2292009-07-05 22:31:18 +00004271class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4272public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004273 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4274 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004275 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004276 Int64Type = SignedLongLong;
4277 }
4278};
Eli Friedman245f2292009-07-05 22:31:18 +00004279
Eli Friedman9fa28852012-08-08 23:57:20 +00004280class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4281public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004282 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4283 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4284 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004285 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004286 }
4287};
Tim Northover9bb857a2013-01-31 12:13:10 +00004288
Eli Friedmanf05b7722008-08-20 07:44:10 +00004289class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004290 // Possible FPU choices.
4291 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004292 VFP2FPU = (1 << 0),
4293 VFP3FPU = (1 << 1),
4294 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004295 NeonFPU = (1 << 3),
4296 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004297 };
4298
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004299 // Possible HWDiv features.
4300 enum HWDivMode {
4301 HWDivThumb = (1 << 0),
4302 HWDivARM = (1 << 1)
4303 };
4304
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004305 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004306 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004307 }
4308
4309 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4310 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004311
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004312 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004313
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004314 StringRef CPUProfile;
4315 StringRef CPUAttr;
4316
Rafael Espindolaeb265472013-08-21 21:59:03 +00004317 enum {
4318 FP_Default,
4319 FP_VFP,
4320 FP_Neon
4321 } FPMath;
4322
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004323 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004324 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004325 unsigned ArchProfile;
4326 unsigned ArchVersion;
4327
Bernard Ogdenda13af32013-10-24 18:32:51 +00004328 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004329
Logan Chien57086ce2012-10-10 06:56:20 +00004330 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004331 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004332
4333 // Initialized via features.
4334 unsigned SoftFloat : 1;
4335 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004336
Bernard Ogden18b57012013-10-29 09:47:51 +00004337 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004338 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004339 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004340 unsigned Unaligned : 1;
4341
4342 enum {
4343 LDREX_B = (1 << 0), /// byte (8-bit)
4344 LDREX_H = (1 << 1), /// half (16-bit)
4345 LDREX_W = (1 << 2), /// word (32-bit)
4346 LDREX_D = (1 << 3), /// double (64-bit)
4347 };
4348
4349 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004350
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004351 // ACLE 6.5.1 Hardware floating point
4352 enum {
4353 HW_FP_HP = (1 << 1), /// half (16-bit)
4354 HW_FP_SP = (1 << 2), /// single (32-bit)
4355 HW_FP_DP = (1 << 3), /// double (64-bit)
4356 };
4357 uint32_t HW_FP;
4358
Chris Lattner5cc15e02010-03-03 19:03:45 +00004359 static const Builtin::Info BuiltinInfo[];
4360
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004361 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004362 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004363
4364 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004365 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004366
Renato Golin9ba39232015-02-27 16:35:48 +00004367 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4368 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4369 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004370 SizeType = UnsignedLong;
4371 else
4372 SizeType = UnsignedInt;
4373
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004374 switch (T.getOS()) {
4375 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004376 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004377 break;
4378 case llvm::Triple::Win32:
4379 WCharType = UnsignedShort;
4380 break;
4381 case llvm::Triple::Linux:
4382 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004383 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4384 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004385 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004386 }
4387
4388 UseBitFieldTypeAlignment = true;
4389
4390 ZeroLengthBitfieldBoundary = 0;
4391
Tim Northover147cd2f2014-10-14 22:12:21 +00004392 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4393 // so set preferred for small types to 32.
4394 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004395 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004396 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4397 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4398 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004399 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004400 DataLayoutString = "e"
4401 "-m:w"
4402 "-p:32:32"
4403 "-i64:64"
4404 "-v128:64:128"
4405 "-a:0:32"
4406 "-n32"
4407 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004408 } else if (T.isOSNaCl()) {
4409 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004410 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004411 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004412 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004413 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4414 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004415 }
4416
4417 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004418 }
4419
Tim Northover5627d392015-10-30 16:30:45 +00004420 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004421 const llvm::Triple &T = getTriple();
4422
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004423 IsAAPCS = false;
4424
Tim Northover5627d392015-10-30 16:30:45 +00004425 if (IsAAPCS16)
4426 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4427 else
4428 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004429
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004430 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004431 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004432 SizeType = UnsignedInt;
4433 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004434 SizeType = UnsignedLong;
4435
4436 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4437 WCharType = SignedInt;
4438
4439 // Do not respect the alignment of bit-field types when laying out
4440 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4441 UseBitFieldTypeAlignment = false;
4442
4443 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4444 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4445 /// gcc.
4446 ZeroLengthBitfieldBoundary = 32;
4447
Tim Northover5627d392015-10-30 16:30:45 +00004448 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4449 assert(!BigEndian && "AAPCS16 does not support big-endian");
4450 DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128";
4451 } else if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004452 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004453 BigEndian
4454 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4455 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4456 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004457 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004458 BigEndian
4459 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4460 : "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 +00004461
4462 // FIXME: Override "preferred align" for double and long long.
4463 }
4464
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004465 void setArchInfo() {
4466 StringRef ArchName = getTriple().getArchName();
4467
Renato Goline84b0002015-10-08 16:43:26 +00004468 ArchISA = llvm::ARM::parseArchISA(ArchName);
4469 CPU = llvm::ARM::getDefaultCPU(ArchName);
4470 unsigned AK = llvm::ARM::parseArch(ArchName);
4471 if (AK != llvm::ARM::AK_INVALID)
4472 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004473 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004474 }
4475
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004476 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004477 StringRef SubArch;
4478
4479 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004480 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004481 SubArch = llvm::ARM::getSubArch(ArchKind);
4482 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4483 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004484
4485 // cache CPU related strings
4486 CPUAttr = getCPUAttr();
4487 CPUProfile = getCPUProfile();
4488 }
4489
4490 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004491 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004492 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004493 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004494 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4495 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004496 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004497 if (ArchProfile == llvm::ARM::PK_M) {
4498 MaxAtomicPromoteWidth = 32;
4499 if (ShouldUseInlineAtomic)
4500 MaxAtomicInlineWidth = 32;
4501 }
4502 else {
4503 MaxAtomicPromoteWidth = 64;
4504 if (ShouldUseInlineAtomic)
4505 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004506 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004507 }
4508
4509 bool isThumb() const {
4510 return (ArchISA == llvm::ARM::IK_THUMB);
4511 }
4512
4513 bool supportsThumb() const {
4514 return CPUAttr.count('T') || ArchVersion >= 6;
4515 }
4516
4517 bool supportsThumb2() const {
4518 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4519 }
4520
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004521 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004522 // For most sub-arches, the build attribute CPU name is enough.
4523 // For Cortex variants, it's slightly different.
4524 switch(ArchKind) {
4525 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004526 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004527 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004528 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004529 case llvm::ARM::AK_ARMV7S:
4530 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004531 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004532 return "7A";
4533 case llvm::ARM::AK_ARMV7R:
4534 return "7R";
4535 case llvm::ARM::AK_ARMV7M:
4536 return "7M";
4537 case llvm::ARM::AK_ARMV7EM:
4538 return "7EM";
4539 case llvm::ARM::AK_ARMV8A:
4540 return "8A";
4541 case llvm::ARM::AK_ARMV8_1A:
4542 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004543 case llvm::ARM::AK_ARMV8_2A:
4544 return "8_2A";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004545 }
4546 }
4547
4548 StringRef getCPUProfile() const {
4549 switch(ArchProfile) {
4550 case llvm::ARM::PK_A:
4551 return "A";
4552 case llvm::ARM::PK_R:
4553 return "R";
4554 case llvm::ARM::PK_M:
4555 return "M";
4556 default:
4557 return "";
4558 }
4559 }
4560
Chris Lattner17df24e2008-04-21 18:56:49 +00004561public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004562 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004563 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004564 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004565 BigEndian = IsBigEndian;
4566
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004567 switch (getTriple().getOS()) {
4568 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004569 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004570 break;
4571 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004572 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004573 break;
4574 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004575
Renato Goline84b0002015-10-08 16:43:26 +00004576 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004577 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004578
Chris Lattner1a8f3942010-04-23 16:29:58 +00004579 // {} in inline assembly are neon specifiers, not assembly variant
4580 // specifiers.
4581 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004582
Eric Christopher0e261882014-12-05 01:06:59 +00004583 // FIXME: This duplicates code from the driver that sets the -target-abi
4584 // option - this code is used if -target-abi isn't passed and should
4585 // be unified in some way.
4586 if (Triple.isOSBinFormatMachO()) {
4587 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4588 // the frontend matches that.
4589 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4590 Triple.getOS() == llvm::Triple::UnknownOS ||
4591 StringRef(CPU).startswith("cortex-m")) {
4592 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004593 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004594 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004595 } else {
4596 setABI("apcs-gnu");
4597 }
4598 } else if (Triple.isOSWindows()) {
4599 // FIXME: this is invalid for WindowsCE
4600 setABI("aapcs");
4601 } else {
4602 // Select the default based on the platform.
4603 switch (Triple.getEnvironment()) {
4604 case llvm::Triple::Android:
4605 case llvm::Triple::GNUEABI:
4606 case llvm::Triple::GNUEABIHF:
4607 setABI("aapcs-linux");
4608 break;
4609 case llvm::Triple::EABIHF:
4610 case llvm::Triple::EABI:
4611 setABI("aapcs");
4612 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004613 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004614 setABI("apcs-gnu");
4615 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004616 default:
4617 if (Triple.getOS() == llvm::Triple::NetBSD)
4618 setABI("apcs-gnu");
4619 else
4620 setABI("aapcs");
4621 break;
4622 }
4623 }
John McCall86353412010-08-21 22:46:04 +00004624
4625 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004626 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004627
Renato Golin15b86152015-07-03 16:41:13 +00004628 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004629 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004630
James Molloya7139222012-03-12 09:14:10 +00004631 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004632 // the alignment of the zero-length bitfield is greater than the member
4633 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004634 // zero length bitfield.
4635 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004636 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004637
Alp Toker4925ba72014-06-07 23:30:42 +00004638 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004639
Craig Topper3164f332014-03-11 03:39:26 +00004640 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004641 ABI = Name;
4642
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004643 // The defaults (above) are for AAPCS, check if we need to change them.
4644 //
4645 // FIXME: We need support for -meabi... we could just mangle it into the
4646 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004647 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004648 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004649 return true;
4650 }
4651 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4652 setABIAAPCS();
4653 return true;
4654 }
4655 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004656 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004657
Renato Golinf5c4dec2015-05-27 13:33:00 +00004658 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004659 bool
4660 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4661 StringRef CPU,
4662 const std::vector<std::string> &FeaturesVec) const override {
4663
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004664 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004665 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004666
4667 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004668 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004669 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4670
4671 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004672 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004673 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4674
4675 for (const char *Feature : TargetFeatures)
4676 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004677 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004678
Eric Christopher007b0a02015-08-28 22:32:01 +00004679 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004680 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004681
Craig Topper3164f332014-03-11 03:39:26 +00004682 bool handleTargetFeatures(std::vector<std::string> &Features,
4683 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004684 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004685 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004686 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004687 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004688 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004689 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004690 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004691
Ranjeet Singhac08e532015-06-24 23:39:25 +00004692 // This does not diagnose illegal cases like having both
4693 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4694 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004695 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004696 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004697 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004698 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004699 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004700 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004701 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004702 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004703 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004704 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004705 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004706 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004707 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004708 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004709 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004710 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004711 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004712 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004713 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004714 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004715 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004716 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004717 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004718 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004719 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004720 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004721 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004722 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004723 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004724 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004725 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004726 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004727 } else if (Feature == "+strict-align") {
4728 Unaligned = 0;
4729 } else if (Feature == "+fp16") {
4730 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004731 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004732 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004733 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004734
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004735 switch (ArchVersion) {
4736 case 6:
4737 if (ArchProfile == llvm::ARM::PK_M)
4738 LDREX = 0;
4739 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4740 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4741 else
4742 LDREX = LDREX_W;
4743 break;
4744 case 7:
4745 if (ArchProfile == llvm::ARM::PK_M)
4746 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4747 else
4748 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4749 break;
4750 case 8:
4751 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4752 }
4753
Rafael Espindolaeb265472013-08-21 21:59:03 +00004754 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4755 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4756 return false;
4757 }
4758
4759 if (FPMath == FP_Neon)
4760 Features.push_back("+neonfp");
4761 else if (FPMath == FP_VFP)
4762 Features.push_back("-neonfp");
4763
Daniel Dunbar893d4752009-12-19 04:15:38 +00004764 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004765 auto Feature =
4766 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4767 if (Feature != Features.end())
4768 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004769
Rafael Espindolaeb265472013-08-21 21:59:03 +00004770 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004771 }
4772
Craig Topper3164f332014-03-11 03:39:26 +00004773 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004774 return llvm::StringSwitch<bool>(Feature)
4775 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004776 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004777 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004778 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004779 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004780 .Case("hwdiv", HWDiv & HWDivThumb)
4781 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004782 .Default(false);
4783 }
Renato Golin15b86152015-07-03 16:41:13 +00004784
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004785 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004786 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004787 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004788
Renato Golin15b86152015-07-03 16:41:13 +00004789 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004790 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004792 CPU = Name;
4793 return true;
4794 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795
Craig Topper3164f332014-03-11 03:39:26 +00004796 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004797
Craig Topper3164f332014-03-11 03:39:26 +00004798 void getTargetDefines(const LangOptions &Opts,
4799 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004800 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004801 Builder.defineMacro("__arm");
4802 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004803
Chris Lattnerecd49032009-03-02 22:27:17 +00004804 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004805 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004806
4807 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4808 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004809 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004810 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4811
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004812 if (!CPUAttr.empty())
4813 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004814
4815 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004816 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004817 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004818
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004819 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004820 // ACLE 6.5.7 Crypto Extension
4821 if (Crypto)
4822 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4823 // ACLE 6.5.8 CRC32 Extension
4824 if (CRC)
4825 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4826 // ACLE 6.5.10 Numeric Maximum and Minimum
4827 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4828 // ACLE 6.5.9 Directed Rounding
4829 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004830 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004831
4832 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4833 // is not defined for the M-profile.
4834 // NOTE that the deffault profile is assumed to be 'A'
4835 if (CPUProfile.empty() || CPUProfile != "M")
4836 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4837
4838 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4839 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4840 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004841 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004842 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004843 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004844 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4845
4846 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4847 // instruction set such as ARM or Thumb.
4848 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4849
4850 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4851
4852 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004853 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004854 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004855
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004856 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004857 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004858 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004859
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004860 // ACLE 6.4.4 LDREX/STREX
4861 if (LDREX)
4862 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4863
4864 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004865 if (ArchVersion == 5 ||
4866 (ArchVersion == 6 && CPUProfile != "M") ||
4867 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004868 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4869
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004870 // ACLE 6.5.1 Hardware Floating Point
4871 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004872 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004873
Yi Konga44c4d72014-06-27 21:25:42 +00004874 // ACLE predefines.
4875 Builder.defineMacro("__ARM_ACLE", "200");
4876
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004877 // FP16 support (we currently only support IEEE format).
4878 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4879 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4880
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004881 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4882 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4883 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4884
Mike Stump9d54bd72009-04-08 02:07:04 +00004885 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004886
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004887 // FIXME: It's more complicated than this and we don't really support
4888 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004889 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004890 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004891 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004892
David Tweed8f676532012-10-25 13:33:01 +00004893 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004894 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004895 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4896 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004897 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004898 Builder.defineMacro("__ARM_PCS", "1");
4899
David Tweed8f676532012-10-25 13:33:01 +00004900 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004901 Builder.defineMacro("__ARM_PCS_VFP", "1");
4902 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004903
Daniel Dunbar893d4752009-12-19 04:15:38 +00004904 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004905 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004906
4907 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004908 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004909
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004910 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004911 Builder.defineMacro("__THUMBEL__");
4912 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004913 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004914 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004915 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004916
4917 // ACLE 6.4.9 32-bit SIMD instructions
4918 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4919 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4920
4921 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004922 if (((HWDiv & HWDivThumb) && isThumb()) ||
4923 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004924 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004925 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004926 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004927
4928 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004929 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004930
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004931 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004932 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004933 if (FPU & VFP2FPU)
4934 Builder.defineMacro("__ARM_VFPV2__");
4935 if (FPU & VFP3FPU)
4936 Builder.defineMacro("__ARM_VFPV3__");
4937 if (FPU & VFP4FPU)
4938 Builder.defineMacro("__ARM_VFPV4__");
4939 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004940
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004941 // This only gets set when Neon instructions are actually available, unlike
4942 // the VFP define, hence the soft float and arch check. This is subtly
4943 // different from gcc, we follow the intent which was that it should be set
4944 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004945 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004946 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004947 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004948 // current AArch32 NEON implementations do not support double-precision
4949 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004950 Builder.defineMacro("__ARM_NEON_FP",
4951 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004952 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004953
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004954 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4955 Opts.ShortWChar ? "2" : "4");
4956
4957 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4958 Opts.ShortEnums ? "1" : "4");
4959
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004960 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4962 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4963 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4964 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4965 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004966
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004967 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004968 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004969 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004970 }
4971
4972 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004973 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004974 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4975 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004976 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004977 }
4978
4979 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004980 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004981 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004982
4983 if (Opts.UnsafeFPMath)
4984 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004985
4986 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4987 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004988 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004989
Craig Topper6c03a542015-10-19 04:51:35 +00004990 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4991 return llvm::makeArrayRef(BuiltinInfo,
4992 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004993 }
Craig Topper3164f332014-03-11 03:39:26 +00004994 bool isCLZForZeroUndef() const override { return false; }
4995 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004996 return IsAAPCS
4997 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00004998 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
4999 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005000 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005001 ArrayRef<const char *> getGCCRegNames() const override;
5002 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005003 bool validateAsmConstraint(const char *&Name,
5004 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005005 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005006 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005007 case 'l': // r0-r7
5008 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005009 case 't': // VFP Floating point register single precision
5010 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005011 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005012 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005013 case 'I':
5014 case 'J':
5015 case 'K':
5016 case 'L':
5017 case 'M':
5018 // FIXME
5019 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005020 case 'Q': // A memory address that is a single base register.
5021 Info.setAllowsMemory();
5022 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005023 case 'U': // a memory reference...
5024 switch (Name[1]) {
5025 case 'q': // ...ARMV4 ldrsb
5026 case 'v': // ...VFP load/store (reg+constant offset)
5027 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005028 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005029 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005030 case 'n': // valid address for Neon doubleword vector load/store
5031 case 'm': // valid address for Neon element and structure load/store
5032 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005033 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005034 Info.setAllowsMemory();
5035 Name++;
5036 return true;
5037 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005038 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005039 return false;
5040 }
Craig Topper3164f332014-03-11 03:39:26 +00005041 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005042 std::string R;
5043 switch (*Constraint) {
5044 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005045 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005046 Constraint++;
5047 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005048 case 'p': // 'p' should be translated to 'r' by default.
5049 R = std::string("r");
5050 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005051 default:
5052 return std::string(1, *Constraint);
5053 }
5054 return R;
5055 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005056 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005057 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005058 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005059 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005060 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005061
Bill Wendling9d1ee112012-10-25 23:28:48 +00005062 // Strip off constraint modifiers.
5063 while (Constraint[0] == '=' ||
5064 Constraint[0] == '+' ||
5065 Constraint[0] == '&')
5066 Constraint = Constraint.substr(1);
5067
5068 switch (Constraint[0]) {
5069 default: break;
5070 case 'r': {
5071 switch (Modifier) {
5072 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005073 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005074 case 'q':
5075 // A register of size 32 cannot fit a vector type.
5076 return false;
5077 }
5078 }
5079 }
5080
5081 return true;
5082 }
Craig Topper3164f332014-03-11 03:39:26 +00005083 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005084 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005085 return "";
5086 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005087
Craig Topper3164f332014-03-11 03:39:26 +00005088 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005089 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
5090 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005091
Craig Topper3164f332014-03-11 03:39:26 +00005092 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005093 if (RegNo == 0) return 0;
5094 if (RegNo == 1) return 1;
5095 return -1;
5096 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005097
5098 bool hasSjLjLowering() const override {
5099 return true;
5100 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005101};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005102
Rafael Espindolaeb265472013-08-21 21:59:03 +00005103bool ARMTargetInfo::setFPMath(StringRef Name) {
5104 if (Name == "neon") {
5105 FPMath = FP_Neon;
5106 return true;
5107 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5108 Name == "vfp4") {
5109 FPMath = FP_VFP;
5110 return true;
5111 }
5112 return false;
5113}
5114
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005115const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005116 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005117 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005118 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5119
5120 // Float registers
5121 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5122 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5123 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005124 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005125
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005126 // Double registers
5127 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5128 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005129 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5130 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005131
5132 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005133 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5134 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005135};
5136
Craig Topperf054e3a2015-10-19 03:52:27 +00005137ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5138 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005139}
5140
5141const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005142 { { "a1" }, "r0" },
5143 { { "a2" }, "r1" },
5144 { { "a3" }, "r2" },
5145 { { "a4" }, "r3" },
5146 { { "v1" }, "r4" },
5147 { { "v2" }, "r5" },
5148 { { "v3" }, "r6" },
5149 { { "v4" }, "r7" },
5150 { { "v5" }, "r8" },
5151 { { "v6", "rfp" }, "r9" },
5152 { { "sl" }, "r10" },
5153 { { "fp" }, "r11" },
5154 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005155 { { "r13" }, "sp" },
5156 { { "r14" }, "lr" },
5157 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005158 // The S, D and Q registers overlap, but aren't really aliases; we
5159 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005160};
5161
Craig Topperf054e3a2015-10-19 03:52:27 +00005162ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5163 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005164}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005165
5166const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005167#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005168 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005169#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5170 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005171#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005172
Craig Topper07d3b622015-08-07 05:14:44 +00005173#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005174 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005175#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005176 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005177#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5178 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005179#include "clang/Basic/BuiltinsARM.def"
5180};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005181
5182class ARMleTargetInfo : public ARMTargetInfo {
5183public:
5184 ARMleTargetInfo(const llvm::Triple &Triple)
5185 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005186 void getTargetDefines(const LangOptions &Opts,
5187 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005188 Builder.defineMacro("__ARMEL__");
5189 ARMTargetInfo::getTargetDefines(Opts, Builder);
5190 }
5191};
5192
5193class ARMbeTargetInfo : public ARMTargetInfo {
5194public:
5195 ARMbeTargetInfo(const llvm::Triple &Triple)
5196 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005197 void getTargetDefines(const LangOptions &Opts,
5198 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005199 Builder.defineMacro("__ARMEB__");
5200 Builder.defineMacro("__ARM_BIG_ENDIAN");
5201 ARMTargetInfo::getTargetDefines(Opts, Builder);
5202 }
5203};
Chris Lattner17df24e2008-04-21 18:56:49 +00005204
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005205class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5206 const llvm::Triple Triple;
5207public:
5208 WindowsARMTargetInfo(const llvm::Triple &Triple)
5209 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005210 WCharType = UnsignedShort;
5211 SizeType = UnsignedInt;
James Y Knighta3518ad2016-01-27 01:04:51 +00005212 UserLabelPrefix = "";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005213 }
5214 void getVisualStudioDefines(const LangOptions &Opts,
5215 MacroBuilder &Builder) const {
5216 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5217
5218 // FIXME: this is invalid for WindowsCE
5219 Builder.defineMacro("_M_ARM_NT", "1");
5220 Builder.defineMacro("_M_ARMT", "_M_ARM");
5221 Builder.defineMacro("_M_THUMB", "_M_ARM");
5222
5223 assert((Triple.getArch() == llvm::Triple::arm ||
5224 Triple.getArch() == llvm::Triple::thumb) &&
5225 "invalid architecture for Windows ARM target info");
5226 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5227 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5228
5229 // TODO map the complete set of values
5230 // 31: VFPv3 40: VFPv4
5231 Builder.defineMacro("_M_ARM_FP", "31");
5232 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005233 BuiltinVaListKind getBuiltinVaListKind() const override {
5234 return TargetInfo::CharPtrBuiltinVaList;
5235 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005236 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5237 switch (CC) {
5238 case CC_X86StdCall:
5239 case CC_X86ThisCall:
5240 case CC_X86FastCall:
5241 case CC_X86VectorCall:
5242 return CCCR_Ignore;
5243 case CC_C:
5244 return CCCR_OK;
5245 default:
5246 return CCCR_Warning;
5247 }
5248 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005249};
5250
5251// Windows ARM + Itanium C++ ABI Target
5252class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5253public:
5254 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5255 : WindowsARMTargetInfo(Triple) {
5256 TheCXXABI.set(TargetCXXABI::GenericARM);
5257 }
5258
5259 void getTargetDefines(const LangOptions &Opts,
5260 MacroBuilder &Builder) const override {
5261 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5262
5263 if (Opts.MSVCCompat)
5264 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5265 }
5266};
5267
5268// Windows ARM, MS (C++) ABI
5269class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5270public:
5271 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5272 : WindowsARMTargetInfo(Triple) {
5273 TheCXXABI.set(TargetCXXABI::Microsoft);
5274 }
5275
5276 void getTargetDefines(const LangOptions &Opts,
5277 MacroBuilder &Builder) const override {
5278 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5279 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5280 }
5281};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005282
Yaron Keren321249c2015-07-15 13:32:23 +00005283// ARM MinGW target
5284class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5285public:
5286 MinGWARMTargetInfo(const llvm::Triple &Triple)
5287 : WindowsARMTargetInfo(Triple) {
5288 TheCXXABI.set(TargetCXXABI::GenericARM);
5289 }
5290
5291 void getTargetDefines(const LangOptions &Opts,
5292 MacroBuilder &Builder) const override {
5293 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5294 DefineStd(Builder, "WIN32", Opts);
5295 DefineStd(Builder, "WINNT", Opts);
5296 Builder.defineMacro("_ARM_");
5297 addMinGWDefines(Opts, Builder);
5298 }
5299};
5300
5301// ARM Cygwin target
5302class CygwinARMTargetInfo : public ARMleTargetInfo {
5303public:
5304 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5305 TLSSupported = false;
5306 WCharType = UnsignedShort;
5307 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005308 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005309 }
5310 void getTargetDefines(const LangOptions &Opts,
5311 MacroBuilder &Builder) const override {
5312 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5313 Builder.defineMacro("_ARM_");
5314 Builder.defineMacro("__CYGWIN__");
5315 Builder.defineMacro("__CYGWIN32__");
5316 DefineStd(Builder, "unix", Opts);
5317 if (Opts.CPlusPlus)
5318 Builder.defineMacro("_GNU_SOURCE");
5319 }
5320};
5321
Mike Stump11289f42009-09-09 15:08:12 +00005322class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005323 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005324protected:
Craig Topper3164f332014-03-11 03:39:26 +00005325 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5326 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005327 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005328 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005329
Torok Edwinb2b37c62009-06-30 17:10:35 +00005330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005331 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005332 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005333 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005334 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005335 // FIXME: This should be based off of the target features in
5336 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005337 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005338
Tim Northoverd88ecb32016-01-27 19:32:40 +00005339 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005340 // Darwin on iOS uses a variant of the ARM C++ ABI.
5341 TheCXXABI.set(TargetCXXABI::WatchOS);
5342
5343 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5344 // size_t is long, it's a bit weird for it to be int.
5345 PtrDiffType = SignedLong;
5346
5347 // BOOL should be a real boolean on the new ABI
5348 UseSignedCharForObjCBool = false;
5349 } else
5350 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005351 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005352};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005353
Tim Northover573cbee2014-05-24 12:52:07 +00005354class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005355 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005356 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5357 static const char *const GCCRegNames[];
5358
James Molloy75f5f9e2014-04-16 15:33:48 +00005359 enum FPUModeEnum {
5360 FPUMode,
5361 NeonMode
5362 };
5363
5364 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005365 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005366 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005367 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005368 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005369
Tim Northovera2ee4332014-03-29 15:09:45 +00005370 static const Builtin::Info BuiltinInfo[];
5371
5372 std::string ABI;
5373
5374public:
Tim Northover573cbee2014-05-24 12:52:07 +00005375 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005376 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005377
5378 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5379 WCharType = SignedInt;
5380
5381 // NetBSD apparently prefers consistency across ARM targets to consistency
5382 // across 64-bit targets.
5383 Int64Type = SignedLongLong;
5384 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005385 } else {
5386 WCharType = UnsignedInt;
5387 Int64Type = SignedLong;
5388 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005389 }
5390
Tim Northovera2ee4332014-03-29 15:09:45 +00005391 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005392 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005393 MaxAtomicInlineWidth = 128;
5394 MaxAtomicPromoteWidth = 128;
5395
Tim Northovera6a19f12015-02-06 01:25:07 +00005396 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005397 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5398
Tim Northovera2ee4332014-03-29 15:09:45 +00005399 // {} in inline assembly are neon specifiers, not assembly variant
5400 // specifiers.
5401 NoAsmVariants = true;
5402
Tim Northover7ad87af2015-01-16 18:44:04 +00005403 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5404 // contributes to the alignment of the containing aggregate in the same way
5405 // a plain (non bit-field) member of that type would, without exception for
5406 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005407 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005408 UseZeroLengthBitfieldAlignment = true;
5409
Tim Northover573cbee2014-05-24 12:52:07 +00005410 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005411 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5412 }
5413
Alp Toker4925ba72014-06-07 23:30:42 +00005414 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005415 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005416 if (Name != "aapcs" && Name != "darwinpcs")
5417 return false;
5418
5419 ABI = Name;
5420 return true;
5421 }
5422
David Blaikie1cbb9712014-11-14 19:09:44 +00005423 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005424 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005425 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005426 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5427 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005428 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005429 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005430 .Default(false);
5431 return CPUKnown;
5432 }
5433
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005434 void getTargetDefines(const LangOptions &Opts,
5435 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005436 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005437 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005438
5439 // Target properties.
5440 Builder.defineMacro("_LP64");
5441 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005442
5443 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5444 Builder.defineMacro("__ARM_ACLE", "200");
5445 Builder.defineMacro("__ARM_ARCH", "8");
5446 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5447
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005448 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005449 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005450 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005451
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005452 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5453 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5454 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5455 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005456 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005457 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5458 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005459
5460 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5461
5462 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005463 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005464
5465 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5466 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005467 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5468 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005469
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005470 if (Opts.UnsafeFPMath)
5471 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005472
5473 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5474
5475 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5476 Opts.ShortEnums ? "1" : "4");
5477
James Molloy75f5f9e2014-04-16 15:33:48 +00005478 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005479 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005480 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005481 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005482 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005483
Bradley Smith418c5932014-05-02 15:17:51 +00005484 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005485 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005486
James Molloy75f5f9e2014-04-16 15:33:48 +00005487 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005488 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5489
5490 if (Unaligned)
5491 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005492
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005493 if (V8_1A)
5494 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5495
Reid Klecknerd167d422015-05-06 15:31:46 +00005496 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5497 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5498 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5499 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5500 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005501 }
5502
Craig Topper6c03a542015-10-19 04:51:35 +00005503 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5504 return llvm::makeArrayRef(BuiltinInfo,
5505 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005506 }
5507
David Blaikie1cbb9712014-11-14 19:09:44 +00005508 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005509 return Feature == "aarch64" ||
5510 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005511 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005512 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005513 }
5514
James Molloy5e73df52014-04-16 15:06:20 +00005515 bool handleTargetFeatures(std::vector<std::string> &Features,
5516 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005517 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005518 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005519 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005520 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005521 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005522
Eric Christopher610fe112015-08-26 08:21:55 +00005523 for (const auto &Feature : Features) {
5524 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005525 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005526 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005527 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005528 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005529 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005530 if (Feature == "+strict-align")
5531 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005532 if (Feature == "+v8.1a")
5533 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005534 }
5535
Eric Christopher964a5f32015-08-05 23:48:05 +00005536 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005537
5538 return true;
5539 }
5540
David Blaikie1cbb9712014-11-14 19:09:44 +00005541 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005542
David Blaikie1cbb9712014-11-14 19:09:44 +00005543 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005544 return TargetInfo::AArch64ABIBuiltinVaList;
5545 }
5546
Craig Topperf054e3a2015-10-19 03:52:27 +00005547 ArrayRef<const char *> getGCCRegNames() const override;
5548 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005549
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005550 bool validateAsmConstraint(const char *&Name,
5551 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005552 switch (*Name) {
5553 default:
5554 return false;
5555 case 'w': // Floating point and SIMD registers (V0-V31)
5556 Info.setAllowsRegister();
5557 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005558 case 'I': // Constant that can be used with an ADD instruction
5559 case 'J': // Constant that can be used with a SUB instruction
5560 case 'K': // Constant that can be used with a 32-bit logical instruction
5561 case 'L': // Constant that can be used with a 64-bit logical instruction
5562 case 'M': // Constant that can be used as a 32-bit MOV immediate
5563 case 'N': // Constant that can be used as a 64-bit MOV immediate
5564 case 'Y': // Floating point constant zero
5565 case 'Z': // Integer constant zero
5566 return true;
5567 case 'Q': // A memory reference with base register and no offset
5568 Info.setAllowsMemory();
5569 return true;
5570 case 'S': // A symbolic address
5571 Info.setAllowsRegister();
5572 return true;
5573 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005574 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5575 // Utf: A memory address suitable for ldp/stp in TF mode.
5576 // Usa: An absolute symbolic address.
5577 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5578 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005579 case 'z': // Zero register, wzr or xzr
5580 Info.setAllowsRegister();
5581 return true;
5582 case 'x': // Floating point and SIMD registers (V0-V15)
5583 Info.setAllowsRegister();
5584 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005585 }
5586 return false;
5587 }
5588
Akira Hatanaka987f1862014-08-22 06:05:21 +00005589 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005590 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005591 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005592 // Strip off constraint modifiers.
5593 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5594 Constraint = Constraint.substr(1);
5595
5596 switch (Constraint[0]) {
5597 default:
5598 return true;
5599 case 'z':
5600 case 'r': {
5601 switch (Modifier) {
5602 case 'x':
5603 case 'w':
5604 // For now assume that the person knows what they're
5605 // doing with the modifier.
5606 return true;
5607 default:
5608 // By default an 'r' constraint will be in the 'x'
5609 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005610 if (Size == 64)
5611 return true;
5612
5613 SuggestedModifier = "w";
5614 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005615 }
5616 }
5617 }
5618 }
5619
David Blaikie1cbb9712014-11-14 19:09:44 +00005620 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005621
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005622 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005623 if (RegNo == 0)
5624 return 0;
5625 if (RegNo == 1)
5626 return 1;
5627 return -1;
5628 }
5629};
5630
Tim Northover573cbee2014-05-24 12:52:07 +00005631const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005632 // 32-bit Integer registers
5633 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5634 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5635 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5636
5637 // 64-bit Integer registers
5638 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5639 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5640 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5641
5642 // 32-bit floating point regsisters
5643 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5644 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5645 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5646
5647 // 64-bit floating point regsisters
5648 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5649 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5650 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5651
5652 // Vector registers
5653 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5654 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5655 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5656};
5657
Craig Topperf054e3a2015-10-19 03:52:27 +00005658ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5659 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005660}
5661
Tim Northover573cbee2014-05-24 12:52:07 +00005662const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005663 { { "w31" }, "wsp" },
5664 { { "x29" }, "fp" },
5665 { { "x30" }, "lr" },
5666 { { "x31" }, "sp" },
5667 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5668 // don't want to substitute one of these for a different-sized one.
5669};
5670
Craig Topperf054e3a2015-10-19 03:52:27 +00005671ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5672 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005673}
5674
Tim Northover573cbee2014-05-24 12:52:07 +00005675const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005676#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005677 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005678#include "clang/Basic/BuiltinsNEON.def"
5679
5680#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005681 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005682#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005683};
James Molloy5e73df52014-04-16 15:06:20 +00005684
Tim Northover573cbee2014-05-24 12:52:07 +00005685class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005686 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005687 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005688 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005689 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005690 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005691 }
5692
5693public:
Tim Northover573cbee2014-05-24 12:52:07 +00005694 AArch64leTargetInfo(const llvm::Triple &Triple)
5695 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005696 BigEndian = false;
5697 }
5698 void getTargetDefines(const LangOptions &Opts,
5699 MacroBuilder &Builder) const override {
5700 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005701 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005702 }
5703};
5704
Tim Northover573cbee2014-05-24 12:52:07 +00005705class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005706 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005707 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005708 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005709 }
5710
5711public:
Tim Northover573cbee2014-05-24 12:52:07 +00005712 AArch64beTargetInfo(const llvm::Triple &Triple)
5713 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005714 void getTargetDefines(const LangOptions &Opts,
5715 MacroBuilder &Builder) const override {
5716 Builder.defineMacro("__AARCH64EB__");
5717 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5718 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005719 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005720 }
5721};
Tim Northovera2ee4332014-03-29 15:09:45 +00005722
Tim Northover573cbee2014-05-24 12:52:07 +00005723class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005724protected:
5725 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5726 MacroBuilder &Builder) const override {
5727 Builder.defineMacro("__AARCH64_SIMD__");
5728 Builder.defineMacro("__ARM64_ARCH_8__");
5729 Builder.defineMacro("__ARM_NEON__");
5730 Builder.defineMacro("__LITTLE_ENDIAN__");
5731 Builder.defineMacro("__REGISTER_PREFIX__", "");
5732 Builder.defineMacro("__arm64", "1");
5733 Builder.defineMacro("__arm64__", "1");
5734
5735 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5736 }
5737
Tim Northovera2ee4332014-03-29 15:09:45 +00005738public:
Tim Northover573cbee2014-05-24 12:52:07 +00005739 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5740 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005741 Int64Type = SignedLongLong;
5742 WCharType = SignedInt;
5743 UseSignedCharForObjCBool = false;
5744
Tim Northovera6a19f12015-02-06 01:25:07 +00005745 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005746 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5747
5748 TheCXXABI.set(TargetCXXABI::iOS64);
5749 }
5750
David Blaikie1cbb9712014-11-14 19:09:44 +00005751 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005752 return TargetInfo::CharPtrBuiltinVaList;
5753 }
5754};
Tim Northovera2ee4332014-03-29 15:09:45 +00005755
Tony Linthicum76329bf2011-12-12 21:14:55 +00005756// Hexagon abstract base class
5757class HexagonTargetInfo : public TargetInfo {
5758 static const Builtin::Info BuiltinInfo[];
5759 static const char * const GCCRegNames[];
5760 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5761 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005762 bool HasHVX, HasHVXDouble;
5763
Tony Linthicum76329bf2011-12-12 21:14:55 +00005764public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005765 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005766 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005767 // Specify the vector alignment explicitly. For v512x1, the calculated
5768 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5769 // the required minimum of 64 bytes.
5770 DataLayoutString = "e-m:e-p:32:32:32-a:0-n16:32-"
5771 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
5772 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048";
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005773 SizeType = UnsignedInt;
5774 PtrDiffType = SignedInt;
5775 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005776
5777 // {} in inline assembly are packet specifiers, not assembly variant
5778 // specifiers.
5779 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005780
5781 LargeArrayMinWidth = 64;
5782 LargeArrayAlign = 64;
5783 UseBitFieldTypeAlignment = true;
5784 ZeroLengthBitfieldBoundary = 32;
5785 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005786 }
5787
Craig Topper6c03a542015-10-19 04:51:35 +00005788 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5789 return llvm::makeArrayRef(BuiltinInfo,
5790 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005791 }
5792
Craig Topper3164f332014-03-11 03:39:26 +00005793 bool validateAsmConstraint(const char *&Name,
5794 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005795 return true;
5796 }
5797
Craig Topper3164f332014-03-11 03:39:26 +00005798 void getTargetDefines(const LangOptions &Opts,
5799 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005800
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005801 bool isCLZForZeroUndef() const override { return false; }
5802
Craig Topper3164f332014-03-11 03:39:26 +00005803 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005804 return llvm::StringSwitch<bool>(Feature)
5805 .Case("hexagon", true)
5806 .Case("hvx", HasHVX)
5807 .Case("hvx-double", HasHVXDouble)
5808 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005809 }
Craig Topper3164f332014-03-11 03:39:26 +00005810
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005811 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5812 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5813 const override;
5814
5815 bool handleTargetFeatures(std::vector<std::string> &Features,
5816 DiagnosticsEngine &Diags) override;
5817
Craig Topper3164f332014-03-11 03:39:26 +00005818 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005819 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005820 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005821 ArrayRef<const char *> getGCCRegNames() const override;
5822 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005823 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005824 return "";
5825 }
Sebastian Pop86500282012-01-13 20:37:10 +00005826
5827 static const char *getHexagonCPUSuffix(StringRef Name) {
5828 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005829 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005830 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005831 .Case("hexagonv55", "55")
5832 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005833 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005834 }
5835
Craig Topper3164f332014-03-11 03:39:26 +00005836 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005837 if (!getHexagonCPUSuffix(Name))
5838 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005839 CPU = Name;
5840 return true;
5841 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005842
5843 int getEHDataRegisterNumber(unsigned RegNo) const override {
5844 return RegNo < 2 ? RegNo : -1;
5845 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005846};
5847
5848void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005849 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005850 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005851 Builder.defineMacro("__hexagon__", "1");
5852
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005853 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005854 Builder.defineMacro("__HEXAGON_V4__");
5855 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005856 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005857 Builder.defineMacro("__QDSP6_V4__");
5858 Builder.defineMacro("__QDSP6_ARCH__", "4");
5859 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005860 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005861 Builder.defineMacro("__HEXAGON_V5__");
5862 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5863 if(Opts.HexagonQdsp6Compat) {
5864 Builder.defineMacro("__QDSP6_V5__");
5865 Builder.defineMacro("__QDSP6_ARCH__", "5");
5866 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005867 } else if (CPU == "hexagonv60") {
5868 Builder.defineMacro("__HEXAGON_V60__");
5869 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5870 Builder.defineMacro("__QDSP6_V60__");
5871 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005872 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005873}
5874
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005875bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5876 DiagnosticsEngine &Diags) {
5877 for (auto &F : Features) {
5878 if (F == "+hvx")
5879 HasHVX = true;
5880 else if (F == "-hvx")
5881 HasHVX = HasHVXDouble = false;
5882 else if (F == "+hvx-double")
5883 HasHVX = HasHVXDouble = true;
5884 else if (F == "-hvx-double")
5885 HasHVXDouble = false;
5886 }
5887 return true;
5888}
5889
5890bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5891 DiagnosticsEngine &Diags, StringRef CPU,
5892 const std::vector<std::string> &FeaturesVec) const {
5893 // Default for v60: -hvx, -hvx-double.
5894 Features["hvx"] = false;
5895 Features["hvx-double"] = false;
5896
5897 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5898}
5899
5900
5901const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005902 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5903 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5904 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5905 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5906 "p0", "p1", "p2", "p3",
5907 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5908};
5909
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005910ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005911 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005912}
5913
Tony Linthicum76329bf2011-12-12 21:14:55 +00005914const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5915 { { "sp" }, "r29" },
5916 { { "fp" }, "r30" },
5917 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005918};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005919
Craig Topperf054e3a2015-10-19 03:52:27 +00005920ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5921 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005922}
5923
5924
5925const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005926#define BUILTIN(ID, TYPE, ATTRS) \
5927 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5928#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5929 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005930#include "clang/Basic/BuiltinsHexagon.def"
5931};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005932
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005933// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5934class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005935 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5936 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005937 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005938public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005939 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005940 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005941
Craig Topper3164f332014-03-11 03:39:26 +00005942 bool handleTargetFeatures(std::vector<std::string> &Features,
5943 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005944 // The backend doesn't actually handle soft float yet, but in case someone
5945 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005946 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5947 if (Feature != Features.end()) {
5948 SoftFloat = true;
5949 Features.erase(Feature);
5950 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005951 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005952 }
Craig Topper3164f332014-03-11 03:39:26 +00005953 void getTargetDefines(const LangOptions &Opts,
5954 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005955 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005956 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005957
5958 if (SoftFloat)
5959 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005960 }
Craig Topper3164f332014-03-11 03:39:26 +00005961
5962 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005963 return llvm::StringSwitch<bool>(Feature)
5964 .Case("softfloat", SoftFloat)
5965 .Case("sparc", true)
5966 .Default(false);
5967 }
Craig Topper3164f332014-03-11 03:39:26 +00005968
Craig Topper6c03a542015-10-19 04:51:35 +00005969 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005970 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005971 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005972 }
Craig Topper3164f332014-03-11 03:39:26 +00005973 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005974 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005975 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005976 ArrayRef<const char *> getGCCRegNames() const override;
5977 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005978 bool validateAsmConstraint(const char *&Name,
5979 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005980 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005981 switch (*Name) {
5982 case 'I': // Signed 13-bit constant
5983 case 'J': // Zero
5984 case 'K': // 32-bit constant with the low 12 bits clear
5985 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5986 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5987 case 'N': // Same as 'K' but zext (required for SIMode)
5988 case 'O': // The constant 4096
5989 return true;
5990 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005991 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005992 }
Craig Topper3164f332014-03-11 03:39:26 +00005993 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005994 // FIXME: Implement!
5995 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005996 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005997
5998 // No Sparc V7 for now, the backend doesn't support it anyway.
5999 enum CPUKind {
6000 CK_GENERIC,
6001 CK_V8,
6002 CK_SUPERSPARC,
6003 CK_SPARCLITE,
6004 CK_F934,
6005 CK_HYPERSPARC,
6006 CK_SPARCLITE86X,
6007 CK_SPARCLET,
6008 CK_TSC701,
6009 CK_V9,
6010 CK_ULTRASPARC,
6011 CK_ULTRASPARC3,
6012 CK_NIAGARA,
6013 CK_NIAGARA2,
6014 CK_NIAGARA3,
6015 CK_NIAGARA4
6016 } CPU = CK_GENERIC;
6017
6018 enum CPUGeneration {
6019 CG_V8,
6020 CG_V9,
6021 };
6022
6023 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6024 switch (Kind) {
6025 case CK_GENERIC:
6026 case CK_V8:
6027 case CK_SUPERSPARC:
6028 case CK_SPARCLITE:
6029 case CK_F934:
6030 case CK_HYPERSPARC:
6031 case CK_SPARCLITE86X:
6032 case CK_SPARCLET:
6033 case CK_TSC701:
6034 return CG_V8;
6035 case CK_V9:
6036 case CK_ULTRASPARC:
6037 case CK_ULTRASPARC3:
6038 case CK_NIAGARA:
6039 case CK_NIAGARA2:
6040 case CK_NIAGARA3:
6041 case CK_NIAGARA4:
6042 return CG_V9;
6043 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006044 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006045 }
6046
6047 CPUKind getCPUKind(StringRef Name) const {
6048 return llvm::StringSwitch<CPUKind>(Name)
6049 .Case("v8", CK_V8)
6050 .Case("supersparc", CK_SUPERSPARC)
6051 .Case("sparclite", CK_SPARCLITE)
6052 .Case("f934", CK_F934)
6053 .Case("hypersparc", CK_HYPERSPARC)
6054 .Case("sparclite86x", CK_SPARCLITE86X)
6055 .Case("sparclet", CK_SPARCLET)
6056 .Case("tsc701", CK_TSC701)
6057 .Case("v9", CK_V9)
6058 .Case("ultrasparc", CK_ULTRASPARC)
6059 .Case("ultrasparc3", CK_ULTRASPARC3)
6060 .Case("niagara", CK_NIAGARA)
6061 .Case("niagara2", CK_NIAGARA2)
6062 .Case("niagara3", CK_NIAGARA3)
6063 .Case("niagara4", CK_NIAGARA4)
6064 .Default(CK_GENERIC);
6065 }
6066
6067 bool setCPU(const std::string &Name) override {
6068 CPU = getCPUKind(Name);
6069 return CPU != CK_GENERIC;
6070 }
Gabor Greif49991682008-02-21 16:29:08 +00006071};
6072
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006073const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006074 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6075 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6076 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6077 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6078};
6079
Craig Topperf054e3a2015-10-19 03:52:27 +00006080ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6081 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006082}
6083
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006084const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006085 { { "g0" }, "r0" },
6086 { { "g1" }, "r1" },
6087 { { "g2" }, "r2" },
6088 { { "g3" }, "r3" },
6089 { { "g4" }, "r4" },
6090 { { "g5" }, "r5" },
6091 { { "g6" }, "r6" },
6092 { { "g7" }, "r7" },
6093 { { "o0" }, "r8" },
6094 { { "o1" }, "r9" },
6095 { { "o2" }, "r10" },
6096 { { "o3" }, "r11" },
6097 { { "o4" }, "r12" },
6098 { { "o5" }, "r13" },
6099 { { "o6", "sp" }, "r14" },
6100 { { "o7" }, "r15" },
6101 { { "l0" }, "r16" },
6102 { { "l1" }, "r17" },
6103 { { "l2" }, "r18" },
6104 { { "l3" }, "r19" },
6105 { { "l4" }, "r20" },
6106 { { "l5" }, "r21" },
6107 { { "l6" }, "r22" },
6108 { { "l7" }, "r23" },
6109 { { "i0" }, "r24" },
6110 { { "i1" }, "r25" },
6111 { { "i2" }, "r26" },
6112 { { "i3" }, "r27" },
6113 { { "i4" }, "r28" },
6114 { { "i5" }, "r29" },
6115 { { "i6", "fp" }, "r30" },
6116 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006117};
6118
Craig Topperf054e3a2015-10-19 03:52:27 +00006119ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6120 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006121}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006122
6123// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6124class SparcV8TargetInfo : public SparcTargetInfo {
6125public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006126 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006127 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00006128 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6129 switch (getTriple().getOS()) {
6130 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006131 SizeType = UnsignedInt;
6132 IntPtrType = SignedInt;
6133 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006134 break;
6135 case llvm::Triple::NetBSD:
6136 case llvm::Triple::OpenBSD:
6137 SizeType = UnsignedLong;
6138 IntPtrType = SignedLong;
6139 PtrDiffType = SignedLong;
6140 break;
Brad Smith56495d52015-08-13 22:00:53 +00006141 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006142 }
6143
Craig Topper3164f332014-03-11 03:39:26 +00006144 void getTargetDefines(const LangOptions &Opts,
6145 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006146 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006147 switch (getCPUGeneration(CPU)) {
6148 case CG_V8:
6149 Builder.defineMacro("__sparcv8");
6150 if (getTriple().getOS() != llvm::Triple::Solaris)
6151 Builder.defineMacro("__sparcv8__");
6152 break;
6153 case CG_V9:
6154 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006155 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006156 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006157 Builder.defineMacro("__sparc_v9__");
6158 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006159 break;
6160 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006161 }
6162};
6163
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006164// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6165class SparcV8elTargetInfo : public SparcV8TargetInfo {
6166 public:
6167 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006168 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006169 BigEndian = false;
6170 }
6171};
6172
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006173// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6174class SparcV9TargetInfo : public SparcTargetInfo {
6175public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006176 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006177 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00006178 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006179 // This is an LP64 platform.
6180 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006181
6182 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006183 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006184 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006185 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006186 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006187 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006188
6189 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6190 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6191 LongDoubleWidth = 128;
6192 LongDoubleAlign = 128;
6193 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006194 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006195 }
6196
Craig Topper3164f332014-03-11 03:39:26 +00006197 void getTargetDefines(const LangOptions &Opts,
6198 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006199 SparcTargetInfo::getTargetDefines(Opts, Builder);
6200 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006201 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006202 // Solaris doesn't need these variants, but the BSDs do.
6203 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006204 Builder.defineMacro("__sparc64__");
6205 Builder.defineMacro("__sparc_v9__");
6206 Builder.defineMacro("__sparcv9__");
6207 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006208 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006209
Craig Topper3164f332014-03-11 03:39:26 +00006210 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006211 if (!SparcTargetInfo::setCPU(Name))
6212 return false;
6213 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006214 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006215};
6216
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006217class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006218 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006219 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006220 std::string CPU;
6221 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006222 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006223
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006224public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006225 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006226 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6227 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006228 IntMaxType = SignedLong;
6229 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006230 TLSSupported = true;
6231 IntWidth = IntAlign = 32;
6232 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6233 PointerWidth = PointerAlign = 64;
6234 LongDoubleWidth = 128;
6235 LongDoubleAlign = 64;
6236 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006237 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006238 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00006239 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 +00006240 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6241 }
6242 void getTargetDefines(const LangOptions &Opts,
6243 MacroBuilder &Builder) const override {
6244 Builder.defineMacro("__s390__");
6245 Builder.defineMacro("__s390x__");
6246 Builder.defineMacro("__zarch__");
6247 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006248
6249 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6250 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6251 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6252 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6253
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006254 if (HasTransactionalExecution)
6255 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006256 if (Opts.ZVector)
6257 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006258 }
Craig Topper6c03a542015-10-19 04:51:35 +00006259 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6260 return llvm::makeArrayRef(BuiltinInfo,
6261 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006262 }
6263
Craig Topperf054e3a2015-10-19 03:52:27 +00006264 ArrayRef<const char *> getGCCRegNames() const override;
6265 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006266 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006267 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006268 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006269 bool validateAsmConstraint(const char *&Name,
6270 TargetInfo::ConstraintInfo &info) const override;
6271 const char *getClobbers() const override {
6272 // FIXME: Is this really right?
6273 return "";
6274 }
6275 BuiltinVaListKind getBuiltinVaListKind() const override {
6276 return TargetInfo::SystemZBuiltinVaList;
6277 }
6278 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006279 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006280 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6281 .Case("z10", true)
6282 .Case("z196", true)
6283 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006284 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006285 .Default(false);
6286
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006287 return CPUKnown;
6288 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006289 bool
6290 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6291 StringRef CPU,
6292 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006293 if (CPU == "zEC12")
6294 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006295 if (CPU == "z13") {
6296 Features["transactional-execution"] = true;
6297 Features["vector"] = true;
6298 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006299 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006300 }
6301
6302 bool handleTargetFeatures(std::vector<std::string> &Features,
6303 DiagnosticsEngine &Diags) override {
6304 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006305 for (const auto &Feature : Features) {
6306 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006307 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006308 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006309 HasVector = true;
6310 }
6311 // If we use the vector ABI, vector types are 64-bit aligned.
6312 if (HasVector) {
6313 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006314 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6315 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006316 }
6317 return true;
6318 }
6319
6320 bool hasFeature(StringRef Feature) const override {
6321 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006322 .Case("systemz", true)
6323 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006324 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006325 .Default(false);
6326 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006327
6328 StringRef getABI() const override {
6329 if (HasVector)
6330 return "vector";
6331 return "";
6332 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006333
6334 bool useFloat128ManglingForLongDouble() const override {
6335 return true;
6336 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006337};
6338
6339const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6340#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006341 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006342#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006343};
6344
6345const char *const SystemZTargetInfo::GCCRegNames[] = {
6346 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6347 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6348 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6349 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6350};
6351
Craig Topperf054e3a2015-10-19 03:52:27 +00006352ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6353 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006354}
6355
6356bool SystemZTargetInfo::
6357validateAsmConstraint(const char *&Name,
6358 TargetInfo::ConstraintInfo &Info) const {
6359 switch (*Name) {
6360 default:
6361 return false;
6362
6363 case 'a': // Address register
6364 case 'd': // Data register (equivalent to 'r')
6365 case 'f': // Floating-point register
6366 Info.setAllowsRegister();
6367 return true;
6368
6369 case 'I': // Unsigned 8-bit constant
6370 case 'J': // Unsigned 12-bit constant
6371 case 'K': // Signed 16-bit constant
6372 case 'L': // Signed 20-bit displacement (on all targets we support)
6373 case 'M': // 0x7fffffff
6374 return true;
6375
6376 case 'Q': // Memory with base and unsigned 12-bit displacement
6377 case 'R': // Likewise, plus an index
6378 case 'S': // Memory with base and signed 20-bit displacement
6379 case 'T': // Likewise, plus an index
6380 Info.setAllowsMemory();
6381 return true;
6382 }
6383}
Ulrich Weigand47445072013-05-06 16:26:41 +00006384
Eric Christopherc48497a2015-09-18 21:26:24 +00006385class MSP430TargetInfo : public TargetInfo {
6386 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006387
Eric Christopherc48497a2015-09-18 21:26:24 +00006388public:
6389 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6390 BigEndian = false;
6391 TLSSupported = false;
6392 IntWidth = 16;
6393 IntAlign = 16;
6394 LongWidth = 32;
6395 LongLongWidth = 64;
6396 LongAlign = LongLongAlign = 16;
6397 PointerWidth = 16;
6398 PointerAlign = 16;
6399 SuitableAlign = 16;
6400 SizeType = UnsignedInt;
6401 IntMaxType = SignedLongLong;
6402 IntPtrType = SignedInt;
6403 PtrDiffType = SignedInt;
6404 SigAtomicType = SignedLong;
6405 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006406 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006407 void getTargetDefines(const LangOptions &Opts,
6408 MacroBuilder &Builder) const override {
6409 Builder.defineMacro("MSP430");
6410 Builder.defineMacro("__MSP430__");
6411 // FIXME: defines for different 'flavours' of MCU
6412 }
Craig Topper6c03a542015-10-19 04:51:35 +00006413 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006414 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006415 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006416 }
6417 bool hasFeature(StringRef Feature) const override {
6418 return Feature == "msp430";
6419 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006420 ArrayRef<const char *> getGCCRegNames() const override;
6421 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006422 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006423 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006424 }
6425 bool validateAsmConstraint(const char *&Name,
6426 TargetInfo::ConstraintInfo &info) const override {
6427 // FIXME: implement
6428 switch (*Name) {
6429 case 'K': // the constant 1
6430 case 'L': // constant -1^20 .. 1^19
6431 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006432 return true;
6433 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006434 // No target constraints for now.
6435 return false;
6436 }
6437 const char *getClobbers() const override {
6438 // FIXME: Is this really right?
6439 return "";
6440 }
6441 BuiltinVaListKind getBuiltinVaListKind() const override {
6442 // FIXME: implement
6443 return TargetInfo::CharPtrBuiltinVaList;
6444 }
6445};
6446
6447const char *const MSP430TargetInfo::GCCRegNames[] = {
6448 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6449 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6450
Craig Topperf054e3a2015-10-19 03:52:27 +00006451ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6452 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006453}
6454
6455// LLVM and Clang cannot be used directly to output native binaries for
6456// target, but is used to compile C code to llvm bitcode with correct
6457// type and alignment information.
6458//
6459// TCE uses the llvm bitcode as input and uses it for generating customized
6460// target processor and program binary. TCE co-design environment is
6461// publicly available in http://tce.cs.tut.fi
6462
6463static const unsigned TCEOpenCLAddrSpaceMap[] = {
6464 3, // opencl_global
6465 4, // opencl_local
6466 5, // opencl_constant
6467 // FIXME: generic has to be added to the target
6468 0, // opencl_generic
6469 0, // cuda_device
6470 0, // cuda_constant
6471 0 // cuda_shared
6472};
6473
6474class TCETargetInfo : public TargetInfo {
6475public:
6476 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6477 TLSSupported = false;
6478 IntWidth = 32;
6479 LongWidth = LongLongWidth = 32;
6480 PointerWidth = 32;
6481 IntAlign = 32;
6482 LongAlign = LongLongAlign = 32;
6483 PointerAlign = 32;
6484 SuitableAlign = 32;
6485 SizeType = UnsignedInt;
6486 IntMaxType = SignedLong;
6487 IntPtrType = SignedInt;
6488 PtrDiffType = SignedInt;
6489 FloatWidth = 32;
6490 FloatAlign = 32;
6491 DoubleWidth = 32;
6492 DoubleAlign = 32;
6493 LongDoubleWidth = 32;
6494 LongDoubleAlign = 32;
6495 FloatFormat = &llvm::APFloat::IEEEsingle;
6496 DoubleFormat = &llvm::APFloat::IEEEsingle;
6497 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6498 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6499 "-f64:32-v64:32-v128:32-a:0:32-n32";
6500 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6501 UseAddrSpaceMapMangling = true;
6502 }
6503
6504 void getTargetDefines(const LangOptions &Opts,
6505 MacroBuilder &Builder) const override {
6506 DefineStd(Builder, "tce", Opts);
6507 Builder.defineMacro("__TCE__");
6508 Builder.defineMacro("__TCE_V1__");
6509 }
6510 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6511
Craig Topper6c03a542015-10-19 04:51:35 +00006512 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006513 const char *getClobbers() const override { return ""; }
6514 BuiltinVaListKind getBuiltinVaListKind() const override {
6515 return TargetInfo::VoidPtrBuiltinVaList;
6516 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006517 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006518 bool validateAsmConstraint(const char *&Name,
6519 TargetInfo::ConstraintInfo &info) const override {
6520 return true;
6521 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006522 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6523 return None;
6524 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006525};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006526
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006527class BPFTargetInfo : public TargetInfo {
6528public:
6529 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6530 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6531 SizeType = UnsignedLong;
6532 PtrDiffType = SignedLong;
6533 IntPtrType = SignedLong;
6534 IntMaxType = SignedLong;
6535 Int64Type = SignedLong;
6536 RegParmMax = 5;
6537 if (Triple.getArch() == llvm::Triple::bpfeb) {
6538 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006539 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006540 } else {
6541 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006542 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006543 }
6544 MaxAtomicPromoteWidth = 64;
6545 MaxAtomicInlineWidth = 64;
6546 TLSSupported = false;
6547 }
6548 void getTargetDefines(const LangOptions &Opts,
6549 MacroBuilder &Builder) const override {
6550 DefineStd(Builder, "bpf", Opts);
6551 Builder.defineMacro("__BPF__");
6552 }
6553 bool hasFeature(StringRef Feature) const override {
6554 return Feature == "bpf";
6555 }
6556
Craig Topper6c03a542015-10-19 04:51:35 +00006557 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006558 const char *getClobbers() const override {
6559 return "";
6560 }
6561 BuiltinVaListKind getBuiltinVaListKind() const override {
6562 return TargetInfo::VoidPtrBuiltinVaList;
6563 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006564 ArrayRef<const char *> getGCCRegNames() const override {
6565 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006566 }
6567 bool validateAsmConstraint(const char *&Name,
6568 TargetInfo::ConstraintInfo &info) const override {
6569 return true;
6570 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006571 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6572 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006573 }
6574};
6575
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006576class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006577 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006578
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006579 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006580 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006581 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006582 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006583 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006584 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006585 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006586 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006587 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006588 enum DspRevEnum {
6589 NoDSP, DSP1, DSP2
6590 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006591 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006592
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006593protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006594 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006595 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006596
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006597public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006598 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6599 const std::string &CPUStr)
6600 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006601 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006602 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6603 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6604 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006605
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006606 bool isNaN2008Default() const {
6607 return CPU == "mips32r6" || CPU == "mips64r6";
6608 }
6609
6610 bool isFP64Default() const {
6611 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6612 }
6613
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006614 bool isNan2008() const override {
6615 return IsNan2008;
6616 }
6617
Alp Toker4925ba72014-06-07 23:30:42 +00006618 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006619 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006620 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6621 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006622 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006623 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006624 .Case("mips1", IsMips32)
6625 .Case("mips2", IsMips32)
6626 .Case("mips3", true)
6627 .Case("mips4", true)
6628 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006629 .Case("mips32", IsMips32)
6630 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006631 .Case("mips32r3", IsMips32)
6632 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006633 .Case("mips32r6", IsMips32)
6634 .Case("mips64", true)
6635 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006636 .Case("mips64r3", true)
6637 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006638 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006639 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006640 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006641 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006642 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006643 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006644 bool
6645 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6646 StringRef CPU,
6647 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006648 if (CPU == "octeon")
6649 Features["mips64r2"] = Features["cnmips"] = true;
6650 else
6651 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006652 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006653 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006654
Craig Topper3164f332014-03-11 03:39:26 +00006655 void getTargetDefines(const LangOptions &Opts,
6656 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006657 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006658 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006659 if (Opts.GNUMode)
6660 Builder.defineMacro("mips");
6661
Simon Atanasyan683535b2012-08-29 19:14:58 +00006662 Builder.defineMacro("__REGISTER_PREFIX__", "");
6663
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006664 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006665 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006666 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006667 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006668 case SoftFloat:
6669 Builder.defineMacro("__mips_soft_float", Twine(1));
6670 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006671 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006672
Simon Atanasyan16071912013-04-14 14:07:30 +00006673 if (IsSingleFloat)
6674 Builder.defineMacro("__mips_single_float", Twine(1));
6675
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006676 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6677 Builder.defineMacro("_MIPS_FPSET",
6678 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6679
Simon Atanasyan72244b62012-07-05 16:06:06 +00006680 if (IsMips16)
6681 Builder.defineMacro("__mips16", Twine(1));
6682
Simon Atanasyan60777612013-04-14 14:07:51 +00006683 if (IsMicromips)
6684 Builder.defineMacro("__mips_micromips", Twine(1));
6685
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006686 if (IsNan2008)
6687 Builder.defineMacro("__mips_nan2008", Twine(1));
6688
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006689 switch (DspRev) {
6690 default:
6691 break;
6692 case DSP1:
6693 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6694 Builder.defineMacro("__mips_dsp", Twine(1));
6695 break;
6696 case DSP2:
6697 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6698 Builder.defineMacro("__mips_dspr2", Twine(1));
6699 Builder.defineMacro("__mips_dsp", Twine(1));
6700 break;
6701 }
6702
Jack Carter44ff1e52013-08-12 17:20:29 +00006703 if (HasMSA)
6704 Builder.defineMacro("__mips_msa", Twine(1));
6705
Simon Atanasyan26f19672012-04-05 19:28:31 +00006706 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6707 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6708 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006709
6710 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6711 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006712
6713 // These shouldn't be defined for MIPS-I but there's no need to check
6714 // for that since MIPS-I isn't supported.
6715 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6716 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6717 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006718 }
6719
Craig Topper6c03a542015-10-19 04:51:35 +00006720 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6721 return llvm::makeArrayRef(BuiltinInfo,
6722 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006723 }
Craig Topper3164f332014-03-11 03:39:26 +00006724 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006725 return llvm::StringSwitch<bool>(Feature)
6726 .Case("mips", true)
6727 .Case("fp64", HasFP64)
6728 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006729 }
Craig Topper3164f332014-03-11 03:39:26 +00006730 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006731 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006732 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006733 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006734 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006735 // CPU register names
6736 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006737 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6738 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6739 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006740 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6741 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006742 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6743 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6744 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6745 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006746 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006747 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006748 "$fcc5","$fcc6","$fcc7",
6749 // MSA register names
6750 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6751 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6752 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6753 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6754 // MSA control register names
6755 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6756 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006757 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006758 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006759 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006760 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006761 bool validateAsmConstraint(const char *&Name,
6762 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006763 switch (*Name) {
6764 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006765 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006766 case 'r': // CPU registers.
6767 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006768 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006769 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006770 case 'c': // $25 for indirect jumps
6771 case 'l': // lo register
6772 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006773 Info.setAllowsRegister();
6774 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006775 case 'I': // Signed 16-bit constant
6776 case 'J': // Integer 0
6777 case 'K': // Unsigned 16-bit constant
6778 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6779 case 'M': // Constants not loadable via lui, addiu, or ori
6780 case 'N': // Constant -1 to -65535
6781 case 'O': // A signed 15-bit constant
6782 case 'P': // A constant between 1 go 65535
6783 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006784 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006785 Info.setAllowsMemory();
6786 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006787 case 'Z':
6788 if (Name[1] == 'C') { // An address usable by ll, and sc.
6789 Info.setAllowsMemory();
6790 Name++; // Skip over 'Z'.
6791 return true;
6792 }
6793 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006794 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006795 }
6796
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006797 std::string convertConstraint(const char *&Constraint) const override {
6798 std::string R;
6799 switch (*Constraint) {
6800 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6801 if (Constraint[1] == 'C') {
6802 R = std::string("^") + std::string(Constraint, 2);
6803 Constraint++;
6804 return R;
6805 }
6806 break;
6807 }
6808 return TargetInfo::convertConstraint(Constraint);
6809 }
6810
Craig Topper3164f332014-03-11 03:39:26 +00006811 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006812 // In GCC, $1 is not widely used in generated code (it's used only in a few
6813 // specific situations), so there is no real need for users to add it to
6814 // the clobbers list if they want to use it in their inline assembly code.
6815 //
6816 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6817 // code generation, so using it in inline assembly without adding it to the
6818 // clobbers list can cause conflicts between the inline assembly code and
6819 // the surrounding generated code.
6820 //
6821 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6822 // operands, which will conflict with the ".set at" assembler option (which
6823 // we use only for inline assembly, in order to maintain compatibility with
6824 // GCC) and will also conflict with the user's usage of $1.
6825 //
6826 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6827 // register for generated code is to automatically clobber $1 for all inline
6828 // assembly code.
6829 //
6830 // FIXME: We should automatically clobber $1 only for inline assembly code
6831 // which actually uses it. This would allow LLVM to use $1 for inline
6832 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006833 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006834 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006835
Craig Topper3164f332014-03-11 03:39:26 +00006836 bool handleTargetFeatures(std::vector<std::string> &Features,
6837 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006838 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006839 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006840 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006841 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006842 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006843 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006844 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006845
Eric Christopher610fe112015-08-26 08:21:55 +00006846 for (const auto &Feature : Features) {
6847 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006848 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006849 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006850 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006851 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006852 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006853 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006854 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006855 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006856 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006857 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006858 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006859 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006860 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006861 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006862 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006863 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006864 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006865 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006866 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006867 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006868 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006869 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006870
Eric Christopher964a5f32015-08-05 23:48:05 +00006871 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006872
Rafael Espindolaeb265472013-08-21 21:59:03 +00006873 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006874 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006875
Craig Topper3164f332014-03-11 03:39:26 +00006876 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006877 if (RegNo == 0) return 4;
6878 if (RegNo == 1) return 5;
6879 return -1;
6880 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006881
6882 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006883};
6884
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006885const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006886#define BUILTIN(ID, TYPE, ATTRS) \
6887 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6888#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6889 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006890#include "clang/Basic/BuiltinsMips.def"
6891};
6892
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006893class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006894public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006895 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006896 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006897 SizeType = UnsignedInt;
6898 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006899 Int64Type = SignedLongLong;
6900 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006901 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006902 }
Craig Topper3164f332014-03-11 03:39:26 +00006903 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006904 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006905 ABI = Name;
6906 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006907 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006908 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006909 }
Craig Topper3164f332014-03-11 03:39:26 +00006910 void getTargetDefines(const LangOptions &Opts,
6911 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006912 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006913
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006914 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006915 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6916
6917 const std::string& CPUStr = getCPU();
6918 if (CPUStr == "mips32")
6919 Builder.defineMacro("__mips_isa_rev", "1");
6920 else if (CPUStr == "mips32r2")
6921 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006922 else if (CPUStr == "mips32r3")
6923 Builder.defineMacro("__mips_isa_rev", "3");
6924 else if (CPUStr == "mips32r5")
6925 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006926 else if (CPUStr == "mips32r6")
6927 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006928
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006929 if (ABI == "o32") {
6930 Builder.defineMacro("__mips_o32");
6931 Builder.defineMacro("_ABIO32", "1");
6932 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6933 }
6934 else if (ABI == "eabi")
6935 Builder.defineMacro("__mips_eabi");
6936 else
David Blaikie83d382b2011-09-23 05:06:16 +00006937 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006938 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006939 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006940 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6941 { { "at" }, "$1" },
6942 { { "v0" }, "$2" },
6943 { { "v1" }, "$3" },
6944 { { "a0" }, "$4" },
6945 { { "a1" }, "$5" },
6946 { { "a2" }, "$6" },
6947 { { "a3" }, "$7" },
6948 { { "t0" }, "$8" },
6949 { { "t1" }, "$9" },
6950 { { "t2" }, "$10" },
6951 { { "t3" }, "$11" },
6952 { { "t4" }, "$12" },
6953 { { "t5" }, "$13" },
6954 { { "t6" }, "$14" },
6955 { { "t7" }, "$15" },
6956 { { "s0" }, "$16" },
6957 { { "s1" }, "$17" },
6958 { { "s2" }, "$18" },
6959 { { "s3" }, "$19" },
6960 { { "s4" }, "$20" },
6961 { { "s5" }, "$21" },
6962 { { "s6" }, "$22" },
6963 { { "s7" }, "$23" },
6964 { { "t8" }, "$24" },
6965 { { "t9" }, "$25" },
6966 { { "k0" }, "$26" },
6967 { { "k1" }, "$27" },
6968 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006969 { { "sp","$sp" }, "$29" },
6970 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006971 { { "ra" }, "$31" }
6972 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006973 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006974 }
6975};
6976
6977class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006978 void setDataLayoutString() override {
6979 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006980 }
6981
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006982public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006983 Mips32EBTargetInfo(const llvm::Triple &Triple)
6984 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006985 }
Craig Topper3164f332014-03-11 03:39:26 +00006986 void getTargetDefines(const LangOptions &Opts,
6987 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006988 DefineStd(Builder, "MIPSEB", Opts);
6989 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006990 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006991 }
6992};
6993
6994class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006995 void setDataLayoutString() override {
6996 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006997 }
6998
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006999public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007000 Mips32ELTargetInfo(const llvm::Triple &Triple)
7001 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007002 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007003 }
Craig Topper3164f332014-03-11 03:39:26 +00007004 void getTargetDefines(const LangOptions &Opts,
7005 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007006 DefineStd(Builder, "MIPSEL", Opts);
7007 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007008 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007009 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007010};
Akira Hatanakabef17452011-09-20 19:21:49 +00007011
7012class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007013public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007014 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007015 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007016 LongDoubleWidth = LongDoubleAlign = 128;
7017 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007018 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7019 LongDoubleWidth = LongDoubleAlign = 64;
7020 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7021 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007022 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007023 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007024 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007025 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007026
7027 void setN64ABITypes() {
7028 LongWidth = LongAlign = 64;
7029 PointerWidth = PointerAlign = 64;
7030 SizeType = UnsignedLong;
7031 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007032 Int64Type = SignedLong;
7033 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007034 }
7035
7036 void setN32ABITypes() {
7037 LongWidth = LongAlign = 32;
7038 PointerWidth = PointerAlign = 32;
7039 SizeType = UnsignedInt;
7040 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007041 Int64Type = SignedLongLong;
7042 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007043 }
7044
Craig Topper3164f332014-03-11 03:39:26 +00007045 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007046 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007047 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007048 ABI = Name;
7049 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007050 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007051 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007052 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007053 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007054 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007055 }
7056 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007057 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007058
Craig Topper3164f332014-03-11 03:39:26 +00007059 void getTargetDefines(const LangOptions &Opts,
7060 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007061 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007062
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007063 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007064 Builder.defineMacro("__mips64");
7065 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007066 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7067
7068 const std::string& CPUStr = getCPU();
7069 if (CPUStr == "mips64")
7070 Builder.defineMacro("__mips_isa_rev", "1");
7071 else if (CPUStr == "mips64r2")
7072 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007073 else if (CPUStr == "mips64r3")
7074 Builder.defineMacro("__mips_isa_rev", "3");
7075 else if (CPUStr == "mips64r5")
7076 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007077 else if (CPUStr == "mips64r6")
7078 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007079
Akira Hatanakabef17452011-09-20 19:21:49 +00007080 if (ABI == "n32") {
7081 Builder.defineMacro("__mips_n32");
7082 Builder.defineMacro("_ABIN32", "2");
7083 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7084 }
7085 else if (ABI == "n64") {
7086 Builder.defineMacro("__mips_n64");
7087 Builder.defineMacro("_ABI64", "3");
7088 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7089 }
7090 else
David Blaikie83d382b2011-09-23 05:06:16 +00007091 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007092
7093 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007094 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007095 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007096 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7097 { { "at" }, "$1" },
7098 { { "v0" }, "$2" },
7099 { { "v1" }, "$3" },
7100 { { "a0" }, "$4" },
7101 { { "a1" }, "$5" },
7102 { { "a2" }, "$6" },
7103 { { "a3" }, "$7" },
7104 { { "a4" }, "$8" },
7105 { { "a5" }, "$9" },
7106 { { "a6" }, "$10" },
7107 { { "a7" }, "$11" },
7108 { { "t0" }, "$12" },
7109 { { "t1" }, "$13" },
7110 { { "t2" }, "$14" },
7111 { { "t3" }, "$15" },
7112 { { "s0" }, "$16" },
7113 { { "s1" }, "$17" },
7114 { { "s2" }, "$18" },
7115 { { "s3" }, "$19" },
7116 { { "s4" }, "$20" },
7117 { { "s5" }, "$21" },
7118 { { "s6" }, "$22" },
7119 { { "s7" }, "$23" },
7120 { { "t8" }, "$24" },
7121 { { "t9" }, "$25" },
7122 { { "k0" }, "$26" },
7123 { { "k1" }, "$27" },
7124 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007125 { { "sp","$sp" }, "$29" },
7126 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007127 { { "ra" }, "$31" }
7128 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007129 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007130 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007131
7132 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007133};
7134
7135class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007136 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007137 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007138 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 +00007139 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007140 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007141
Akira Hatanakabef17452011-09-20 19:21:49 +00007142 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007143
Akira Hatanakabef17452011-09-20 19:21:49 +00007144public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007145 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007146 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007147 void getTargetDefines(const LangOptions &Opts,
7148 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007149 DefineStd(Builder, "MIPSEB", Opts);
7150 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007151 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007152 }
7153};
7154
7155class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007156 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007157 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007158 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 +00007159 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007160 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00007161 }
7162public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007163 Mips64ELTargetInfo(const llvm::Triple &Triple)
7164 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007165 // Default ABI is n64.
7166 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007167 }
Craig Topper3164f332014-03-11 03:39:26 +00007168 void getTargetDefines(const LangOptions &Opts,
7169 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007170 DefineStd(Builder, "MIPSEL", Opts);
7171 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007172 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007173 }
7174};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007175
Ivan Krasindd7403e2011-08-24 20:22:22 +00007176class PNaClTargetInfo : public TargetInfo {
7177public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007178 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007179 BigEndian = false;
James Y Knighta3518ad2016-01-27 01:04:51 +00007180 this->UserLabelPrefix = "";
Ivan Krasindd7403e2011-08-24 20:22:22 +00007181 this->LongAlign = 32;
7182 this->LongWidth = 32;
7183 this->PointerAlign = 32;
7184 this->PointerWidth = 32;
7185 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007186 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007187 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007188 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007189 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007190 this->SizeType = TargetInfo::UnsignedInt;
7191 this->PtrDiffType = TargetInfo::SignedInt;
7192 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007193 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007194 }
7195
Craig Toppere6f17d02014-03-11 04:07:52 +00007196 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007197 Builder.defineMacro("__le32__");
7198 Builder.defineMacro("__pnacl__");
7199 }
Craig Topper3164f332014-03-11 03:39:26 +00007200 void getTargetDefines(const LangOptions &Opts,
7201 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007202 getArchDefines(Opts, Builder);
7203 }
Craig Topper3164f332014-03-11 03:39:26 +00007204 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007205 return Feature == "pnacl";
7206 }
Craig Topper6c03a542015-10-19 04:51:35 +00007207 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007208 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007209 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007210 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007211 ArrayRef<const char *> getGCCRegNames() const override;
7212 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007213 bool validateAsmConstraint(const char *&Name,
7214 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007215 return false;
7216 }
7217
Craig Topper3164f332014-03-11 03:39:26 +00007218 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007219 return "";
7220 }
7221};
7222
Craig Topperf054e3a2015-10-19 03:52:27 +00007223ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7224 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007225}
7226
Craig Topperf054e3a2015-10-19 03:52:27 +00007227ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7228 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007229}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007230
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007231// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7232class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7233public:
7234 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007235 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007236 }
7237
7238 BuiltinVaListKind getBuiltinVaListKind() const override {
7239 return TargetInfo::PNaClABIBuiltinVaList;
7240 }
7241};
7242
JF Bastien643817d2014-09-12 17:52:47 +00007243class Le64TargetInfo : public TargetInfo {
7244 static const Builtin::Info BuiltinInfo[];
7245
7246public:
7247 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7248 BigEndian = false;
7249 NoAsmVariants = true;
7250 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7251 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00007252 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00007253 }
7254
7255 void getTargetDefines(const LangOptions &Opts,
7256 MacroBuilder &Builder) const override {
7257 DefineStd(Builder, "unix", Opts);
7258 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7259 Builder.defineMacro("__ELF__");
7260 }
Craig Topper6c03a542015-10-19 04:51:35 +00007261 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7262 return llvm::makeArrayRef(BuiltinInfo,
7263 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007264 }
7265 BuiltinVaListKind getBuiltinVaListKind() const override {
7266 return TargetInfo::PNaClABIBuiltinVaList;
7267 }
7268 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007269 ArrayRef<const char *> getGCCRegNames() const override {
7270 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007271 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007272 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7273 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007274 }
7275 bool validateAsmConstraint(const char *&Name,
7276 TargetInfo::ConstraintInfo &Info) const override {
7277 return false;
7278 }
7279
7280 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007281};
Dan Gohmanc2853072015-09-03 22:51:53 +00007282
7283class WebAssemblyTargetInfo : public TargetInfo {
7284 static const Builtin::Info BuiltinInfo[];
7285
7286 enum SIMDEnum {
7287 NoSIMD,
7288 SIMD128,
7289 } SIMDLevel;
7290
7291public:
7292 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7293 : TargetInfo(T), SIMDLevel(NoSIMD) {
7294 BigEndian = false;
7295 NoAsmVariants = true;
7296 SuitableAlign = 128;
7297 LargeArrayMinWidth = 128;
7298 LargeArrayAlign = 128;
7299 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007300 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007301 LongDoubleWidth = LongDoubleAlign = 128;
7302 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007303 }
7304
7305protected:
7306 void getTargetDefines(const LangOptions &Opts,
7307 MacroBuilder &Builder) const override {
7308 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7309 if (SIMDLevel >= SIMD128)
7310 Builder.defineMacro("__wasm_simd128__");
7311 }
7312
7313private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007314 bool
7315 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7316 StringRef CPU,
7317 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007318 if (CPU == "bleeding-edge")
7319 Features["simd128"] = true;
7320 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7321 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007322 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007323 return llvm::StringSwitch<bool>(Feature)
7324 .Case("simd128", SIMDLevel >= SIMD128)
7325 .Default(false);
7326 }
7327 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007328 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007329 for (const auto &Feature : Features) {
7330 if (Feature == "+simd128") {
7331 SIMDLevel = std::max(SIMDLevel, SIMD128);
7332 continue;
7333 }
7334 if (Feature == "-simd128") {
7335 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7336 continue;
7337 }
7338
7339 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7340 << "-target-feature";
7341 return false;
7342 }
7343 return true;
7344 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007345 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007346 return llvm::StringSwitch<bool>(Name)
7347 .Case("mvp", true)
7348 .Case("bleeding-edge", true)
7349 .Case("generic", true)
7350 .Default(false);
7351 }
Craig Topper6c03a542015-10-19 04:51:35 +00007352 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7353 return llvm::makeArrayRef(BuiltinInfo,
7354 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007355 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007356 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007357 return VoidPtrBuiltinVaList;
7358 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007359 ArrayRef<const char *> getGCCRegNames() const final {
7360 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007361 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007362 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7363 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007364 }
7365 bool
7366 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007367 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007368 return false;
7369 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007370 const char *getClobbers() const final { return ""; }
7371 bool isCLZForZeroUndef() const final { return false; }
7372 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007373 IntType getIntTypeByWidth(unsigned BitWidth,
7374 bool IsSigned) const final {
7375 // WebAssembly prefers long long for explicitly 64-bit integers.
7376 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7377 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7378 }
7379 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7380 bool IsSigned) const final {
7381 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7382 return BitWidth == 64
7383 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7384 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7385 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007386};
7387
7388const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7389#define BUILTIN(ID, TYPE, ATTRS) \
7390 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7391#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7392 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7393#include "clang/Basic/BuiltinsWebAssembly.def"
7394};
7395
7396class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7397public:
7398 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7399 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007400 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007401 DataLayoutString = "e-m:e-p:32:32-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007402 }
7403
7404protected:
7405 void getTargetDefines(const LangOptions &Opts,
7406 MacroBuilder &Builder) const override {
7407 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7408 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7409 }
7410};
7411
7412class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7413public:
7414 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7415 : WebAssemblyTargetInfo(T) {
7416 LongAlign = LongWidth = 64;
7417 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007418 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007419 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007420 }
7421
7422protected:
7423 void getTargetDefines(const LangOptions &Opts,
7424 MacroBuilder &Builder) const override {
7425 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7426 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7427 }
7428};
7429
JF Bastien643817d2014-09-12 17:52:47 +00007430const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7431#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007432 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007433#include "clang/Basic/BuiltinsLe64.def"
7434};
7435
Eric Christopherc48497a2015-09-18 21:26:24 +00007436static const unsigned SPIRAddrSpaceMap[] = {
7437 1, // opencl_global
7438 3, // opencl_local
7439 2, // opencl_constant
7440 4, // opencl_generic
7441 0, // cuda_device
7442 0, // cuda_constant
7443 0 // cuda_shared
7444};
7445class SPIRTargetInfo : public TargetInfo {
7446public:
7447 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7448 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7449 "SPIR target must use unknown OS");
7450 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7451 "SPIR target must use unknown environment type");
7452 BigEndian = false;
7453 TLSSupported = false;
7454 LongWidth = LongAlign = 64;
7455 AddrSpaceMap = &SPIRAddrSpaceMap;
7456 UseAddrSpaceMapMangling = true;
7457 // Define available target features
7458 // These must be defined in sorted order!
7459 NoAsmVariants = true;
7460 }
7461 void getTargetDefines(const LangOptions &Opts,
7462 MacroBuilder &Builder) const override {
7463 DefineStd(Builder, "SPIR", Opts);
7464 }
7465 bool hasFeature(StringRef Feature) const override {
7466 return Feature == "spir";
7467 }
Craig Topper3164f332014-03-11 03:39:26 +00007468
Craig Topper6c03a542015-10-19 04:51:35 +00007469 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007470 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007471 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007472 bool validateAsmConstraint(const char *&Name,
7473 TargetInfo::ConstraintInfo &info) const override {
7474 return true;
7475 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007476 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7477 return None;
7478 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007479 BuiltinVaListKind getBuiltinVaListKind() const override {
7480 return TargetInfo::VoidPtrBuiltinVaList;
7481 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007482
Eric Christopherc48497a2015-09-18 21:26:24 +00007483 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7484 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7485 : CCCR_Warning;
7486 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007487
Eric Christopherc48497a2015-09-18 21:26:24 +00007488 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7489 return CC_SpirFunction;
7490 }
7491};
Guy Benyeib798fc92012-12-11 21:38:14 +00007492
Eric Christopherc48497a2015-09-18 21:26:24 +00007493class SPIR32TargetInfo : public SPIRTargetInfo {
7494public:
7495 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7496 PointerWidth = PointerAlign = 32;
7497 SizeType = TargetInfo::UnsignedInt;
7498 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7499 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7500 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7501 }
7502 void getTargetDefines(const LangOptions &Opts,
7503 MacroBuilder &Builder) const override {
7504 DefineStd(Builder, "SPIR32", Opts);
7505 }
7506};
Guy Benyeib798fc92012-12-11 21:38:14 +00007507
Eric Christopherc48497a2015-09-18 21:26:24 +00007508class SPIR64TargetInfo : public SPIRTargetInfo {
7509public:
7510 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7511 PointerWidth = PointerAlign = 64;
7512 SizeType = TargetInfo::UnsignedLong;
7513 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7514 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7515 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7516 }
7517 void getTargetDefines(const LangOptions &Opts,
7518 MacroBuilder &Builder) const override {
7519 DefineStd(Builder, "SPIR64", Opts);
7520 }
7521};
Guy Benyeib798fc92012-12-11 21:38:14 +00007522
Robert Lytton0e076492013-08-13 09:43:10 +00007523class XCoreTargetInfo : public TargetInfo {
7524 static const Builtin::Info BuiltinInfo[];
7525public:
7526 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7527 BigEndian = false;
7528 NoAsmVariants = true;
7529 LongLongAlign = 32;
7530 SuitableAlign = 32;
7531 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007532 SizeType = UnsignedInt;
7533 PtrDiffType = SignedInt;
7534 IntPtrType = SignedInt;
7535 WCharType = UnsignedChar;
7536 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007537 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007538 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7539 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007540 }
Craig Topper3164f332014-03-11 03:39:26 +00007541 void getTargetDefines(const LangOptions &Opts,
7542 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007543 Builder.defineMacro("__XS1B__");
7544 }
Craig Topper6c03a542015-10-19 04:51:35 +00007545 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7546 return llvm::makeArrayRef(BuiltinInfo,
7547 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007548 }
Craig Topper3164f332014-03-11 03:39:26 +00007549 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007550 return TargetInfo::VoidPtrBuiltinVaList;
7551 }
Craig Topper3164f332014-03-11 03:39:26 +00007552 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007553 return "";
7554 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007555 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007556 static const char * const GCCRegNames[] = {
7557 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7558 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7559 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007560 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007561 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007562 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7563 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007564 }
Craig Topper3164f332014-03-11 03:39:26 +00007565 bool validateAsmConstraint(const char *&Name,
7566 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007567 return false;
7568 }
Craig Topper3164f332014-03-11 03:39:26 +00007569 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007570 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7571 return (RegNo < 2)? RegNo : -1;
7572 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007573 bool allowsLargerPreferedTypeAlignment() const override {
7574 return false;
7575 }
Robert Lytton0e076492013-08-13 09:43:10 +00007576};
7577
7578const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007579#define BUILTIN(ID, TYPE, ATTRS) \
7580 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7581#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7582 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007583#include "clang/Basic/BuiltinsXCore.def"
7584};
Robert Lytton0e076492013-08-13 09:43:10 +00007585
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007586// x86_32 Android target
7587class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7588public:
7589 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7590 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7591 SuitableAlign = 32;
7592 LongDoubleWidth = 64;
7593 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7594 }
7595};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007596
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007597// x86_64 Android target
7598class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7599public:
7600 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7601 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7602 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7603 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007604
7605 bool useFloat128ManglingForLongDouble() const override {
7606 return true;
7607 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007608};
7609} // end anonymous namespace
7610
Chris Lattner5ba61f02006-10-14 07:39:34 +00007611//===----------------------------------------------------------------------===//
7612// Driver code
7613//===----------------------------------------------------------------------===//
7614
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007615static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007616 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007617
Daniel Dunbar52322032009-08-18 05:47:58 +00007618 switch (Triple.getArch()) {
7619 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007620 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007621
Tim Northover2a0783d2014-05-30 14:14:07 +00007622 case llvm::Triple::xcore:
7623 return new XCoreTargetInfo(Triple);
7624
7625 case llvm::Triple::hexagon:
7626 return new HexagonTargetInfo(Triple);
7627
7628 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007629 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007630 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007631
7632 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007633 case llvm::Triple::CloudABI:
7634 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007635 case llvm::Triple::FreeBSD:
7636 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007637 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007638 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007639 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007640 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007641 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007642 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007643 }
7644
Christian Pirker9b019ae2014-02-25 13:51:00 +00007645 case llvm::Triple::aarch64_be:
7646 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007647 case llvm::Triple::FreeBSD:
7648 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007649 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007650 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007651 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007652 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007653 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007654 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007655 }
7656
Daniel Dunbar52322032009-08-18 05:47:58 +00007657 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007658 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007659 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007660 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007661
Daniel Dunbar52322032009-08-18 05:47:58 +00007662 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007663 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007664 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007665 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007666 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007667 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007668 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007669 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007670 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007671 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007672 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007673 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007674 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007675 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007676 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007677 case llvm::Triple::Win32:
7678 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007679 case llvm::Triple::Cygnus:
7680 return new CygwinARMTargetInfo(Triple);
7681 case llvm::Triple::GNU:
7682 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007683 case llvm::Triple::Itanium:
7684 return new ItaniumWindowsARMleTargetInfo(Triple);
7685 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007686 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007687 return new MicrosoftARMleTargetInfo(Triple);
7688 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007689 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007690 return new ARMleTargetInfo(Triple);
7691 }
7692
7693 case llvm::Triple::armeb:
7694 case llvm::Triple::thumbeb:
7695 if (Triple.isOSDarwin())
7696 return new DarwinARMTargetInfo(Triple);
7697
7698 switch (os) {
7699 case llvm::Triple::Linux:
7700 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7701 case llvm::Triple::FreeBSD:
7702 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7703 case llvm::Triple::NetBSD:
7704 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7705 case llvm::Triple::OpenBSD:
7706 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7707 case llvm::Triple::Bitrig:
7708 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7709 case llvm::Triple::RTEMS:
7710 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7711 case llvm::Triple::NaCl:
7712 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7713 default:
7714 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007715 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007716
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007717 case llvm::Triple::bpfeb:
7718 case llvm::Triple::bpfel:
7719 return new BPFTargetInfo(Triple);
7720
Daniel Dunbar52322032009-08-18 05:47:58 +00007721 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007722 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007723
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007724 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007725 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007726 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007727 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007728 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007729 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007730 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007731 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007732 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007733 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007734 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007735 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007736 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007737
7738 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007739 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007740 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007741 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007742 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007743 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007744 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007745 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007746 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007747 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007748 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007749 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007750 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007751 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007752 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007753
Akira Hatanakabef17452011-09-20 19:21:49 +00007754 case llvm::Triple::mips64:
7755 switch (os) {
7756 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007757 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007758 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007759 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007760 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007761 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007762 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007763 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007764 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007765 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007766 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007767 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007768 }
7769
7770 case llvm::Triple::mips64el:
7771 switch (os) {
7772 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007773 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007774 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007775 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007776 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007777 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007778 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007779 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007780 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007781 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007782 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007783 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007784 }
7785
Ivan Krasindd7403e2011-08-24 20:22:22 +00007786 case llvm::Triple::le32:
7787 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007788 case llvm::Triple::NaCl:
7789 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7790 default:
7791 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007792 }
7793
JF Bastien643817d2014-09-12 17:52:47 +00007794 case llvm::Triple::le64:
7795 return new Le64TargetInfo(Triple);
7796
Daniel Dunbar52322032009-08-18 05:47:58 +00007797 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007798 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007799 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007800 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007801 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007802 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007803 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007804 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007805 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007806 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007807 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007808 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007809 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007810 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007811 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007812 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007813 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007814
7815 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007816 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007817 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007818 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007819 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007820 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007821 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007822 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007823 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007824 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007825 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007826 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007827 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007828 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007829 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007830
Bill Schmidt778d3872013-07-26 01:36:11 +00007831 case llvm::Triple::ppc64le:
7832 switch (os) {
7833 case llvm::Triple::Linux:
7834 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007835 case llvm::Triple::NetBSD:
7836 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007837 default:
7838 return new PPC64TargetInfo(Triple);
7839 }
7840
Peter Collingbournec947aae2012-05-20 23:28:41 +00007841 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007842 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007843 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007844 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007845
Tom Stellardd8e38a32015-01-06 20:34:47 +00007846 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007847 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007848 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007849
Daniel Dunbar52322032009-08-18 05:47:58 +00007850 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007851 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007852 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007853 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007854 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007855 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007856 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007857 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007858 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007859 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007860 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007861 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007862 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007863 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007864 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007865
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007866 // The 'sparcel' architecture copies all the above cases except for Solaris.
7867 case llvm::Triple::sparcel:
7868 switch (os) {
7869 case llvm::Triple::Linux:
7870 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7871 case llvm::Triple::NetBSD:
7872 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7873 case llvm::Triple::OpenBSD:
7874 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7875 case llvm::Triple::RTEMS:
7876 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7877 default:
7878 return new SparcV8elTargetInfo(Triple);
7879 }
7880
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007881 case llvm::Triple::sparcv9:
7882 switch (os) {
7883 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007884 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007885 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007886 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007887 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007888 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007889 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007890 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007891 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007892 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007893 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007894 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007895 }
7896
Ulrich Weigand47445072013-05-06 16:26:41 +00007897 case llvm::Triple::systemz:
7898 switch (os) {
7899 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007900 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007901 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007902 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007903 }
7904
Eli Friedmana9c3d712009-08-19 20:47:07 +00007905 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007906 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007907
Daniel Dunbar52322032009-08-18 05:47:58 +00007908 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007909 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007910 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007911
Daniel Dunbar52322032009-08-18 05:47:58 +00007912 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007913 case llvm::Triple::CloudABI:
7914 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007915 case llvm::Triple::Linux: {
7916 switch (Triple.getEnvironment()) {
7917 default:
7918 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7919 case llvm::Triple::Android:
7920 return new AndroidX86_32TargetInfo(Triple);
7921 }
7922 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007923 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007924 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007925 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007926 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007927 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007928 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007929 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007930 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007931 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007932 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007933 case llvm::Triple::KFreeBSD:
7934 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007935 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007936 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007937 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007938 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007939 case llvm::Triple::Win32: {
7940 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007941 case llvm::Triple::Cygnus:
7942 return new CygwinX86_32TargetInfo(Triple);
7943 case llvm::Triple::GNU:
7944 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007945 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007946 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007947 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007948 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007949 }
7950 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007951 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007952 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007953 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007954 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007955 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007956 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00007957 case llvm::Triple::ELFIAMCU:
7958 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007959 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007960 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007961 }
7962
7963 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007964 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007965 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007966
Daniel Dunbar52322032009-08-18 05:47:58 +00007967 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007968 case llvm::Triple::CloudABI:
7969 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007970 case llvm::Triple::Linux: {
7971 switch (Triple.getEnvironment()) {
7972 default:
7973 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7974 case llvm::Triple::Android:
7975 return new AndroidX86_64TargetInfo(Triple);
7976 }
7977 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007978 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007979 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007980 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007981 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007982 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007983 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007984 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007985 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007986 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007987 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007988 case llvm::Triple::KFreeBSD:
7989 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007990 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007991 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007992 case llvm::Triple::Win32: {
7993 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007994 case llvm::Triple::Cygnus:
7995 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007996 case llvm::Triple::GNU:
7997 return new MinGWX86_64TargetInfo(Triple);
7998 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007999 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008000 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008001 }
8002 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008003 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008004 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008005 case llvm::Triple::PS4:
8006 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008007 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008008 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008009 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008010
Douglas Katzman78d7c542015-05-12 21:18:10 +00008011 case llvm::Triple::spir: {
8012 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8013 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8014 return nullptr;
8015 return new SPIR32TargetInfo(Triple);
8016 }
8017 case llvm::Triple::spir64: {
8018 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8019 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8020 return nullptr;
8021 return new SPIR64TargetInfo(Triple);
8022 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008023 case llvm::Triple::wasm32:
8024 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8025 return nullptr;
8026 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8027 case llvm::Triple::wasm64:
8028 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8029 return nullptr;
8030 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008031 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008032}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008033
8034/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008035/// options.
Alp Toker80758082014-07-06 05:26:44 +00008036TargetInfo *
8037TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8038 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008039 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008040
8041 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008042 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008043 if (!Target) {
8044 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008045 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008046 }
Alp Toker80758082014-07-06 05:26:44 +00008047 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008048
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008049 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008050 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8051 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008052 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008053 }
8054
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008055 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008056 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8057 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008058 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008059 }
8060
Rafael Espindolaeb265472013-08-21 21:59:03 +00008061 // Set the fp math unit.
8062 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8063 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008064 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008065 }
8066
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008067 // Compute the default target features, we need the target to handle this
8068 // because features may have dependencies on one another.
8069 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008070 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8071 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008072 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008073
8074 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008075 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008076 for (const auto &F : Features)
8077 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8078
Eric Christopher3ff21b32013-10-16 21:26:26 +00008079 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008080 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008081
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008082 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008083}