blob: fd8215b9ae6d70e1a0ee94bd12401b5c5f0189ef [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-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 Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikove7772382009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek38591a22007-12-12 18:05:32 +000011// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerddae7102008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carrutha088d5b2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedmand4011892008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Stephen Hines176edba2014-12-01 14:53:08 -080024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar0433a022009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattnerf54f2212009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner43954312009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerf8a85782010-01-09 18:20:57 +000030#include <algorithm>
Stephen Hines651f13c2014-04-23 16:59:28 -070031#include <memory>
Chris Lattner4b009652007-07-25 00:24:17 +000032using namespace clang;
33
Chris Lattner4b009652007-07-25 00:24:17 +000034//===----------------------------------------------------------------------===//
35// Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
Chris Lattnerc345a802009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner5f9e2722011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattnerc345a802009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikove7772382009-05-03 13:42:53 +000044
Chris Lattnerc345a802009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000049
Chris Lattnerc345a802009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000052
Chris Lattnerc345a802009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerc345a802009-03-20 16:06:38 +000055}
56
Benjamin Kramer448f68d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattnerbd00eb82008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner43954312009-08-10 19:03:04 +000068
Edwin Török36565e52009-06-30 17:10:35 +000069namespace {
Douglas Gregor937331f2009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Edwin Török36565e52009-06-30 17:10:35 +000072protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Edwin Török36565e52009-06-30 17:10:35 +000075public:
Benjamin Kramer9df08232013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -070077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Edwin Török2d98f9f2009-06-30 17:00:25 +000081 }
Edwin Török36565e52009-06-30 17:10:35 +000082
83};
Chris Lattnerf54f2212009-08-12 06:24:27 +000084} // end anonymous namespace
Edwin Török2d98f9f2009-06-30 17:00:25 +000085
Chris Lattner43954312009-08-10 19:03:04 +000086
Daniel Dunbareab96a22010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilsond588f5c2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenko087c65f2012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Stephen Hines176edba2014-12-01 14:53:08 -080096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikove7772382009-05-03 13:42:53 +000098
John McCall098df7f2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000102
John McCallf85e1932011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000108
John McCallf85e1932011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000113 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000114
Eli Friedmaneff0a422009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmaneff0a422009-06-04 23:00:29 +0000117 else
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar93f64532009-04-10 19:52:24 +0000122
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000131 }
Daniel Dunbareab96a22010-01-26 01:44:04 +0000132
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Stephen Hines651f13c2014-04-23 16:59:28 -0700141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Stephen Hines176edba2014-12-01 14:53:08 -0800159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000177 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000178
Stephen Hines651f13c2014-04-23 16:59:28 -0700179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman872996c2008-08-20 02:34:37 +0000184}
Chris Lattner4b009652007-07-25 00:24:17 +0000185
Chris Lattner43954312009-08-10 19:03:04 +0000186namespace {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700187// CloudABI Target
188template <typename Target>
189class CloudABITargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 Builder.defineMacro("__CloudABI__");
194 Builder.defineMacro("__ELF__");
195
196 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
197 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
198 Builder.defineMacro("__STDC_UTF_16__");
199 Builder.defineMacro("__STDC_UTF_32__");
200 }
201
202public:
203 CloudABITargetInfo(const llvm::Triple &Triple)
204 : OSTargetInfo<Target>(Triple) {
205 this->UserLabelPrefix = "";
206 }
207};
208
Edwin Török36565e52009-06-30 17:10:35 +0000209template<typename Target>
210class DarwinTargetInfo : public OSTargetInfo<Target> {
211protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700212 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
213 MacroBuilder &Builder) const override {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000214 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000215 this->PlatformMinVersion);
Edwin Török36565e52009-06-30 17:10:35 +0000216 }
Mike Stump25cf7602009-09-09 15:08:12 +0000217
Edwin Török36565e52009-06-30 17:10:35 +0000218public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000219 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
220 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
221 this->MCountName = "\01mcount";
222 }
Edwin Török36565e52009-06-30 17:10:35 +0000223
Stephen Hines651f13c2014-04-23 16:59:28 -0700224 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner43954312009-08-10 19:03:04 +0000225 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000226 StringRef Segment, Section;
Chris Lattner43954312009-08-10 19:03:04 +0000227 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000228 bool HasTAA;
Chris Lattner43954312009-08-10 19:03:04 +0000229 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000230 TAA, HasTAA, StubSize);
Chris Lattner43954312009-08-10 19:03:04 +0000231 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000232
Stephen Hines651f13c2014-04-23 16:59:28 -0700233 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson608b5792010-06-08 22:47:50 +0000234 // FIXME: We should return 0 when building kexts.
235 return "__TEXT,__StaticInit,regular,pure_instructions";
236 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000237
John McCall41887602012-01-29 01:20:30 +0000238 /// Darwin does not support protected visibility. Darwin's "default"
239 /// is very similar to ELF's "protected"; Darwin requires a "weak"
240 /// attribute on declarations that can be dynamically replaced.
Stephen Hines651f13c2014-04-23 16:59:28 -0700241 bool hasProtectedVisibility() const override {
John McCall41887602012-01-29 01:20:30 +0000242 return false;
243 }
Edwin Török36565e52009-06-30 17:10:35 +0000244};
245
Chris Lattner43954312009-08-10 19:03:04 +0000246
Edwin Török36565e52009-06-30 17:10:35 +0000247// DragonFlyBSD Target
248template<typename Target>
249class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
250protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700251 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
252 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000253 // DragonFly defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000254 Builder.defineMacro("__DragonFly__");
255 Builder.defineMacro("__DragonFly_cc_version", "100001");
256 Builder.defineMacro("__ELF__");
257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 Builder.defineMacro("__tune_i386__");
259 DefineStd(Builder, "unix", Opts);
Edwin Török36565e52009-06-30 17:10:35 +0000260 }
261public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000262 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
263 : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000265
Benjamin Kramer9df08232013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 }
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000273 }
Edwin Török36565e52009-06-30 17:10:35 +0000274};
275
276// FreeBSD Target
277template<typename Target>
278class FreeBSDTargetInfo : public OSTargetInfo<Target> {
279protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000282 // FreeBSD defines; list based off of gcc output
283
Benjamin Kramer474202f2011-10-18 10:10:08 +0000284 unsigned Release = Triple.getOSMajorVersion();
285 if (Release == 0U)
286 Release = 8;
Edwin Török36565e52009-06-30 17:10:35 +0000287
Benjamin Kramer474202f2011-10-18 10:10:08 +0000288 Builder.defineMacro("__FreeBSD__", Twine(Release));
289 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000290 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
291 DefineStd(Builder, "unix", Opts);
292 Builder.defineMacro("__ELF__");
Ed Schouten5ada7a52013-09-29 07:54:52 +0000293
294 // On FreeBSD, wchar_t contains the number of the code point as
295 // used by the character set of the locale. These character sets are
296 // not necessarily a superset of ASCII.
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700297 //
298 // FIXME: This is wrong; the macro refers to the numerical values
299 // of wchar_t *literals*, which are not locale-dependent. However,
300 // FreeBSD systems apparently depend on us getting this wrong, and
301 // setting this to 1 is conforming even if all the basic source
302 // character literals have the same encoding as char and wchar_t.
Ed Schouten5ada7a52013-09-29 07:54:52 +0000303 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Edwin Török36565e52009-06-30 17:10:35 +0000304 }
305public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000306 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
307 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000308
Benjamin Kramer9df08232013-06-29 16:37:14 +0000309 switch (Triple.getArch()) {
310 default:
311 case llvm::Triple::x86:
312 case llvm::Triple::x86_64:
313 this->MCountName = ".mcount";
314 break;
315 case llvm::Triple::mips:
316 case llvm::Triple::mipsel:
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000319 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000320 this->MCountName = "_mcount";
321 break;
322 case llvm::Triple::arm:
323 this->MCountName = "__mcount";
324 break;
Duncan Sandscd2cb662009-07-08 13:55:08 +0000325 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000326 }
Edwin Török36565e52009-06-30 17:10:35 +0000327};
328
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000329// GNU/kFreeBSD Target
330template<typename Target>
331class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000335 // GNU/kFreeBSD defines; list based off of gcc output
336
337 DefineStd(Builder, "unix", Opts);
338 Builder.defineMacro("__FreeBSD_kernel__");
339 Builder.defineMacro("__GLIBC__");
340 Builder.defineMacro("__ELF__");
341 if (Opts.POSIXThreads)
342 Builder.defineMacro("_REENTRANT");
343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
345 }
346public:
Stephen Hines176edba2014-12-01 14:53:08 -0800347 KFreeBSDTargetInfo(const llvm::Triple &Triple)
348 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000349 this->UserLabelPrefix = "";
350 }
351};
352
Chris Lattner6f4bed52010-07-07 16:01:42 +0000353// Minix Target
354template<typename Target>
355class MinixTargetInfo : public OSTargetInfo<Target> {
356protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Chris Lattner6f4bed52010-07-07 16:01:42 +0000359 // Minix defines
360
361 Builder.defineMacro("__minix", "3");
362 Builder.defineMacro("_EM_WSIZE", "4");
363 Builder.defineMacro("_EM_PSIZE", "4");
364 Builder.defineMacro("_EM_SSIZE", "2");
365 Builder.defineMacro("_EM_LSIZE", "4");
366 Builder.defineMacro("_EM_FSIZE", "4");
367 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000368 Builder.defineMacro("__ELF__");
Chris Lattner6f4bed52010-07-07 16:01:42 +0000369 DefineStd(Builder, "unix", Opts);
370 }
371public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000372 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
373 this->UserLabelPrefix = "";
374 }
Chris Lattner6f4bed52010-07-07 16:01:42 +0000375};
376
Edwin Török36565e52009-06-30 17:10:35 +0000377// Linux target
378template<typename Target>
379class LinuxTargetInfo : public OSTargetInfo<Target> {
380protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000383 // Linux defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000384 DefineStd(Builder, "unix", Opts);
385 DefineStd(Builder, "linux", Opts);
386 Builder.defineMacro("__gnu_linux__");
387 Builder.defineMacro("__ELF__");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700388 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000389 Builder.defineMacro("__ANDROID__", "1");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700390 unsigned Maj, Min, Rev;
391 Triple.getOSVersion(Maj, Min, Rev);
392 this->PlatformName = "android";
393 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
394 }
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000396 Builder.defineMacro("_REENTRANT");
Douglas Gregor9b22a172010-04-21 05:52:38 +0000397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
Edwin Török36565e52009-06-30 17:10:35 +0000399 }
400public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000401 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000402 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000403 this->WIntType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700404
405 switch (Triple.getArch()) {
406 default:
407 break;
408 case llvm::Triple::ppc:
409 case llvm::Triple::ppc64:
410 case llvm::Triple::ppc64le:
411 this->MCountName = "_mcount";
412 break;
413 }
Edwin Török36565e52009-06-30 17:10:35 +0000414 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000415
Stephen Hines651f13c2014-04-23 16:59:28 -0700416 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000417 return ".text.startup";
418 }
Edwin Török36565e52009-06-30 17:10:35 +0000419};
420
Chris Lattner25fff082009-07-13 20:29:08 +0000421// NetBSD Target
422template<typename Target>
423class NetBSDTargetInfo : public OSTargetInfo<Target> {
424protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Chris Lattner25fff082009-07-13 20:29:08 +0000427 // NetBSD defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000428 Builder.defineMacro("__NetBSD__");
429 Builder.defineMacro("__unix__");
430 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000431 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000432 Builder.defineMacro("_POSIX_THREADS");
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700433
434 switch (Triple.getArch()) {
435 default:
436 break;
437 case llvm::Triple::arm:
438 case llvm::Triple::armeb:
439 case llvm::Triple::thumb:
440 case llvm::Triple::thumbeb:
441 Builder.defineMacro("__ARM_DWARF_EH__");
442 break;
443 }
Chris Lattner25fff082009-07-13 20:29:08 +0000444 }
445public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000446 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700448 this->MCountName = "_mcount";
Benjamin Kramer9df08232013-06-29 16:37:14 +0000449 }
Chris Lattner25fff082009-07-13 20:29:08 +0000450};
451
Edwin Török36565e52009-06-30 17:10:35 +0000452// OpenBSD Target
453template<typename Target>
454class OpenBSDTargetInfo : public OSTargetInfo<Target> {
455protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000458 // OpenBSD defines; list based off of gcc output
459
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000460 Builder.defineMacro("__OpenBSD__");
461 DefineStd(Builder, "unix", Opts);
462 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000463 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000464 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000465 }
466public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000467 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
468 this->UserLabelPrefix = "";
469 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000470
Eli Friedman62d829a2011-12-15 02:15:56 +0000471 switch (Triple.getArch()) {
472 default:
473 case llvm::Triple::x86:
474 case llvm::Triple::x86_64:
475 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000476 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000477 this->MCountName = "__mcount";
478 break;
479 case llvm::Triple::mips64:
480 case llvm::Triple::mips64el:
481 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000482 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000483 this->MCountName = "_mcount";
484 break;
485 }
486 }
Edwin Török36565e52009-06-30 17:10:35 +0000487};
488
Eli Friedman42f74f22012-08-08 23:57:20 +0000489// Bitrig Target
490template<typename Target>
491class BitrigTargetInfo : public OSTargetInfo<Target> {
492protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Eli Friedman42f74f22012-08-08 23:57:20 +0000495 // Bitrig defines; list based off of gcc output
496
497 Builder.defineMacro("__Bitrig__");
498 DefineStd(Builder, "unix", Opts);
499 Builder.defineMacro("__ELF__");
500 if (Opts.POSIXThreads)
501 Builder.defineMacro("_REENTRANT");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700502
503 switch (Triple.getArch()) {
504 default:
505 break;
506 case llvm::Triple::arm:
507 case llvm::Triple::armeb:
508 case llvm::Triple::thumb:
509 case llvm::Triple::thumbeb:
510 Builder.defineMacro("__ARM_DWARF_EH__");
511 break;
512 }
Eli Friedman42f74f22012-08-08 23:57:20 +0000513 }
514public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000515 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
516 this->UserLabelPrefix = "";
Benjamin Kramer9df08232013-06-29 16:37:14 +0000517 this->MCountName = "__mcount";
Eli Friedman42f74f22012-08-08 23:57:20 +0000518 }
519};
520
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000521// PSP Target
522template<typename Target>
523class PSPTargetInfo : public OSTargetInfo<Target> {
524protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700525 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
526 MacroBuilder &Builder) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000527 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000528 Builder.defineMacro("PSP");
529 Builder.defineMacro("_PSP");
530 Builder.defineMacro("__psp__");
531 Builder.defineMacro("__ELF__");
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000532 }
533public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000534 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000535 this->UserLabelPrefix = "";
536 }
537};
538
John Thompsoned7bdbc2009-11-19 17:18:50 +0000539// PS3 PPU Target
540template<typename Target>
541class PS3PPUTargetInfo : public OSTargetInfo<Target> {
542protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700543 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
544 MacroBuilder &Builder) const override {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000545 // PS3 PPU defines.
John Thompsonfdd2fc32010-03-25 16:18:32 +0000546 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000547 Builder.defineMacro("__PPU__");
548 Builder.defineMacro("__CELLOS_LV2__");
549 Builder.defineMacro("__ELF__");
550 Builder.defineMacro("__LP32__");
John Thompson1deeb9f2010-06-24 22:44:13 +0000551 Builder.defineMacro("_ARCH_PPC64");
552 Builder.defineMacro("__powerpc64__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000553 }
554public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000555 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000556 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000557 this->LongWidth = this->LongAlign = 32;
558 this->PointerWidth = this->PointerAlign = 32;
John Thompson1deeb9f2010-06-24 22:44:13 +0000559 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson1deeb9f2010-06-24 22:44:13 +0000560 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson4c3bd3f2009-12-18 14:21:08 +0000561 this->SizeType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700562 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsoned7bdbc2009-11-19 17:18:50 +0000563 }
564};
565
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700566template <typename Target>
567class PS4OSTargetInfo : public OSTargetInfo<Target> {
568protected:
569 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
570 MacroBuilder &Builder) const override {
571 Builder.defineMacro("__FreeBSD__", "9");
572 Builder.defineMacro("__FreeBSD_cc_version", "900001");
573 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
574 DefineStd(Builder, "unix", Opts);
575 Builder.defineMacro("__ELF__");
576 Builder.defineMacro("__PS4__");
577 }
578public:
579 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
580 this->WCharType = this->UnsignedShort;
581
582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Edwin Török36565e52009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Stephen Hines176edba2014-12-01 14:53:08 -0800607 // with a new version.
608 if (Opts.C99)
David Chisnall165329c2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Edwin Török36565e52009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer01e70082010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700638 if (Opts.RTTIData)
Michael J. Spencer01e70082010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700641 if (Opts.CXXExceptions)
Michael J. Spencer01e70082010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
645 if (!Opts.CharIsSigned)
646 Builder.defineMacro("_CHAR_UNSIGNED");
647
648 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
649 // but it works for now.
650 if (Opts.POSIXThreads)
651 Builder.defineMacro("_MT");
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000652
Stephen Hines176edba2014-12-01 14:53:08 -0800653 if (Opts.MSCompatibilityVersion) {
654 Builder.defineMacro("_MSC_VER",
655 Twine(Opts.MSCompatibilityVersion / 100000));
656 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700657 // FIXME We cannot encode the revision information into 32-bits
658 Builder.defineMacro("_MSC_BUILD", Twine(1));
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700659
660 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(19))
661 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700662 }
Michael J. Spencer01e70082010-10-21 05:21:48 +0000663
Francois Pichet62ec1f22011-09-17 17:15:52 +0000664 if (Opts.MicrosoftExt) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000665 Builder.defineMacro("_MSC_EXTENSIONS");
666
Richard Smith80ad52f2013-01-02 11:42:31 +0000667 if (Opts.CPlusPlus11) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000668 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
669 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
670 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
671 }
672 }
673
674 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer01e70082010-10-21 05:21:48 +0000675 }
676
Michael J. Spencer01e70082010-10-21 05:21:48 +0000677public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000678 WindowsTargetInfo(const llvm::Triple &Triple)
679 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer01e70082010-10-21 05:21:48 +0000680};
681
Derek Schuff7da46f92012-10-11 16:55:58 +0000682template <typename Target>
683class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000684protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700685 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
686 MacroBuilder &Builder) const override {
Derek Schuff7da46f92012-10-11 16:55:58 +0000687 if (Opts.POSIXThreads)
688 Builder.defineMacro("_REENTRANT");
689 if (Opts.CPlusPlus)
690 Builder.defineMacro("_GNU_SOURCE");
691
692 DefineStd(Builder, "unix", Opts);
693 Builder.defineMacro("__ELF__");
694 Builder.defineMacro("__native_client__");
695 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000696
697public:
698 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000699 this->UserLabelPrefix = "";
700 this->LongAlign = 32;
701 this->LongWidth = 32;
702 this->PointerAlign = 32;
703 this->PointerWidth = 32;
704 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff7da46f92012-10-11 16:55:58 +0000705 this->Int64Type = TargetInfo::SignedLongLong;
706 this->DoubleAlign = 64;
707 this->LongDoubleWidth = 64;
708 this->LongDoubleAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -0700709 this->LongLongWidth = 64;
710 this->LongLongAlign = 64;
Derek Schuff7da46f92012-10-11 16:55:58 +0000711 this->SizeType = TargetInfo::UnsignedInt;
712 this->PtrDiffType = TargetInfo::SignedInt;
713 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000714 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000715 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines651f13c2014-04-23 16:59:28 -0700716 if (Triple.getArch() == llvm::Triple::arm) {
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700717 // Handled in ARM's setABI().
Stephen Hines651f13c2014-04-23 16:59:28 -0700718 } else if (Triple.getArch() == llvm::Triple::x86) {
719 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
720 } else if (Triple.getArch() == llvm::Triple::x86_64) {
721 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
722 } else if (Triple.getArch() == llvm::Triple::mipsel) {
723 // Handled on mips' setDescriptionString.
724 } else {
725 assert(Triple.getArch() == llvm::Triple::le32);
726 this->DescriptionString = "e-p:32:32-i64:64";
727 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000728 }
729};
Edwin Török36565e52009-06-30 17:10:35 +0000730
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000731//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000732// Specific target implementations.
733//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000734
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000735// PPC abstract base class
736class PPCTargetInfo : public TargetInfo {
737 static const Builtin::Info BuiltinInfo[];
738 static const char * const GCCRegNames[];
739 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000740 std::string CPU;
Eric Christopher16543202013-10-16 21:19:26 +0000741
742 // Target cpu features.
743 bool HasVSX;
Stephen Hines176edba2014-12-01 14:53:08 -0800744 bool HasP8Vector;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700745 bool HasP8Crypto;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700746 bool HasDirectMove;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700747 bool HasQPX;
748 bool HasHTM;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700749 bool HasBPERMD;
750 bool HasExtDiv;
Stephen Hines176edba2014-12-01 14:53:08 -0800751
752protected:
753 std::string ABI;
Eric Christopher16543202013-10-16 21:19:26 +0000754
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000755public:
Eric Christopher16543202013-10-16 21:19:26 +0000756 PPCTargetInfo(const llvm::Triple &Triple)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700757 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -0700758 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
759 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000760 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000761 LongDoubleWidth = LongDoubleAlign = 128;
762 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
763 }
Eli Friedmand9389be2009-06-05 07:05:05 +0000764
Hal Finkel39d5fa12012-07-03 16:51:04 +0000765 /// \brief Flags for architecture specific defines.
766 typedef enum {
767 ArchDefineNone = 0,
768 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
769 ArchDefinePpcgr = 1 << 1,
770 ArchDefinePpcsq = 1 << 2,
771 ArchDefine440 = 1 << 3,
772 ArchDefine603 = 1 << 4,
773 ArchDefine604 = 1 << 5,
774 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000775 ArchDefinePwr5 = 1 << 7,
776 ArchDefinePwr5x = 1 << 8,
777 ArchDefinePwr6 = 1 << 9,
778 ArchDefinePwr6x = 1 << 10,
779 ArchDefinePwr7 = 1 << 11,
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700780 ArchDefinePwr8 = 1 << 12,
781 ArchDefineA2 = 1 << 13,
782 ArchDefineA2q = 1 << 14
Hal Finkel39d5fa12012-07-03 16:51:04 +0000783 } ArchDefineTypes;
784
Bill Schmidt2821e182013-02-01 20:23:10 +0000785 // Note: GCC recognizes the following additional cpus:
786 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
787 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
788 // titan, rs64.
Stephen Hines651f13c2014-04-23 16:59:28 -0700789 bool setCPU(const std::string &Name) override {
Hal Finkel02a84272012-06-11 22:35:19 +0000790 bool CPUKnown = llvm::StringSwitch<bool>(Name)
791 .Case("generic", true)
792 .Case("440", true)
793 .Case("450", true)
794 .Case("601", true)
795 .Case("602", true)
796 .Case("603", true)
797 .Case("603e", true)
798 .Case("603ev", true)
799 .Case("604", true)
800 .Case("604e", true)
801 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000802 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000803 .Case("g3", true)
804 .Case("7400", true)
805 .Case("g4", true)
806 .Case("7450", true)
807 .Case("g4+", true)
808 .Case("750", true)
809 .Case("970", true)
810 .Case("g5", true)
811 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000812 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000813 .Case("e500mc", true)
814 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000815 .Case("power3", true)
816 .Case("pwr3", true)
817 .Case("power4", true)
818 .Case("pwr4", true)
819 .Case("power5", true)
820 .Case("pwr5", true)
821 .Case("power5x", true)
822 .Case("pwr5x", true)
823 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000824 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000825 .Case("power6x", true)
826 .Case("pwr6x", true)
827 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000828 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700829 .Case("power8", true)
830 .Case("pwr8", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000831 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000832 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000833 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000834 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000835 .Case("powerpc64le", true)
836 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000837 .Default(false);
838
839 if (CPUKnown)
840 CPU = Name;
841
842 return CPUKnown;
843 }
844
Stephen Hines176edba2014-12-01 14:53:08 -0800845
846 StringRef getABI() const override { return ABI; }
847
Stephen Hines651f13c2014-04-23 16:59:28 -0700848 void getTargetBuiltins(const Builtin::Info *&Records,
849 unsigned &NumRecords) const override {
Chris Lattner4b009652007-07-25 00:24:17 +0000850 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000851 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000852 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000853
Stephen Hines651f13c2014-04-23 16:59:28 -0700854 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000855
Stephen Hines651f13c2014-04-23 16:59:28 -0700856 void getTargetDefines(const LangOptions &Opts,
857 MacroBuilder &Builder) const override;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000858
Stephen Hines651f13c2014-04-23 16:59:28 -0700859 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt199402b2013-02-01 02:14:03 +0000860
Stephen Hines651f13c2014-04-23 16:59:28 -0700861 bool handleTargetFeatures(std::vector<std::string> &Features,
862 DiagnosticsEngine &Diags) override;
863 bool hasFeature(StringRef Feature) const override;
864
865 void getGCCRegNames(const char * const *&Names,
866 unsigned &NumNames) const override;
867 void getGCCRegAliases(const GCCRegAlias *&Aliases,
868 unsigned &NumAliases) const override;
869 bool validateAsmConstraint(const char *&Name,
870 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +0000871 switch (*Name) {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000872 default: return false;
873 case 'O': // Zero
John Thompson1deeb9f2010-06-24 22:44:13 +0000874 break;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000875 case 'b': // Base register
876 case 'f': // Floating point register
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000877 Info.setAllowsRegister();
John Thompson1deeb9f2010-06-24 22:44:13 +0000878 break;
879 // FIXME: The following are added to allow parsing.
880 // I just took a guess at what the actions should be.
881 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000882 case 'd': // Floating point register (containing 64-bit value)
John Thompson1deeb9f2010-06-24 22:44:13 +0000883 case 'v': // Altivec vector register
884 Info.setAllowsRegister();
885 break;
886 case 'w':
887 switch (Name[1]) {
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000888 case 'd':// VSX vector register to hold vector double data
889 case 'f':// VSX vector register to hold vector float data
890 case 's':// VSX vector register to hold scalar float data
891 case 'a':// Any VSX register
Stephen Hines651f13c2014-04-23 16:59:28 -0700892 case 'c':// An individual CR bit
John Thompson1deeb9f2010-06-24 22:44:13 +0000893 break;
894 default:
895 return false;
896 }
897 Info.setAllowsRegister();
898 Name++; // Skip over 'w'.
899 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000900 case 'h': // `MQ', `CTR', or `LINK' register
901 case 'q': // `MQ' register
902 case 'c': // `CTR' register
903 case 'l': // `LINK' register
904 case 'x': // `CR' register (condition register) number 0
905 case 'y': // `CR' register (condition register)
906 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson1deeb9f2010-06-24 22:44:13 +0000907 Info.setAllowsRegister();
908 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000909 case 'I': // Signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000910 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000911 // (use `L' instead for SImode constants)
912 case 'K': // Unsigned 16-bit constant
913 case 'L': // Signed 16-bit constant shifted left 16 bits
914 case 'M': // Constant larger than 31
915 case 'N': // Exact power of 2
916 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000917 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000918 // register with one instruction per word
John Thompson1deeb9f2010-06-24 22:44:13 +0000919 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000920 // into a register using three instructions
John Thompson1deeb9f2010-06-24 22:44:13 +0000921 break;
922 case 'm': // Memory operand. Note that on PowerPC targets, m can
923 // include addresses that update the base register. It
924 // is therefore only safe to use `m' in an asm statement
925 // if that asm statement accesses the operand exactly once.
926 // The asm statement must also use `%U<opno>' as a
Sebastian Redl097ce222010-08-17 22:42:34 +0000927 // placeholder for the "update" flag in the corresponding
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000928 // load or store instruction. For example:
John Thompson1deeb9f2010-06-24 22:44:13 +0000929 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000930 // is correct but:
John Thompson1deeb9f2010-06-24 22:44:13 +0000931 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
932 // is not. Use es rather than m if you don't want the base
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000933 // register to be updated.
934 case 'e':
John Thompsone0a39472010-06-25 00:02:05 +0000935 if (Name[1] != 's')
936 return false;
Sebastian Redl097ce222010-08-17 22:42:34 +0000937 // es: A "stable" memory operand; that is, one which does not
John Thompson1deeb9f2010-06-24 22:44:13 +0000938 // include any automodification of the base register. Unlike
939 // `m', this constraint can be used in asm statements that
940 // might access the operand several times, or that might not
John Thompsone0a39472010-06-25 00:02:05 +0000941 // access it at all.
John Thompson1deeb9f2010-06-24 22:44:13 +0000942 Info.setAllowsMemory();
John Thompsone0a39472010-06-25 00:02:05 +0000943 Name++; // Skip over 'e'.
John Thompson1deeb9f2010-06-24 22:44:13 +0000944 break;
945 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000946 // usually better to use `m' or `es' in asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000947 case 'Z': // Memory operand that is an indexed or indirect from a
948 // register (it is usually better to use `m' or `es' in
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000949 // asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000950 Info.setAllowsMemory();
951 Info.setAllowsRegister();
952 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000953 case 'R': // AIX TOC entry
John Thompson1deeb9f2010-06-24 22:44:13 +0000954 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000955 // register (`p' is preferable for asm statements)
956 case 'S': // Constant suitable as a 64-bit mask operand
957 case 'T': // Constant suitable as a 32-bit mask operand
958 case 'U': // System V Release 4 small data area reference
John Thompson1deeb9f2010-06-24 22:44:13 +0000959 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000960 // instructions
961 case 'W': // Vector constant that does not require memory
962 case 'j': // Vector constant that is all zeros.
John Thompson1deeb9f2010-06-24 22:44:13 +0000963 break;
964 // End FIXME.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000965 }
John Thompson1deeb9f2010-06-24 22:44:13 +0000966 return true;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000967 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700968 std::string convertConstraint(const char *&Constraint) const override {
969 std::string R;
970 switch (*Constraint) {
971 case 'e':
972 case 'w':
973 // Two-character constraint; add "^" hint for later parsing.
974 R = std::string("^") + std::string(Constraint, 2);
975 Constraint++;
976 break;
977 default:
978 return TargetInfo::convertConstraint(Constraint);
979 }
980 return R;
981 }
982 const char *getClobbers() const override {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000983 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000984 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700985 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000986 if (RegNo == 0) return 3;
987 if (RegNo == 1) return 4;
988 return -1;
989 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700990
991 bool hasSjLjLowering() const override {
992 return true;
993 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000994};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000995
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000996const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000997#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000998#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000999 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +00001000#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001001};
Anton Korobeynikove7772382009-05-03 13:42:53 +00001002
Stephen Hines176edba2014-12-01 14:53:08 -08001003/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher16543202013-10-16 21:19:26 +00001004/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +00001005bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher16543202013-10-16 21:19:26 +00001006 DiagnosticsEngine &Diags) {
Eric Christopher16543202013-10-16 21:19:26 +00001007 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1008 // Ignore disabled features.
1009 if (Features[i][0] == '-')
1010 continue;
1011
1012 StringRef Feature = StringRef(Features[i]).substr(1);
1013
1014 if (Feature == "vsx") {
1015 HasVSX = true;
1016 continue;
1017 }
1018
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001019 if (Feature == "bpermd") {
1020 HasBPERMD = true;
1021 continue;
1022 }
1023
1024 if (Feature == "extdiv") {
1025 HasExtDiv = true;
1026 continue;
1027 }
1028
Stephen Hines176edba2014-12-01 14:53:08 -08001029 if (Feature == "power8-vector") {
1030 HasP8Vector = true;
1031 continue;
1032 }
1033
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001034 if (Feature == "crypto") {
1035 HasP8Crypto = true;
1036 continue;
1037 }
1038
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001039 if (Feature == "direct-move") {
1040 HasDirectMove = true;
1041 continue;
1042 }
1043
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001044 if (Feature == "qpx") {
1045 HasQPX = true;
1046 continue;
1047 }
1048
1049 if (Feature == "htm") {
1050 HasHTM = true;
1051 continue;
1052 }
1053
Eric Christopher16543202013-10-16 21:19:26 +00001054 // TODO: Finish this list and add an assert that we've handled them
1055 // all.
1056 }
1057
1058 return true;
1059}
Anton Korobeynikove7772382009-05-03 13:42:53 +00001060
Chris Lattnerbef1d722009-03-02 22:27:17 +00001061/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1062/// #defines that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +00001063void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001064 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00001065 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001066 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +00001067 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001068 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerf8030412010-02-16 18:14:57 +00001069 Builder.defineMacro("__powerpc__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001070 Builder.defineMacro("__POWERPC__");
Chris Lattnerbef1d722009-03-02 22:27:17 +00001071 if (PointerWidth == 64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001072 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerf8030412010-02-16 18:14:57 +00001073 Builder.defineMacro("__powerpc64__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001074 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +00001075 Builder.defineMacro("__PPC64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +00001076 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001077
Chris Lattnerbef1d722009-03-02 22:27:17 +00001078 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001079 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1080 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001081 } else {
1082 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1083 getTriple().getOS() != llvm::Triple::OpenBSD)
1084 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001085 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001086
Stephen Hines176edba2014-12-01 14:53:08 -08001087 // ABI options.
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001088 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Stephen Hines176edba2014-12-01 14:53:08 -08001089 Builder.defineMacro("_CALL_ELF", "1");
1090 if (ABI == "elfv2")
1091 Builder.defineMacro("_CALL_ELF", "2");
1092
Chris Lattnerbef1d722009-03-02 22:27:17 +00001093 // Subtarget options.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001094 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1095 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +00001096
Chris Lattnerbef1d722009-03-02 22:27:17 +00001097 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +00001098 if (LongDoubleWidth == 128)
1099 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencerd5513a32010-10-21 03:16:25 +00001100
John Thompsoned7bdbc2009-11-19 17:18:50 +00001101 if (Opts.AltiVec) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001102 Builder.defineMacro("__VEC__", "10206");
1103 Builder.defineMacro("__ALTIVEC__");
John Thompsoned7bdbc2009-11-19 17:18:50 +00001104 }
Hal Finkel02a84272012-06-11 22:35:19 +00001105
1106 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +00001107 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1108 .Case("440", ArchDefineName)
1109 .Case("450", ArchDefineName | ArchDefine440)
1110 .Case("601", ArchDefineName)
1111 .Case("602", ArchDefineName | ArchDefinePpcgr)
1112 .Case("603", ArchDefineName | ArchDefinePpcgr)
1113 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1114 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1115 .Case("604", ArchDefineName | ArchDefinePpcgr)
1116 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1117 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +00001118 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001119 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1120 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1121 .Case("750", ArchDefineName | ArchDefinePpcgr)
1122 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1123 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001124 .Case("a2", ArchDefineA2)
1125 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +00001126 .Case("pwr3", ArchDefinePpcgr)
1127 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1128 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
Hal Finkel39d5fa12012-07-03 16:51:04 +00001129 | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001130 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1131 | ArchDefinePpcgr | ArchDefinePpcsq)
1132 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1133 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1134 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1135 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1136 | ArchDefinePpcsq)
1137 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1138 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001139 | ArchDefinePpcgr | ArchDefinePpcsq)
1140 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1141 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1142 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001143 .Case("power3", ArchDefinePpcgr)
1144 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1146 | ArchDefinePpcsq)
1147 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1148 | ArchDefinePpcgr | ArchDefinePpcsq)
1149 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1150 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1152 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1153 | ArchDefinePpcsq)
1154 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1155 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001156 | ArchDefinePpcgr | ArchDefinePpcsq)
1157 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1158 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1159 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001160 .Default(ArchDefineNone);
1161
1162 if (defs & ArchDefineName)
1163 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1164 if (defs & ArchDefinePpcgr)
1165 Builder.defineMacro("_ARCH_PPCGR");
1166 if (defs & ArchDefinePpcsq)
1167 Builder.defineMacro("_ARCH_PPCSQ");
1168 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +00001169 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +00001170 if (defs & ArchDefine603)
1171 Builder.defineMacro("_ARCH_603");
1172 if (defs & ArchDefine604)
1173 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +00001174 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001175 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +00001176 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001177 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +00001178 if (defs & ArchDefinePwr5x)
1179 Builder.defineMacro("_ARCH_PWR5X");
1180 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +00001181 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +00001182 if (defs & ArchDefinePwr6x)
1183 Builder.defineMacro("_ARCH_PWR6X");
1184 if (defs & ArchDefinePwr7)
1185 Builder.defineMacro("_ARCH_PWR7");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001186 if (defs & ArchDefinePwr8)
1187 Builder.defineMacro("_ARCH_PWR8");
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001188 if (defs & ArchDefineA2)
1189 Builder.defineMacro("_ARCH_A2");
1190 if (defs & ArchDefineA2q) {
1191 Builder.defineMacro("_ARCH_A2Q");
1192 Builder.defineMacro("_ARCH_QP");
Hal Finkel02a84272012-06-11 22:35:19 +00001193 }
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001194
1195 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1196 Builder.defineMacro("__bg__");
1197 Builder.defineMacro("__THW_BLUEGENE__");
1198 Builder.defineMacro("__bgq__");
1199 Builder.defineMacro("__TOS_BGQ__");
1200 }
Bill Schmidt2821e182013-02-01 20:23:10 +00001201
Eric Christopher16543202013-10-16 21:19:26 +00001202 if (HasVSX)
1203 Builder.defineMacro("__VSX__");
Stephen Hines176edba2014-12-01 14:53:08 -08001204 if (HasP8Vector)
1205 Builder.defineMacro("__POWER8_VECTOR__");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001206 if (HasP8Crypto)
1207 Builder.defineMacro("__CRYPTO__");
1208 if (HasHTM)
1209 Builder.defineMacro("__HTM__");
Eric Christopher16543202013-10-16 21:19:26 +00001210
Bill Schmidt2821e182013-02-01 20:23:10 +00001211 // FIXME: The following are not yet generated here by Clang, but are
1212 // generated by GCC:
1213 //
1214 // _SOFT_FLOAT_
1215 // __RECIP_PRECISION__
1216 // __APPLE_ALTIVEC__
Bill Schmidt2821e182013-02-01 20:23:10 +00001217 // __RECIP__
1218 // __RECIPF__
1219 // __RSQRTE__
1220 // __RSQRTEF__
1221 // _SOFT_DOUBLE_
1222 // __NO_LWSYNC__
1223 // __HAVE_BSWAP__
1224 // __LONGDOUBLE128
1225 // __CMODEL_MEDIUM__
1226 // __CMODEL_LARGE__
1227 // _CALL_SYSV
1228 // _CALL_DARWIN
1229 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001230}
1231
1232void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1233 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1234 .Case("7400", true)
1235 .Case("g4", true)
1236 .Case("7450", true)
1237 .Case("g4+", true)
1238 .Case("970", true)
1239 .Case("g5", true)
1240 .Case("pwr6", true)
1241 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001242 .Case("pwr8", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001243 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001244 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001245 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001246
1247 Features["qpx"] = (CPU == "a2q");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001248 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1249 .Case("ppc64le", true)
1250 .Case("pwr8", true)
1251 .Default(false);
1252 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1253 .Case("ppc64le", true)
1254 .Case("pwr8", true)
1255 .Default(false);
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001256 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1257 .Case("ppc64le", true)
1258 .Case("pwr8", true)
1259 .Case("pwr7", true)
1260 .Default(false);
1261 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1262 .Case("ppc64le", true)
1263 .Case("pwr8", true)
1264 .Case("pwr7", true)
1265 .Default(false);
1266 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1267 .Case("ppc64le", true)
1268 .Case("pwr8", true)
1269 .Default(false);
Bill Schmidt199402b2013-02-01 02:14:03 +00001270}
1271
Douglas Gregore727d212012-01-30 06:38:25 +00001272bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Stephen Hines176edba2014-12-01 14:53:08 -08001273 return llvm::StringSwitch<bool>(Feature)
1274 .Case("powerpc", true)
1275 .Case("vsx", HasVSX)
1276 .Case("power8-vector", HasP8Vector)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001277 .Case("crypto", HasP8Crypto)
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001278 .Case("direct-move", HasDirectMove)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001279 .Case("qpx", HasQPX)
1280 .Case("htm", HasHTM)
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001281 .Case("bpermd", HasBPERMD)
1282 .Case("extdiv", HasExtDiv)
Stephen Hines176edba2014-12-01 14:53:08 -08001283 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00001284}
Chris Lattner9fd73612008-04-21 18:56:49 +00001285
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001286const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattner14d2bb72009-09-16 05:05:27 +00001287 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1288 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1289 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1290 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1291 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1292 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1293 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1294 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001295 "mq", "lr", "ctr", "ap",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001296 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001297 "xer",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001298 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1299 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1300 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1301 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001302 "vrsave", "vscr",
1303 "spe_acc", "spefscr",
1304 "sfp"
1305};
Chris Lattner4b009652007-07-25 00:24:17 +00001306
Anton Korobeynikove7772382009-05-03 13:42:53 +00001307void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001308 unsigned &NumNames) const {
1309 Names = GCCRegNames;
1310 NumNames = llvm::array_lengthof(GCCRegNames);
1311}
Chris Lattner4b009652007-07-25 00:24:17 +00001312
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001313const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1314 // While some of these aliases do map to different registers
1315 // they still share the same register name.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001316 { { "0" }, "r0" },
1317 { { "1"}, "r1" },
1318 { { "2" }, "r2" },
1319 { { "3" }, "r3" },
1320 { { "4" }, "r4" },
1321 { { "5" }, "r5" },
1322 { { "6" }, "r6" },
1323 { { "7" }, "r7" },
1324 { { "8" }, "r8" },
1325 { { "9" }, "r9" },
1326 { { "10" }, "r10" },
1327 { { "11" }, "r11" },
1328 { { "12" }, "r12" },
1329 { { "13" }, "r13" },
1330 { { "14" }, "r14" },
1331 { { "15" }, "r15" },
1332 { { "16" }, "r16" },
1333 { { "17" }, "r17" },
1334 { { "18" }, "r18" },
1335 { { "19" }, "r19" },
1336 { { "20" }, "r20" },
1337 { { "21" }, "r21" },
1338 { { "22" }, "r22" },
1339 { { "23" }, "r23" },
1340 { { "24" }, "r24" },
1341 { { "25" }, "r25" },
1342 { { "26" }, "r26" },
1343 { { "27" }, "r27" },
1344 { { "28" }, "r28" },
1345 { { "29" }, "r29" },
1346 { { "30" }, "r30" },
1347 { { "31" }, "r31" },
1348 { { "fr0" }, "f0" },
1349 { { "fr1" }, "f1" },
1350 { { "fr2" }, "f2" },
1351 { { "fr3" }, "f3" },
1352 { { "fr4" }, "f4" },
1353 { { "fr5" }, "f5" },
1354 { { "fr6" }, "f6" },
1355 { { "fr7" }, "f7" },
1356 { { "fr8" }, "f8" },
1357 { { "fr9" }, "f9" },
Mike Stump369c21c2009-09-17 21:15:00 +00001358 { { "fr10" }, "f10" },
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001359 { { "fr11" }, "f11" },
1360 { { "fr12" }, "f12" },
1361 { { "fr13" }, "f13" },
1362 { { "fr14" }, "f14" },
1363 { { "fr15" }, "f15" },
1364 { { "fr16" }, "f16" },
1365 { { "fr17" }, "f17" },
1366 { { "fr18" }, "f18" },
1367 { { "fr19" }, "f19" },
1368 { { "fr20" }, "f20" },
1369 { { "fr21" }, "f21" },
1370 { { "fr22" }, "f22" },
1371 { { "fr23" }, "f23" },
1372 { { "fr24" }, "f24" },
1373 { { "fr25" }, "f25" },
1374 { { "fr26" }, "f26" },
1375 { { "fr27" }, "f27" },
1376 { { "fr28" }, "f28" },
1377 { { "fr29" }, "f29" },
1378 { { "fr30" }, "f30" },
1379 { { "fr31" }, "f31" },
1380 { { "cc" }, "cr0" },
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001381};
1382
Anton Korobeynikove7772382009-05-03 13:42:53 +00001383void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001384 unsigned &NumAliases) const {
1385 Aliases = GCCRegAliases;
1386 NumAliases = llvm::array_lengthof(GCCRegAliases);
1387}
Chris Lattner4b009652007-07-25 00:24:17 +00001388
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001389class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001390public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001391 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001392 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerf8030412010-02-16 18:14:57 +00001393
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001394 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001395 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001396 case llvm::Triple::FreeBSD:
1397 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001398 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001399 PtrDiffType = SignedInt;
1400 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001401 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001402 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001403 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001404 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001405
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001406 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1407 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001408 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001409 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001410
1411 // PPC32 supports atomics up to 4 bytes.
1412 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001413 }
1414
Stephen Hines651f13c2014-04-23 16:59:28 -07001415 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001416 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001417 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman2b161652008-08-21 00:13:15 +00001418 }
Chris Lattner4b009652007-07-25 00:24:17 +00001419};
Chris Lattner4b009652007-07-25 00:24:17 +00001420
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001421// Note: ABI differences may eventually require us to have a separate
1422// TargetInfo for little endian.
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001423class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001424public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001425 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00001426 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman38e31802009-07-01 03:36:11 +00001427 IntMaxType = SignedLong;
Eli Friedman38e31802009-07-01 03:36:11 +00001428 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001429
Stephen Hines176edba2014-12-01 14:53:08 -08001430 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1431 DescriptionString = "e-m:e-i64:64-n32:64";
1432 ABI = "elfv2";
1433 } else {
1434 DescriptionString = "E-m:e-i64:64-n32:64";
1435 ABI = "elfv1";
1436 }
1437
1438 switch (getTriple().getOS()) {
1439 case llvm::Triple::FreeBSD:
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001440 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001441 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines176edba2014-12-01 14:53:08 -08001442 break;
1443 case llvm::Triple::NetBSD:
1444 IntMaxType = SignedLongLong;
1445 Int64Type = SignedLongLong;
1446 break;
1447 default:
1448 break;
1449 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001450
1451 // PPC64 supports atomics up to 8 bytes.
1452 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnere5fde952008-05-09 06:17:04 +00001453 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001454 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001455 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001456 }
Stephen Hines176edba2014-12-01 14:53:08 -08001457 // PPC64 Linux-specifc ABI options.
1458 bool setABI(const std::string &Name) override {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001459 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Stephen Hines176edba2014-12-01 14:53:08 -08001460 ABI = Name;
1461 return true;
1462 }
1463 return false;
1464 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001465};
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001466
Roman Divackyc81f2a22011-01-06 08:27:10 +00001467class DarwinPPC32TargetInfo :
1468 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001469public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001470 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1471 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001472 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001473 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Stephen Hines176edba2014-12-01 14:53:08 -08001474 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001475 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001476 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001477 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001478 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001479 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001480 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001481 }
1482};
1483
1484class DarwinPPC64TargetInfo :
1485 public DarwinTargetInfo<PPC64TargetInfo> {
1486public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001487 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1488 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001489 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001490 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001491 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001492 }
1493};
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001494
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001495 static const unsigned NVPTXAddrSpaceMap[] = {
1496 1, // opencl_global
1497 3, // opencl_local
1498 4, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001499 // FIXME: generic has to be added to the target
1500 0, // opencl_generic
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001501 1, // cuda_device
1502 4, // cuda_constant
1503 3, // cuda_shared
Justin Holewinski25bedca2011-10-03 17:28:37 +00001504 };
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001505 class NVPTXTargetInfo : public TargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001506 static const char * const GCCRegNames[];
1507 static const Builtin::Info BuiltinInfo[];
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001508
1509 // The GPU profiles supported by the NVPTX backend
1510 enum GPUKind {
1511 GK_NONE,
1512 GK_SM20,
1513 GK_SM21,
1514 GK_SM30,
1515 GK_SM35,
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001516 GK_SM37,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001517 } GPU;
1518
Justin Holewinski285dc652011-04-20 19:34:15 +00001519 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001520 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001521 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +00001522 TLSSupported = false;
1523 LongWidth = LongAlign = 64;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001524 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001525 UseAddrSpaceMapMangling = true;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001526 // Define available target features
Justin Holewinski2c585b92012-05-24 17:43:12 +00001527 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001528 NoAsmVariants = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001529 // Set the default GPU to sm20
1530 GPU = GK_SM20;
Justin Holewinski285dc652011-04-20 19:34:15 +00001531 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001532 void getTargetDefines(const LangOptions &Opts,
1533 MacroBuilder &Builder) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001534 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001535 Builder.defineMacro("__NVPTX__");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001536 if (Opts.CUDAIsDevice) {
1537 // Set __CUDA_ARCH__ for the GPU specified.
1538 std::string CUDAArchCode;
1539 switch (GPU) {
1540 case GK_SM20:
1541 CUDAArchCode = "200";
1542 break;
1543 case GK_SM21:
1544 CUDAArchCode = "210";
1545 break;
1546 case GK_SM30:
1547 CUDAArchCode = "300";
1548 break;
1549 case GK_SM35:
1550 CUDAArchCode = "350";
1551 break;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001552 case GK_SM37:
1553 CUDAArchCode = "370";
1554 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001555 default:
1556 llvm_unreachable("Unhandled target CPU");
1557 }
1558 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1559 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001560 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001561 void getTargetBuiltins(const Builtin::Info *&Records,
1562 unsigned &NumRecords) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001563 Records = BuiltinInfo;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001564 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Justin Holewinski285dc652011-04-20 19:34:15 +00001565 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001566 bool hasFeature(StringRef Feature) const override {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001567 return Feature == "ptx" || Feature == "nvptx";
Douglas Gregore727d212012-01-30 06:38:25 +00001568 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001569
1570 void getGCCRegNames(const char * const *&Names,
1571 unsigned &NumNames) const override;
1572 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1573 unsigned &NumAliases) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001574 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001575 Aliases = nullptr;
Justin Holewinski285dc652011-04-20 19:34:15 +00001576 NumAliases = 0;
1577 }
Stephen Hines176edba2014-12-01 14:53:08 -08001578 bool
1579 validateAsmConstraint(const char *&Name,
1580 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001581 switch (*Name) {
1582 default: return false;
1583 case 'c':
1584 case 'h':
1585 case 'r':
1586 case 'l':
1587 case 'f':
1588 case 'd':
1589 Info.setAllowsRegister();
1590 return true;
1591 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001592 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001593 const char *getClobbers() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001594 // FIXME: Is this really right?
1595 return "";
1596 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001597 BuiltinVaListKind getBuiltinVaListKind() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001598 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001599 return TargetInfo::CharPtrBuiltinVaList;
Justin Holewinski285dc652011-04-20 19:34:15 +00001600 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001601 bool setCPU(const std::string &Name) override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001602 GPU = llvm::StringSwitch<GPUKind>(Name)
1603 .Case("sm_20", GK_SM20)
1604 .Case("sm_21", GK_SM21)
1605 .Case("sm_30", GK_SM30)
1606 .Case("sm_35", GK_SM35)
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001607 .Case("sm_37", GK_SM37)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001608 .Default(GK_NONE);
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001609
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001610 return GPU != GK_NONE;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001611 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001612 };
1613
Justin Holewinski2c585b92012-05-24 17:43:12 +00001614 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001615#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +00001616#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001617 ALL_LANGUAGES },
Justin Holewinski2c585b92012-05-24 17:43:12 +00001618#include "clang/Basic/BuiltinsNVPTX.def"
Justin Holewinski285dc652011-04-20 19:34:15 +00001619 };
1620
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001621 const char * const NVPTXTargetInfo::GCCRegNames[] = {
Justin Holewinski285dc652011-04-20 19:34:15 +00001622 "r0"
1623 };
1624
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001625 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
Justin Holewinski285dc652011-04-20 19:34:15 +00001626 unsigned &NumNames) const {
1627 Names = GCCRegNames;
1628 NumNames = llvm::array_lengthof(GCCRegNames);
1629 }
1630
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001631 class NVPTX32TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001632 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001633 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001634 PointerWidth = PointerAlign = 32;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001635 SizeType = TargetInfo::UnsignedInt;
1636 PtrDiffType = TargetInfo::SignedInt;
Stephen Hines176edba2014-12-01 14:53:08 -08001637 IntPtrType = TargetInfo::SignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07001638 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001639 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001640 };
1641
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001642 class NVPTX64TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001643 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001644 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001645 PointerWidth = PointerAlign = 64;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001646 SizeType = TargetInfo::UnsignedLong;
1647 PtrDiffType = TargetInfo::SignedLong;
1648 IntPtrType = TargetInfo::SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07001649 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001650 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001651 };
Eli Friedman6505a292012-10-12 23:32:00 +00001652
1653static const unsigned R600AddrSpaceMap[] = {
1654 1, // opencl_global
1655 3, // opencl_local
1656 2, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001657 4, // opencl_generic
Eli Friedman6505a292012-10-12 23:32:00 +00001658 1, // cuda_device
1659 2, // cuda_constant
1660 3 // cuda_shared
1661};
1662
Stephen Hines176edba2014-12-01 14:53:08 -08001663// If you edit the description strings, make sure you update
1664// getPointerWidthV().
1665
Tom Stellardfd075912013-03-04 17:40:53 +00001666static const char *DescriptionStringR600 =
Stephen Hines651f13c2014-04-23 16:59:28 -07001667 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1668 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001669
1670static const char *DescriptionStringR600DoubleOps =
Stephen Hines651f13c2014-04-23 16:59:28 -07001671 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1672 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001673
1674static const char *DescriptionStringSI =
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001675 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Stephen Hines651f13c2014-04-23 16:59:28 -07001676 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1677 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001678
Eli Friedman6505a292012-10-12 23:32:00 +00001679class R600TargetInfo : public TargetInfo {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001680 static const Builtin::Info BuiltinInfo[];
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001681 static const char * const GCCRegNames[];
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001682
Tom Stellardfd075912013-03-04 17:40:53 +00001683 /// \brief The GPU profiles supported by the R600 target.
1684 enum GPUKind {
1685 GK_NONE,
1686 GK_R600,
1687 GK_R600_DOUBLE_OPS,
1688 GK_R700,
1689 GK_R700_DOUBLE_OPS,
1690 GK_EVERGREEN,
1691 GK_EVERGREEN_DOUBLE_OPS,
1692 GK_NORTHERN_ISLANDS,
1693 GK_CAYMAN,
Tom Stellard42317042013-10-29 16:38:29 +00001694 GK_SOUTHERN_ISLANDS,
1695 GK_SEA_ISLANDS
Tom Stellardfd075912013-03-04 17:40:53 +00001696 } GPU;
1697
Eli Friedman6505a292012-10-12 23:32:00 +00001698public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001699 R600TargetInfo(const llvm::Triple &Triple)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001700 : TargetInfo(Triple) {
1701
1702 if (Triple.getArch() == llvm::Triple::amdgcn) {
1703 DescriptionString = DescriptionStringSI;
1704 GPU = GK_SOUTHERN_ISLANDS;
1705 } else {
1706 DescriptionString = DescriptionStringR600;
1707 GPU = GK_R600;
1708 }
Eli Friedman6505a292012-10-12 23:32:00 +00001709 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001710 UseAddrSpaceMapMangling = true;
Eli Friedman6505a292012-10-12 23:32:00 +00001711 }
1712
Stephen Hines176edba2014-12-01 14:53:08 -08001713 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1714 if (GPU <= GK_CAYMAN)
1715 return 32;
1716
1717 switch(AddrSpace) {
1718 default:
1719 return 64;
1720 case 0:
1721 case 3:
1722 case 5:
1723 return 32;
1724 }
1725 }
1726
Stephen Hines651f13c2014-04-23 16:59:28 -07001727 const char * getClobbers() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001728 return "";
1729 }
1730
Stephen Hines651f13c2014-04-23 16:59:28 -07001731 void getGCCRegNames(const char * const *&Names,
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001732 unsigned &NumNames) const override;
Eli Friedman6505a292012-10-12 23:32:00 +00001733
Stephen Hines651f13c2014-04-23 16:59:28 -07001734 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1735 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001736 Aliases = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001737 NumAliases = 0;
1738 }
1739
Stephen Hines651f13c2014-04-23 16:59:28 -07001740 bool validateAsmConstraint(const char *&Name,
1741 TargetInfo::ConstraintInfo &info) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001742 return true;
1743 }
1744
Stephen Hines651f13c2014-04-23 16:59:28 -07001745 void getTargetBuiltins(const Builtin::Info *&Records,
1746 unsigned &NumRecords) const override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001747 Records = BuiltinInfo;
1748 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedman6505a292012-10-12 23:32:00 +00001749 }
1750
Stephen Hines651f13c2014-04-23 16:59:28 -07001751 void getTargetDefines(const LangOptions &Opts,
1752 MacroBuilder &Builder) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001753 Builder.defineMacro("__R600__");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07001754 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1755 Builder.defineMacro("cl_khr_fp64");
Eli Friedman6505a292012-10-12 23:32:00 +00001756 }
1757
Stephen Hines651f13c2014-04-23 16:59:28 -07001758 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001759 return TargetInfo::CharPtrBuiltinVaList;
1760 }
1761
Stephen Hines651f13c2014-04-23 16:59:28 -07001762 bool setCPU(const std::string &Name) override {
Tom Stellardfd075912013-03-04 17:40:53 +00001763 GPU = llvm::StringSwitch<GPUKind>(Name)
1764 .Case("r600" , GK_R600)
1765 .Case("rv610", GK_R600)
1766 .Case("rv620", GK_R600)
1767 .Case("rv630", GK_R600)
1768 .Case("rv635", GK_R600)
1769 .Case("rs780", GK_R600)
1770 .Case("rs880", GK_R600)
1771 .Case("rv670", GK_R600_DOUBLE_OPS)
1772 .Case("rv710", GK_R700)
1773 .Case("rv730", GK_R700)
1774 .Case("rv740", GK_R700_DOUBLE_OPS)
1775 .Case("rv770", GK_R700_DOUBLE_OPS)
1776 .Case("palm", GK_EVERGREEN)
1777 .Case("cedar", GK_EVERGREEN)
1778 .Case("sumo", GK_EVERGREEN)
1779 .Case("sumo2", GK_EVERGREEN)
1780 .Case("redwood", GK_EVERGREEN)
1781 .Case("juniper", GK_EVERGREEN)
1782 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1783 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1784 .Case("barts", GK_NORTHERN_ISLANDS)
1785 .Case("turks", GK_NORTHERN_ISLANDS)
1786 .Case("caicos", GK_NORTHERN_ISLANDS)
1787 .Case("cayman", GK_CAYMAN)
1788 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001789 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001790 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1791 .Case("verde", GK_SOUTHERN_ISLANDS)
1792 .Case("oland", GK_SOUTHERN_ISLANDS)
Stephen Hines176edba2014-12-01 14:53:08 -08001793 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard42317042013-10-29 16:38:29 +00001794 .Case("bonaire", GK_SEA_ISLANDS)
1795 .Case("kabini", GK_SEA_ISLANDS)
1796 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard0de6bc82013-11-14 23:45:53 +00001797 .Case("hawaii", GK_SEA_ISLANDS)
Stephen Hines176edba2014-12-01 14:53:08 -08001798 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001799 .Default(GK_NONE);
1800
1801 if (GPU == GK_NONE) {
1802 return false;
1803 }
1804
1805 // Set the correct data layout
1806 switch (GPU) {
1807 case GK_NONE:
1808 case GK_R600:
1809 case GK_R700:
1810 case GK_EVERGREEN:
1811 case GK_NORTHERN_ISLANDS:
1812 DescriptionString = DescriptionStringR600;
1813 break;
1814 case GK_R600_DOUBLE_OPS:
1815 case GK_R700_DOUBLE_OPS:
1816 case GK_EVERGREEN_DOUBLE_OPS:
1817 case GK_CAYMAN:
1818 DescriptionString = DescriptionStringR600DoubleOps;
1819 break;
1820 case GK_SOUTHERN_ISLANDS:
Tom Stellard42317042013-10-29 16:38:29 +00001821 case GK_SEA_ISLANDS:
Tom Stellardfd075912013-03-04 17:40:53 +00001822 DescriptionString = DescriptionStringSI;
1823 break;
1824 }
1825
1826 return true;
1827 }
Eli Friedman6505a292012-10-12 23:32:00 +00001828};
1829
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001830const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1831#define BUILTIN(ID, TYPE, ATTRS) \
1832 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1833#include "clang/Basic/BuiltinsR600.def"
1834};
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07001835const char * const R600TargetInfo::GCCRegNames[] = {
1836 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1837 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1838 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1839 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1840 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1841 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1842 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1843 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1844 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1845 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1846 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1847 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1848 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1849 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1850 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1851 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1852 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1853 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1854 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1855 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1856 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1857 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1858 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1859 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1860 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1861 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1862 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1863 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1864 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1865 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1866 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1867 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1868 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1869 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1870 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1871 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1872 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1873 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1874 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1875 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1876 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1877 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1878 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1879 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1880 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1881 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1882 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1883 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1884 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1885 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1886};
1887
1888void R600TargetInfo::getGCCRegNames(const char * const *&Names,
1889 unsigned &NumNames) const {
1890 Names = GCCRegNames;
1891 NumNames = llvm::array_lengthof(GCCRegNames);
1892}
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001893
Eli Friedman872996c2008-08-20 02:34:37 +00001894// Namespace for x86 abstract base class
1895const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001896#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001897#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001898 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +00001899#include "clang/Basic/BuiltinsX86.def"
Eli Friedman872996c2008-08-20 02:34:37 +00001900};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001901
Nuno Lopesad1010d2009-12-23 17:49:57 +00001902static const char* const GCCRegNames[] = {
Eli Friedman872996c2008-08-20 02:34:37 +00001903 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1904 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001905 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman872996c2008-08-20 02:34:37 +00001906 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1907 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1908 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001909 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001910 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1911 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman872996c2008-08-20 02:34:37 +00001912};
1913
Eric Christophercfd323d2011-06-21 00:05:20 +00001914const TargetInfo::AddlRegName AddlRegNames[] = {
1915 { { "al", "ah", "eax", "rax" }, 0 },
1916 { { "bl", "bh", "ebx", "rbx" }, 3 },
1917 { { "cl", "ch", "ecx", "rcx" }, 2 },
1918 { { "dl", "dh", "edx", "rdx" }, 1 },
1919 { { "esi", "rsi" }, 4 },
1920 { { "edi", "rdi" }, 5 },
1921 { { "esp", "rsp" }, 7 },
1922 { { "ebp", "rbp" }, 6 },
Eli Friedman872996c2008-08-20 02:34:37 +00001923};
1924
1925// X86 target abstract base class; x86-32 and x86-64 are very close, so
1926// most of the implementation can be shared.
1927class X86TargetInfo : public TargetInfo {
Chris Lattner715fe4c2009-03-02 22:40:39 +00001928 enum X86SSEEnum {
Craig Topperb7a95d22013-08-21 03:59:22 +00001929 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner715fe4c2009-03-02 22:40:39 +00001930 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001931 enum MMX3DNowEnum {
1932 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1933 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001934 enum XOPEnum {
1935 NoXOP,
1936 SSE4A,
1937 FMA4,
1938 XOP
1939 } XOPLevel;
Anders Carlssone5e222f2010-01-27 03:47:49 +00001940
Eric Christopher6c4e7872010-04-02 23:50:19 +00001941 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001942 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001943 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001944 bool HasRDRND;
Stephen Hines176edba2014-12-01 14:53:08 -08001945 bool HasFSGSBASE;
Craig Topper31ceea02011-12-25 05:06:45 +00001946 bool HasBMI;
1947 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001948 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001949 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001950 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001951 bool HasRDSEED;
Stephen Hines176edba2014-12-01 14:53:08 -08001952 bool HasADX;
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001953 bool HasTBM;
Craig Topper2ae95072012-06-03 21:46:30 +00001954 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001955 bool HasF16C;
Stephen Hines176edba2014-12-01 14:53:08 -08001956 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1957 HasAVX512VL;
Ben Langmuirb83f5a72013-09-19 13:22:04 +00001958 bool HasSHA;
Nick Lewyckyaf945462013-10-05 20:14:27 +00001959 bool HasCX16;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001960
Chandler Carruth499d9722011-09-28 08:55:34 +00001961 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1962 ///
1963 /// Each enumeration represents a particular CPU supported by Clang. These
1964 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1965 enum CPUKind {
1966 CK_Generic,
1967
1968 /// \name i386
1969 /// i386-generation processors.
1970 //@{
1971 CK_i386,
1972 //@}
1973
1974 /// \name i486
1975 /// i486-generation processors.
1976 //@{
1977 CK_i486,
1978 CK_WinChipC6,
1979 CK_WinChip2,
1980 CK_C3,
1981 //@}
1982
1983 /// \name i586
1984 /// i586-generation processors, P5 microarchitecture based.
1985 //@{
1986 CK_i586,
1987 CK_Pentium,
1988 CK_PentiumMMX,
1989 //@}
1990
1991 /// \name i686
1992 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1993 //@{
1994 CK_i686,
1995 CK_PentiumPro,
1996 CK_Pentium2,
1997 CK_Pentium3,
1998 CK_Pentium3M,
1999 CK_PentiumM,
2000 CK_C3_2,
2001
2002 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2003 /// Clang however has some logic to suport this.
2004 // FIXME: Warn, deprecate, and potentially remove this.
2005 CK_Yonah,
2006 //@}
2007
2008 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00002009 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00002010 //@{
2011 CK_Pentium4,
2012 CK_Pentium4M,
2013 CK_Prescott,
2014 CK_Nocona,
2015 //@}
2016
2017 /// \name Core
2018 /// Core microarchitecture based processors.
2019 //@{
2020 CK_Core2,
2021
2022 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2023 /// codename which GCC no longer accepts as an option to -march, but Clang
2024 /// has some logic for recognizing it.
2025 // FIXME: Warn, deprecate, and potentially remove this.
2026 CK_Penryn,
2027 //@}
2028
2029 /// \name Atom
2030 /// Atom processors
2031 //@{
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002032 CK_Bonnell,
Preston Gurdc57ea682013-09-13 19:27:17 +00002033 CK_Silvermont,
Chandler Carruth499d9722011-09-28 08:55:34 +00002034 //@}
2035
2036 /// \name Nehalem
2037 /// Nehalem microarchitecture based processors.
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002038 CK_Nehalem,
2039
2040 /// \name Westmere
2041 /// Westmere microarchitecture based processors.
2042 CK_Westmere,
2043
2044 /// \name Sandy Bridge
2045 /// Sandy Bridge microarchitecture based processors.
2046 CK_SandyBridge,
2047
2048 /// \name Ivy Bridge
2049 /// Ivy Bridge microarchitecture based processors.
2050 CK_IvyBridge,
2051
2052 /// \name Haswell
2053 /// Haswell microarchitecture based processors.
2054 CK_Haswell,
2055
2056 /// \name Broadwell
2057 /// Broadwell microarchitecture based processors.
Stephen Hines176edba2014-12-01 14:53:08 -08002058 CK_Broadwell,
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002059
2060 /// \name Skylake
2061 /// Skylake microarchitecture based processors.
2062 CK_Skylake,
Chandler Carruth499d9722011-09-28 08:55:34 +00002063
Craig Topper10c2c682013-08-20 07:09:39 +00002064 /// \name Knights Landing
2065 /// Knights Landing processor.
2066 CK_KNL,
2067
Chandler Carruth499d9722011-09-28 08:55:34 +00002068 /// \name K6
2069 /// K6 architecture processors.
2070 //@{
2071 CK_K6,
2072 CK_K6_2,
2073 CK_K6_3,
2074 //@}
2075
2076 /// \name K7
2077 /// K7 architecture processors.
2078 //@{
2079 CK_Athlon,
2080 CK_AthlonThunderbird,
2081 CK_Athlon4,
2082 CK_AthlonXP,
2083 CK_AthlonMP,
2084 //@}
2085
2086 /// \name K8
2087 /// K8 architecture processors.
2088 //@{
2089 CK_Athlon64,
2090 CK_Athlon64SSE3,
2091 CK_AthlonFX,
2092 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002093 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00002094 CK_Opteron,
2095 CK_OpteronSSE3,
Roman Divackyf051cde2011-10-30 07:48:46 +00002096 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002097 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00002098
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002099 /// \name Bobcat
2100 /// Bobcat architecture processors.
2101 //@{
2102 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00002103 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002104 //@}
2105
2106 /// \name Bulldozer
2107 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002108 //@{
2109 CK_BDVER1,
2110 CK_BDVER2,
Benjamin Kramera2420962013-11-04 10:29:51 +00002111 CK_BDVER3,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002112 CK_BDVER4,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002113 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002114
Chandler Carruth499d9722011-09-28 08:55:34 +00002115 /// This specification is deprecated and will be removed in the future.
2116 /// Users should prefer \see CK_K8.
2117 // FIXME: Warn on this when the CPU is set to it.
Stephen Hines176edba2014-12-01 14:53:08 -08002118 //@{
Chandler Carruth499d9722011-09-28 08:55:34 +00002119 CK_x86_64,
2120 //@}
2121
2122 /// \name Geode
2123 /// Geode processors.
2124 //@{
2125 CK_Geode
2126 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002127 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00002128
Rafael Espindola5389b842013-08-21 21:59:03 +00002129 enum FPMathKind {
2130 FP_Default,
2131 FP_SSE,
2132 FP_387
2133 } FPMath;
2134
Eli Friedman872996c2008-08-20 02:34:37 +00002135public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002136 X86TargetInfo(const llvm::Triple &Triple)
2137 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002138 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Stephen Hines176edba2014-12-01 14:53:08 -08002139 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2140 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2141 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2142 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2143 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2144 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002145 BigEndian = false;
Eli Friedman872996c2008-08-20 02:34:37 +00002146 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +00002147 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002148 unsigned getFloatEvalMethod() const override {
Benjamin Kramerb4066692011-12-28 15:47:06 +00002149 // X87 evaluates with 80 bits "long double" precision.
2150 return SSELevel == NoSSE ? 2 : 0;
2151 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002152 void getTargetBuiltins(const Builtin::Info *&Records,
2153 unsigned &NumRecords) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00002154 Records = BuiltinInfo;
2155 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +00002156 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002157 void getGCCRegNames(const char * const *&Names,
2158 unsigned &NumNames) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00002159 Names = GCCRegNames;
2160 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +00002161 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002162 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2163 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002164 Aliases = nullptr;
Eric Christophercfd323d2011-06-21 00:05:20 +00002165 NumAliases = 0;
2166 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002167 void getGCCAddlRegNames(const AddlRegName *&Names,
2168 unsigned &NumNames) const override {
Eric Christophercfd323d2011-06-21 00:05:20 +00002169 Names = AddlRegNames;
2170 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00002171 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002172 bool validateAsmConstraint(const char *&Name,
Stephen Hines176edba2014-12-01 14:53:08 -08002173 TargetInfo::ConstraintInfo &info) const override;
2174
2175 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2176
2177 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2178
2179 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2180
Stephen Hines651f13c2014-04-23 16:59:28 -07002181 std::string convertConstraint(const char *&Constraint) const override;
2182 const char *getClobbers() const override {
Eli Friedman872996c2008-08-20 02:34:37 +00002183 return "~{dirflag},~{fpsr},~{flags}";
2184 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002185 void getTargetDefines(const LangOptions &Opts,
2186 MacroBuilder &Builder) const override;
Craig Topper319d81f2013-09-17 04:12:55 +00002187 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2188 bool Enabled);
2189 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2190 bool Enabled);
2191 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2192 bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07002193 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2194 StringRef Name, bool Enabled) const override {
Craig Topper85bfef62013-09-17 04:51:29 +00002195 setFeatureEnabledImpl(Features, Name, Enabled);
2196 }
2197 // This exists purely to cut down on the number of virtual calls in
2198 // getDefaultFeatures which calls this repeatedly.
2199 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2200 StringRef Name, bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07002201 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2202 bool hasFeature(StringRef Feature) const override;
2203 bool handleTargetFeatures(std::vector<std::string> &Features,
2204 DiagnosticsEngine &Diags) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07002205 StringRef getABI() const override {
Derek Schuffbabaf312012-10-11 15:52:22 +00002206 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00002207 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00002208 else if (getTriple().getArch() == llvm::Triple::x86 &&
2209 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00002210 return "no-mmx";
2211 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002212 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002213 bool setCPU(const std::string &Name) override {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002214 CPU = llvm::StringSwitch<CPUKind>(Name)
2215 .Case("i386", CK_i386)
2216 .Case("i486", CK_i486)
2217 .Case("winchip-c6", CK_WinChipC6)
2218 .Case("winchip2", CK_WinChip2)
2219 .Case("c3", CK_C3)
2220 .Case("i586", CK_i586)
2221 .Case("pentium", CK_Pentium)
2222 .Case("pentium-mmx", CK_PentiumMMX)
2223 .Case("i686", CK_i686)
2224 .Case("pentiumpro", CK_PentiumPro)
2225 .Case("pentium2", CK_Pentium2)
2226 .Case("pentium3", CK_Pentium3)
2227 .Case("pentium3m", CK_Pentium3M)
2228 .Case("pentium-m", CK_PentiumM)
2229 .Case("c3-2", CK_C3_2)
2230 .Case("yonah", CK_Yonah)
2231 .Case("pentium4", CK_Pentium4)
2232 .Case("pentium4m", CK_Pentium4M)
2233 .Case("prescott", CK_Prescott)
2234 .Case("nocona", CK_Nocona)
2235 .Case("core2", CK_Core2)
2236 .Case("penryn", CK_Penryn)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002237 .Case("bonnell", CK_Bonnell)
2238 .Case("atom", CK_Bonnell) // Legacy name.
2239 .Case("silvermont", CK_Silvermont)
2240 .Case("slm", CK_Silvermont) // Legacy name.
2241 .Case("nehalem", CK_Nehalem)
2242 .Case("corei7", CK_Nehalem) // Legacy name.
2243 .Case("westmere", CK_Westmere)
2244 .Case("sandybridge", CK_SandyBridge)
2245 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2246 .Case("ivybridge", CK_IvyBridge)
2247 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2248 .Case("haswell", CK_Haswell)
2249 .Case("core-avx2", CK_Haswell) // Legacy name.
Stephen Hines176edba2014-12-01 14:53:08 -08002250 .Case("broadwell", CK_Broadwell)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002251 .Case("skylake", CK_Skylake)
2252 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper10c2c682013-08-20 07:09:39 +00002253 .Case("knl", CK_KNL)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002254 .Case("k6", CK_K6)
2255 .Case("k6-2", CK_K6_2)
2256 .Case("k6-3", CK_K6_3)
2257 .Case("athlon", CK_Athlon)
2258 .Case("athlon-tbird", CK_AthlonThunderbird)
2259 .Case("athlon-4", CK_Athlon4)
2260 .Case("athlon-xp", CK_AthlonXP)
2261 .Case("athlon-mp", CK_AthlonMP)
2262 .Case("athlon64", CK_Athlon64)
2263 .Case("athlon64-sse3", CK_Athlon64SSE3)
2264 .Case("athlon-fx", CK_AthlonFX)
2265 .Case("k8", CK_K8)
2266 .Case("k8-sse3", CK_K8SSE3)
2267 .Case("opteron", CK_Opteron)
2268 .Case("opteron-sse3", CK_OpteronSSE3)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002269 .Case("barcelona", CK_AMDFAM10)
Roman Divackyf051cde2011-10-30 07:48:46 +00002270 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002271 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00002272 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002273 .Case("bdver1", CK_BDVER1)
2274 .Case("bdver2", CK_BDVER2)
Benjamin Kramera2420962013-11-04 10:29:51 +00002275 .Case("bdver3", CK_BDVER3)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002276 .Case("bdver4", CK_BDVER4)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002277 .Case("x86-64", CK_x86_64)
2278 .Case("geode", CK_Geode)
2279 .Default(CK_Generic);
2280
Chandler Carruth26a39142011-09-28 09:45:08 +00002281 // Perform any per-CPU checks necessary to determine if this CPU is
2282 // acceptable.
2283 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2284 // invalid without explaining *why*.
2285 switch (CPU) {
2286 case CK_Generic:
2287 // No processor selected!
2288 return false;
2289
2290 case CK_i386:
2291 case CK_i486:
2292 case CK_WinChipC6:
2293 case CK_WinChip2:
2294 case CK_C3:
2295 case CK_i586:
2296 case CK_Pentium:
2297 case CK_PentiumMMX:
2298 case CK_i686:
2299 case CK_PentiumPro:
2300 case CK_Pentium2:
2301 case CK_Pentium3:
2302 case CK_Pentium3M:
2303 case CK_PentiumM:
2304 case CK_Yonah:
2305 case CK_C3_2:
2306 case CK_Pentium4:
2307 case CK_Pentium4M:
2308 case CK_Prescott:
2309 case CK_K6:
2310 case CK_K6_2:
2311 case CK_K6_3:
2312 case CK_Athlon:
2313 case CK_AthlonThunderbird:
2314 case CK_Athlon4:
2315 case CK_AthlonXP:
2316 case CK_AthlonMP:
2317 case CK_Geode:
2318 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00002319 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00002320 return false;
2321
2322 // Fallthrough
2323 case CK_Nocona:
2324 case CK_Core2:
2325 case CK_Penryn:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002326 case CK_Bonnell:
Preston Gurdc57ea682013-09-13 19:27:17 +00002327 case CK_Silvermont:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002328 case CK_Nehalem:
2329 case CK_Westmere:
2330 case CK_SandyBridge:
2331 case CK_IvyBridge:
2332 case CK_Haswell:
Stephen Hines176edba2014-12-01 14:53:08 -08002333 case CK_Broadwell:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002334 case CK_Skylake:
Craig Topper10c2c682013-08-20 07:09:39 +00002335 case CK_KNL:
Chandler Carruth26a39142011-09-28 09:45:08 +00002336 case CK_Athlon64:
2337 case CK_Athlon64SSE3:
2338 case CK_AthlonFX:
2339 case CK_K8:
2340 case CK_K8SSE3:
2341 case CK_Opteron:
2342 case CK_OpteronSSE3:
Roman Divackyf051cde2011-10-30 07:48:46 +00002343 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002344 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00002345 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002346 case CK_BDVER1:
2347 case CK_BDVER2:
Benjamin Kramera2420962013-11-04 10:29:51 +00002348 case CK_BDVER3:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002349 case CK_BDVER4:
Chandler Carruth26a39142011-09-28 09:45:08 +00002350 case CK_x86_64:
2351 return true;
2352 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002353 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002354 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002355
Stephen Hines651f13c2014-04-23 16:59:28 -07002356 bool setFPMath(StringRef Name) override;
Rafael Espindola5389b842013-08-21 21:59:03 +00002357
Stephen Hines651f13c2014-04-23 16:59:28 -07002358 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00002359 // We accept all non-ARM calling conventions
2360 return (CC == CC_X86ThisCall ||
2361 CC == CC_X86FastCall ||
Stephen Hines176edba2014-12-01 14:53:08 -08002362 CC == CC_X86StdCall ||
2363 CC == CC_X86VectorCall ||
2364 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002365 CC == CC_X86Pascal ||
2366 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002367 }
2368
Stephen Hines651f13c2014-04-23 16:59:28 -07002369 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00002370 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002371 }
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002372
2373 bool hasSjLjLowering() const override {
2374 return true;
2375 }
Chris Lattner4b009652007-07-25 00:24:17 +00002376};
Chris Lattner7d6220c2009-03-02 22:20:04 +00002377
Rafael Espindola5389b842013-08-21 21:59:03 +00002378bool X86TargetInfo::setFPMath(StringRef Name) {
2379 if (Name == "387") {
2380 FPMath = FP_387;
2381 return true;
2382 }
2383 if (Name == "sse") {
2384 FPMath = FP_SSE;
2385 return true;
2386 }
2387 return false;
2388}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002389
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002390void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar07181d72009-05-06 03:16:41 +00002391 // FIXME: This *really* should not be here.
2392
2393 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002394 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper85bfef62013-09-17 04:51:29 +00002395 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar07181d72009-05-06 03:16:41 +00002396
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002397 switch (CPU) {
2398 case CK_Generic:
2399 case CK_i386:
2400 case CK_i486:
2401 case CK_i586:
2402 case CK_Pentium:
2403 case CK_i686:
2404 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002405 break;
2406 case CK_PentiumMMX:
2407 case CK_Pentium2:
Stephen Hines176edba2014-12-01 14:53:08 -08002408 case CK_K6:
2409 case CK_WinChipC6:
Craig Topper85bfef62013-09-17 04:51:29 +00002410 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002411 break;
2412 case CK_Pentium3:
2413 case CK_Pentium3M:
Stephen Hines176edba2014-12-01 14:53:08 -08002414 case CK_C3_2:
Craig Topper85bfef62013-09-17 04:51:29 +00002415 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002416 break;
2417 case CK_PentiumM:
2418 case CK_Pentium4:
2419 case CK_Pentium4M:
2420 case CK_x86_64:
Craig Topper85bfef62013-09-17 04:51:29 +00002421 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002422 break;
2423 case CK_Yonah:
2424 case CK_Prescott:
2425 case CK_Nocona:
Craig Topper85bfef62013-09-17 04:51:29 +00002426 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002427 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002428 break;
2429 case CK_Core2:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002430 case CK_Bonnell:
Craig Topper85bfef62013-09-17 04:51:29 +00002431 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002432 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002433 break;
2434 case CK_Penryn:
Craig Topper85bfef62013-09-17 04:51:29 +00002435 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002436 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002437 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002438 case CK_Skylake:
Stephen Hines176edba2014-12-01 14:53:08 -08002439 setFeatureEnabledImpl(Features, "avx512f", true);
2440 setFeatureEnabledImpl(Features, "avx512cd", true);
2441 setFeatureEnabledImpl(Features, "avx512dq", true);
2442 setFeatureEnabledImpl(Features, "avx512bw", true);
2443 setFeatureEnabledImpl(Features, "avx512vl", true);
2444 // FALLTHROUGH
2445 case CK_Broadwell:
2446 setFeatureEnabledImpl(Features, "rdseed", true);
2447 setFeatureEnabledImpl(Features, "adx", true);
2448 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002449 case CK_Haswell:
Craig Topper85bfef62013-09-17 04:51:29 +00002450 setFeatureEnabledImpl(Features, "avx2", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002451 setFeatureEnabledImpl(Features, "lzcnt", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002452 setFeatureEnabledImpl(Features, "bmi", true);
2453 setFeatureEnabledImpl(Features, "bmi2", true);
2454 setFeatureEnabledImpl(Features, "rtm", true);
2455 setFeatureEnabledImpl(Features, "fma", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002456 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002457 case CK_IvyBridge:
Stephen Hines176edba2014-12-01 14:53:08 -08002458 setFeatureEnabledImpl(Features, "rdrnd", true);
2459 setFeatureEnabledImpl(Features, "f16c", true);
2460 setFeatureEnabledImpl(Features, "fsgsbase", true);
2461 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002462 case CK_SandyBridge:
Stephen Hines176edba2014-12-01 14:53:08 -08002463 setFeatureEnabledImpl(Features, "avx", true);
2464 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002465 case CK_Westmere:
Stephen Hines176edba2014-12-01 14:53:08 -08002466 case CK_Silvermont:
2467 setFeatureEnabledImpl(Features, "aes", true);
2468 setFeatureEnabledImpl(Features, "pclmul", true);
2469 // FALLTHROUGH
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002470 case CK_Nehalem:
Stephen Hines176edba2014-12-01 14:53:08 -08002471 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002472 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002473 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002474 case CK_KNL:
Craig Topper85bfef62013-09-17 04:51:29 +00002475 setFeatureEnabledImpl(Features, "avx512f", true);
2476 setFeatureEnabledImpl(Features, "avx512cd", true);
2477 setFeatureEnabledImpl(Features, "avx512er", true);
2478 setFeatureEnabledImpl(Features, "avx512pf", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002479 setFeatureEnabledImpl(Features, "rdseed", true);
2480 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002481 setFeatureEnabledImpl(Features, "lzcnt", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002482 setFeatureEnabledImpl(Features, "bmi", true);
2483 setFeatureEnabledImpl(Features, "bmi2", true);
2484 setFeatureEnabledImpl(Features, "rtm", true);
2485 setFeatureEnabledImpl(Features, "fma", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002486 setFeatureEnabledImpl(Features, "rdrnd", true);
2487 setFeatureEnabledImpl(Features, "f16c", true);
2488 setFeatureEnabledImpl(Features, "fsgsbase", true);
2489 setFeatureEnabledImpl(Features, "aes", true);
2490 setFeatureEnabledImpl(Features, "pclmul", true);
2491 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002492 break;
2493 case CK_K6_2:
2494 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002495 case CK_WinChip2:
2496 case CK_C3:
Craig Topper85bfef62013-09-17 04:51:29 +00002497 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002498 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002499 case CK_Athlon:
2500 case CK_AthlonThunderbird:
2501 case CK_Geode:
Craig Topper85bfef62013-09-17 04:51:29 +00002502 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00002503 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002504 case CK_Athlon4:
2505 case CK_AthlonXP:
2506 case CK_AthlonMP:
Craig Topper85bfef62013-09-17 04:51:29 +00002507 setFeatureEnabledImpl(Features, "sse", true);
2508 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002509 break;
2510 case CK_K8:
2511 case CK_Opteron:
2512 case CK_Athlon64:
2513 case CK_AthlonFX:
Craig Topper85bfef62013-09-17 04:51:29 +00002514 setFeatureEnabledImpl(Features, "sse2", true);
2515 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002516 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002517 case CK_AMDFAM10:
2518 setFeatureEnabledImpl(Features, "sse4a", true);
2519 setFeatureEnabledImpl(Features, "lzcnt", true);
2520 setFeatureEnabledImpl(Features, "popcnt", true);
2521 // FALLTHROUGH
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002522 case CK_K8SSE3:
2523 case CK_OpteronSSE3:
2524 case CK_Athlon64SSE3:
Craig Topper85bfef62013-09-17 04:51:29 +00002525 setFeatureEnabledImpl(Features, "sse3", true);
2526 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divacky9979cfe2011-10-30 13:47:56 +00002527 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002528 case CK_BTVER2:
2529 setFeatureEnabledImpl(Features, "avx", true);
2530 setFeatureEnabledImpl(Features, "aes", true);
2531 setFeatureEnabledImpl(Features, "pclmul", true);
2532 setFeatureEnabledImpl(Features, "bmi", true);
2533 setFeatureEnabledImpl(Features, "f16c", true);
2534 // FALLTHROUGH
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002535 case CK_BTVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002536 setFeatureEnabledImpl(Features, "ssse3", true);
2537 setFeatureEnabledImpl(Features, "sse4a", true);
2538 setFeatureEnabledImpl(Features, "lzcnt", true);
2539 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002540 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002541 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002542 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002543 case CK_BDVER4:
2544 setFeatureEnabledImpl(Features, "avx2", true);
2545 setFeatureEnabledImpl(Features, "bmi2", true);
2546 // FALLTHROUGH
Benjamin Kramera2420962013-11-04 10:29:51 +00002547 case CK_BDVER3:
Stephen Hines176edba2014-12-01 14:53:08 -08002548 setFeatureEnabledImpl(Features, "fsgsbase", true);
2549 // FALLTHROUGH
2550 case CK_BDVER2:
2551 setFeatureEnabledImpl(Features, "bmi", true);
2552 setFeatureEnabledImpl(Features, "fma", true);
2553 setFeatureEnabledImpl(Features, "f16c", true);
2554 setFeatureEnabledImpl(Features, "tbm", true);
2555 // FALLTHROUGH
2556 case CK_BDVER1:
2557 // xop implies avx, sse4a and fma4.
Craig Topper85bfef62013-09-17 04:51:29 +00002558 setFeatureEnabledImpl(Features, "xop", true);
2559 setFeatureEnabledImpl(Features, "lzcnt", true);
2560 setFeatureEnabledImpl(Features, "aes", true);
2561 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002562 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002563 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002564 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002565 }
Daniel Dunbar07181d72009-05-06 03:16:41 +00002566}
2567
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002568void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002569 X86SSEEnum Level, bool Enabled) {
Daniel Dunbar0838f962009-05-06 21:07:50 +00002570 if (Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002571 switch (Level) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002572 case AVX512F:
2573 Features["avx512f"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002574 case AVX2:
2575 Features["avx2"] = true;
2576 case AVX:
2577 Features["avx"] = true;
2578 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002579 Features["sse4.2"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002580 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002581 Features["sse4.1"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002582 case SSSE3:
2583 Features["ssse3"] = true;
2584 case SSE3:
2585 Features["sse3"] = true;
2586 case SSE2:
2587 Features["sse2"] = true;
2588 case SSE1:
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002589 Features["sse"] = true;
2590 case NoSSE:
2591 break;
2592 }
2593 return;
Daniel Dunbar0838f962009-05-06 21:07:50 +00002594 }
2595
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002596 switch (Level) {
2597 case NoSSE:
2598 case SSE1:
2599 Features["sse"] = false;
2600 case SSE2:
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002601 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2602 Features["sha"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002603 case SSE3:
2604 Features["sse3"] = false;
2605 setXOPLevel(Features, NoXOP, false);
2606 case SSSE3:
2607 Features["ssse3"] = false;
2608 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002609 Features["sse4.1"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002610 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002611 Features["sse4.2"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002612 case AVX:
Craig Topper84f007b2013-09-16 04:54:13 +00002613 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola29f26de2013-08-21 13:28:02 +00002614 setXOPLevel(Features, FMA4, false);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002615 case AVX2:
2616 Features["avx2"] = false;
Craig Topperb7a95d22013-08-21 03:59:22 +00002617 case AVX512F:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002618 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Stephen Hines0e2c34f2015-03-23 12:09:02 -07002619 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2620 Features["avx512vl"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002621 }
Daniel Dunbar0838f962009-05-06 21:07:50 +00002622}
2623
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002624void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002625 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002626 if (Enabled) {
2627 switch (Level) {
2628 case AMD3DNowAthlon:
2629 Features["3dnowa"] = true;
2630 case AMD3DNow:
2631 Features["3dnow"] = true;
2632 case MMX:
2633 Features["mmx"] = true;
2634 case NoMMX3DNow:
2635 break;
2636 }
2637 return;
2638 }
2639
2640 switch (Level) {
2641 case NoMMX3DNow:
2642 case MMX:
2643 Features["mmx"] = false;
2644 case AMD3DNow:
2645 Features["3dnow"] = false;
2646 case AMD3DNowAthlon:
2647 Features["3dnowa"] = false;
2648 }
2649}
2650
2651void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper319d81f2013-09-17 04:12:55 +00002652 bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002653 if (Enabled) {
2654 switch (Level) {
2655 case XOP:
2656 Features["xop"] = true;
2657 case FMA4:
2658 Features["fma4"] = true;
2659 setSSELevel(Features, AVX, true);
2660 case SSE4A:
2661 Features["sse4a"] = true;
2662 setSSELevel(Features, SSE3, true);
2663 case NoXOP:
2664 break;
2665 }
2666 return;
2667 }
2668
2669 switch (Level) {
2670 case NoXOP:
2671 case SSE4A:
2672 Features["sse4a"] = false;
2673 case FMA4:
2674 Features["fma4"] = false;
2675 case XOP:
2676 Features["xop"] = false;
2677 }
2678}
2679
Craig Topper85bfef62013-09-17 04:51:29 +00002680void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2681 StringRef Name, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002682 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002683
Craig Topperb22352e2013-09-19 01:13:07 +00002684 if (Name == "mmx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002685 setMMXLevel(Features, MMX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002686 } else if (Name == "sse") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002687 setSSELevel(Features, SSE1, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002688 } else if (Name == "sse2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002689 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002690 } else if (Name == "sse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002691 setSSELevel(Features, SSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002692 } else if (Name == "ssse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002693 setSSELevel(Features, SSSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002694 } else if (Name == "sse4.2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002695 setSSELevel(Features, SSE42, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002696 } else if (Name == "sse4.1") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002697 setSSELevel(Features, SSE41, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002698 } else if (Name == "3dnow") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002699 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002700 } else if (Name == "3dnowa") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002701 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002702 } else if (Name == "aes") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002703 if (Enabled)
2704 setSSELevel(Features, SSE2, Enabled);
2705 } else if (Name == "pclmul") {
2706 if (Enabled)
2707 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002708 } else if (Name == "avx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002709 setSSELevel(Features, AVX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002710 } else if (Name == "avx2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002711 setSSELevel(Features, AVX2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002712 } else if (Name == "avx512f") {
Craig Topperb7a95d22013-08-21 03:59:22 +00002713 setSSELevel(Features, AVX512F, Enabled);
Stephen Hines176edba2014-12-01 14:53:08 -08002714 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2715 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topperbca2c4f2013-08-21 05:29:10 +00002716 if (Enabled)
2717 setSSELevel(Features, AVX512F, Enabled);
2718 } else if (Name == "fma") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002719 if (Enabled)
2720 setSSELevel(Features, AVX, Enabled);
2721 } else if (Name == "fma4") {
2722 setXOPLevel(Features, FMA4, Enabled);
2723 } else if (Name == "xop") {
2724 setXOPLevel(Features, XOP, Enabled);
2725 } else if (Name == "sse4a") {
2726 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper84f007b2013-09-16 04:54:13 +00002727 } else if (Name == "f16c") {
2728 if (Enabled)
2729 setSSELevel(Features, AVX, Enabled);
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002730 } else if (Name == "sha") {
2731 if (Enabled)
2732 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002733 }
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002734}
2735
Eric Christopher3d11ced2013-10-16 21:26:26 +00002736/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar07181d72009-05-06 03:16:41 +00002737/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +00002738bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00002739 DiagnosticsEngine &Diags) {
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002740 // Remember the maximum enabled sselevel.
2741 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2742 // Ignore disabled features.
2743 if (Features[i][0] == '-')
2744 continue;
2745
Benjamin Kramer713575a2012-03-05 15:10:44 +00002746 StringRef Feature = StringRef(Features[i]).substr(1);
2747
2748 if (Feature == "aes") {
Eric Christopher6c4e7872010-04-02 23:50:19 +00002749 HasAES = true;
2750 continue;
2751 }
2752
Craig Topper3c0bc152012-05-31 05:18:48 +00002753 if (Feature == "pclmul") {
2754 HasPCLMUL = true;
2755 continue;
2756 }
2757
Benjamin Kramer713575a2012-03-05 15:10:44 +00002758 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002759 HasLZCNT = true;
2760 continue;
2761 }
2762
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002763 if (Feature == "rdrnd") {
Benjamin Kramer84f30802012-07-07 09:39:18 +00002764 HasRDRND = true;
2765 continue;
2766 }
2767
Stephen Hines176edba2014-12-01 14:53:08 -08002768 if (Feature == "fsgsbase") {
2769 HasFSGSBASE = true;
2770 continue;
2771 }
2772
Benjamin Kramer713575a2012-03-05 15:10:44 +00002773 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002774 HasBMI = true;
2775 continue;
2776 }
2777
Benjamin Kramer713575a2012-03-05 15:10:44 +00002778 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002779 HasBMI2 = true;
2780 continue;
2781 }
2782
Benjamin Kramer713575a2012-03-05 15:10:44 +00002783 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002784 HasPOPCNT = true;
2785 continue;
2786 }
2787
Michael Liao463eb892012-11-10 05:17:46 +00002788 if (Feature == "rtm") {
2789 HasRTM = true;
2790 continue;
2791 }
2792
Michael Liao72339a02013-03-26 17:52:08 +00002793 if (Feature == "prfchw") {
2794 HasPRFCHW = true;
2795 continue;
2796 }
2797
Michael Liao1bfc28c2013-03-29 05:17:55 +00002798 if (Feature == "rdseed") {
2799 HasRDSEED = true;
2800 continue;
2801 }
2802
Stephen Hines176edba2014-12-01 14:53:08 -08002803 if (Feature == "adx") {
2804 HasADX = true;
2805 continue;
2806 }
2807
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002808 if (Feature == "tbm") {
2809 HasTBM = true;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002810 continue;
2811 }
2812
Craig Topper2ae95072012-06-03 21:46:30 +00002813 if (Feature == "fma") {
2814 HasFMA = true;
2815 continue;
2816 }
2817
Manman Ren146e5a42012-10-11 00:59:55 +00002818 if (Feature == "f16c") {
2819 HasF16C = true;
2820 continue;
2821 }
2822
Craig Topperbca2c4f2013-08-21 05:29:10 +00002823 if (Feature == "avx512cd") {
2824 HasAVX512CD = true;
2825 continue;
2826 }
2827
2828 if (Feature == "avx512er") {
2829 HasAVX512ER = true;
2830 continue;
2831 }
2832
2833 if (Feature == "avx512pf") {
2834 HasAVX512PF = true;
2835 continue;
2836 }
2837
Stephen Hines176edba2014-12-01 14:53:08 -08002838 if (Feature == "avx512dq") {
2839 HasAVX512DQ = true;
2840 continue;
2841 }
2842
2843 if (Feature == "avx512bw") {
2844 HasAVX512BW = true;
2845 continue;
2846 }
2847
2848 if (Feature == "avx512vl") {
2849 HasAVX512VL = true;
2850 continue;
2851 }
2852
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002853 if (Feature == "sha") {
2854 HasSHA = true;
2855 continue;
2856 }
2857
Nick Lewyckyaf945462013-10-05 20:14:27 +00002858 if (Feature == "cx16") {
2859 HasCX16 = true;
2860 continue;
2861 }
2862
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002863 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002864 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002865 .Case("avx512f", AVX512F)
Craig Topper05fe4b52012-01-09 09:19:09 +00002866 .Case("avx2", AVX2)
2867 .Case("avx", AVX)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002868 .Case("sse4.2", SSE42)
2869 .Case("sse4.1", SSE41)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002870 .Case("ssse3", SSSE3)
Nuno Lopes3a16d782010-03-12 10:20:09 +00002871 .Case("sse3", SSE3)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002872 .Case("sse2", SSE2)
2873 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002874 .Default(NoSSE);
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002875 SSELevel = std::max(SSELevel, Level);
Michael J. Spencerd5513a32010-10-21 03:16:25 +00002876
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002877 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002878 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone5e222f2010-01-27 03:47:49 +00002879 .Case("3dnowa", AMD3DNowAthlon)
2880 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002881 .Case("mmx", MMX)
2882 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002883 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002884
2885 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2886 .Case("xop", XOP)
2887 .Case("fma4", FMA4)
2888 .Case("sse4a", SSE4A)
2889 .Default(NoXOP);
2890 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002891 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002892
Craig Topper89a5e792013-09-10 06:55:47 +00002893 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2894 // Can't do this earlier because we need to be able to explicitly enable
2895 // popcnt and still disable sse4.2.
2896 if (!HasPOPCNT && SSELevel >= SSE42 &&
2897 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2898 HasPOPCNT = true;
2899 Features.push_back("+popcnt");
2900 }
2901
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002902 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2903 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2904 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2905 HasPRFCHW = true;
2906 Features.push_back("+prfchw");
2907 }
2908
Rafael Espindola5389b842013-08-21 21:59:03 +00002909 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2910 // matches the selected sse level.
2911 if (FPMath == FP_SSE && SSELevel < SSE1) {
2912 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2913 return false;
2914 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2915 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2916 return false;
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002917 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002918
2919 // Don't tell the backend if we're turning off mmx; it will end up disabling
2920 // SSE, which we don't want.
Craig Topper56bed972013-09-11 06:48:53 +00002921 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2922 // then enable MMX.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002923 std::vector<std::string>::iterator it;
2924 it = std::find(Features.begin(), Features.end(), "-mmx");
2925 if (it != Features.end())
2926 Features.erase(it);
Craig Topper56bed972013-09-11 06:48:53 +00002927 else if (SSELevel > NoSSE)
2928 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindola5389b842013-08-21 21:59:03 +00002929 return true;
Chris Lattner7d6220c2009-03-02 22:20:04 +00002930}
Chris Lattnerbef1d722009-03-02 22:27:17 +00002931
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002932/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2933/// definitions for this particular subtarget.
Chris Lattner79682402009-03-20 15:52:06 +00002934void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002935 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00002936 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002937 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002938 Builder.defineMacro("__amd64__");
2939 Builder.defineMacro("__amd64");
2940 Builder.defineMacro("__x86_64");
2941 Builder.defineMacro("__x86_64__");
Stephen Hines176edba2014-12-01 14:53:08 -08002942 if (getTriple().getArchName() == "x86_64h") {
2943 Builder.defineMacro("__x86_64h");
2944 Builder.defineMacro("__x86_64h__");
2945 }
Chris Lattnerbef1d722009-03-02 22:27:17 +00002946 } else {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002947 DefineStd(Builder, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +00002948 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00002949
Chris Lattnerc0f59212009-03-02 22:27:17 +00002950 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002951 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2952 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002953 switch (CPU) {
2954 case CK_Generic:
2955 break;
2956 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002957 // The rest are coming from the i386 define above.
2958 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002959 break;
2960 case CK_i486:
2961 case CK_WinChipC6:
2962 case CK_WinChip2:
2963 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002964 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002965 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002966 case CK_PentiumMMX:
2967 Builder.defineMacro("__pentium_mmx__");
2968 Builder.defineMacro("__tune_pentium_mmx__");
2969 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002970 case CK_i586:
2971 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002972 defineCPUMacros(Builder, "i586");
2973 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002974 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002975 case CK_Pentium3:
2976 case CK_Pentium3M:
2977 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002978 Builder.defineMacro("__tune_pentium3__");
2979 // Fallthrough
2980 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002981 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002982 Builder.defineMacro("__tune_pentium2__");
2983 // Fallthrough
2984 case CK_PentiumPro:
2985 Builder.defineMacro("__tune_i686__");
2986 Builder.defineMacro("__tune_pentiumpro__");
2987 // Fallthrough
2988 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002989 Builder.defineMacro("__i686");
2990 Builder.defineMacro("__i686__");
2991 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2992 Builder.defineMacro("__pentiumpro");
2993 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002994 break;
2995 case CK_Pentium4:
2996 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002997 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002998 break;
2999 case CK_Yonah:
3000 case CK_Prescott:
3001 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003002 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003003 break;
3004 case CK_Core2:
3005 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003006 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003007 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003008 case CK_Bonnell:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003009 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003010 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00003011 case CK_Silvermont:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00003012 defineCPUMacros(Builder, "slm");
3013 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003014 case CK_Nehalem:
3015 case CK_Westmere:
3016 case CK_SandyBridge:
3017 case CK_IvyBridge:
3018 case CK_Haswell:
Stephen Hines176edba2014-12-01 14:53:08 -08003019 case CK_Broadwell:
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003020 // FIXME: Historically, we defined this legacy name, it would be nice to
3021 // remove it at some point. We've never exposed fine-grained names for
3022 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003023 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003024 break;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003025 case CK_Skylake:
3026 // FIXME: Historically, we defined this legacy name, it would be nice to
3027 // remove it at some point. This is the only fine-grained CPU macro in the
3028 // main intel CPU line, and it would be better to not have these and force
3029 // people to use ISA macros.
3030 defineCPUMacros(Builder, "skx");
3031 break;
Craig Topper10c2c682013-08-20 07:09:39 +00003032 case CK_KNL:
3033 defineCPUMacros(Builder, "knl");
3034 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003035 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00003036 Builder.defineMacro("__k6_2__");
3037 Builder.defineMacro("__tune_k6_2__");
3038 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003039 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00003040 if (CPU != CK_K6_2) { // In case of fallthrough
3041 // FIXME: GCC may be enabling these in cases where some other k6
3042 // architecture is specified but -m3dnow is explicitly provided. The
3043 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00003044 Builder.defineMacro("__k6_3__");
3045 Builder.defineMacro("__tune_k6_3__");
3046 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00003047 // Fallthrough
3048 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003049 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003050 break;
3051 case CK_Athlon:
3052 case CK_AthlonThunderbird:
3053 case CK_Athlon4:
3054 case CK_AthlonXP:
3055 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003056 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00003057 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00003058 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00003059 Builder.defineMacro("__tune_athlon_sse__");
3060 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003061 break;
3062 case CK_K8:
3063 case CK_K8SSE3:
3064 case CK_x86_64:
3065 case CK_Opteron:
3066 case CK_OpteronSSE3:
3067 case CK_Athlon64:
3068 case CK_Athlon64SSE3:
3069 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003070 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003071 break;
Roman Divackyf051cde2011-10-30 07:48:46 +00003072 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003073 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00003074 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00003075 case CK_BTVER1:
3076 defineCPUMacros(Builder, "btver1");
Roman Divackyf051cde2011-10-30 07:48:46 +00003077 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00003078 case CK_BTVER2:
3079 defineCPUMacros(Builder, "btver2");
3080 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00003081 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003082 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00003083 break;
3084 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003085 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00003086 break;
Benjamin Kramera2420962013-11-04 10:29:51 +00003087 case CK_BDVER3:
3088 defineCPUMacros(Builder, "bdver3");
3089 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003090 case CK_BDVER4:
3091 defineCPUMacros(Builder, "bdver4");
3092 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003093 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00003094 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00003095 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00003096 }
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00003097
Chris Lattnerbef1d722009-03-02 22:27:17 +00003098 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003099 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003100
Chris Lattner25ac1c12009-04-19 17:32:33 +00003101 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3102 // functions in glibc header files that use FP Stack inline asm which the
3103 // backend can't deal with (PR879).
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003104 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikove7772382009-05-03 13:42:53 +00003105
Chandler Carruth88c75b02011-09-28 09:54:07 +00003106 if (HasAES)
3107 Builder.defineMacro("__AES__");
3108
Craig Topper3c0bc152012-05-31 05:18:48 +00003109 if (HasPCLMUL)
3110 Builder.defineMacro("__PCLMUL__");
3111
Craig Topper31ceea02011-12-25 05:06:45 +00003112 if (HasLZCNT)
3113 Builder.defineMacro("__LZCNT__");
3114
Benjamin Kramer84f30802012-07-07 09:39:18 +00003115 if (HasRDRND)
3116 Builder.defineMacro("__RDRND__");
3117
Stephen Hines176edba2014-12-01 14:53:08 -08003118 if (HasFSGSBASE)
3119 Builder.defineMacro("__FSGSBASE__");
3120
Craig Topper31ceea02011-12-25 05:06:45 +00003121 if (HasBMI)
3122 Builder.defineMacro("__BMI__");
3123
3124 if (HasBMI2)
3125 Builder.defineMacro("__BMI2__");
3126
Craig Toppere14e08b2011-12-29 16:10:46 +00003127 if (HasPOPCNT)
3128 Builder.defineMacro("__POPCNT__");
3129
Michael Liao463eb892012-11-10 05:17:46 +00003130 if (HasRTM)
3131 Builder.defineMacro("__RTM__");
3132
Michael Liao72339a02013-03-26 17:52:08 +00003133 if (HasPRFCHW)
3134 Builder.defineMacro("__PRFCHW__");
3135
Michael Liao1bfc28c2013-03-29 05:17:55 +00003136 if (HasRDSEED)
3137 Builder.defineMacro("__RDSEED__");
3138
Stephen Hines176edba2014-12-01 14:53:08 -08003139 if (HasADX)
3140 Builder.defineMacro("__ADX__");
3141
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00003142 if (HasTBM)
3143 Builder.defineMacro("__TBM__");
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00003144
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003145 switch (XOPLevel) {
3146 case XOP:
3147 Builder.defineMacro("__XOP__");
3148 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00003149 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003150 case SSE4A:
3151 Builder.defineMacro("__SSE4A__");
3152 case NoXOP:
3153 break;
3154 }
Chandler Carruth88c75b02011-09-28 09:54:07 +00003155
Craig Topper2ae95072012-06-03 21:46:30 +00003156 if (HasFMA)
3157 Builder.defineMacro("__FMA__");
3158
Manman Ren146e5a42012-10-11 00:59:55 +00003159 if (HasF16C)
3160 Builder.defineMacro("__F16C__");
3161
Craig Topperbca2c4f2013-08-21 05:29:10 +00003162 if (HasAVX512CD)
3163 Builder.defineMacro("__AVX512CD__");
3164 if (HasAVX512ER)
3165 Builder.defineMacro("__AVX512ER__");
3166 if (HasAVX512PF)
3167 Builder.defineMacro("__AVX512PF__");
Stephen Hines176edba2014-12-01 14:53:08 -08003168 if (HasAVX512DQ)
3169 Builder.defineMacro("__AVX512DQ__");
3170 if (HasAVX512BW)
3171 Builder.defineMacro("__AVX512BW__");
3172 if (HasAVX512VL)
3173 Builder.defineMacro("__AVX512VL__");
Craig Topperbca2c4f2013-08-21 05:29:10 +00003174
Ben Langmuirb83f5a72013-09-19 13:22:04 +00003175 if (HasSHA)
3176 Builder.defineMacro("__SHA__");
3177
Nick Lewyckyaf945462013-10-05 20:14:27 +00003178 if (HasCX16)
3179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3180
Chris Lattner715fe4c2009-03-02 22:40:39 +00003181 // Each case falls through to the previous one here.
3182 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00003183 case AVX512F:
Craig Topper42f98732013-08-20 07:39:54 +00003184 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00003185 case AVX2:
3186 Builder.defineMacro("__AVX2__");
3187 case AVX:
3188 Builder.defineMacro("__AVX__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003189 case SSE42:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003190 Builder.defineMacro("__SSE4_2__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003191 case SSE41:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003192 Builder.defineMacro("__SSE4_1__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003193 case SSSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003194 Builder.defineMacro("__SSSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003195 case SSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003196 Builder.defineMacro("__SSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00003197 case SSE2:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003198 Builder.defineMacro("__SSE2__");
3199 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner715fe4c2009-03-02 22:40:39 +00003200 case SSE1:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003201 Builder.defineMacro("__SSE__");
3202 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00003203 case NoSSE:
Chris Lattner715fe4c2009-03-02 22:40:39 +00003204 break;
3205 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00003206
Derek Schuffbabaf312012-10-11 15:52:22 +00003207 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer01e70082010-10-21 05:21:48 +00003208 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00003209 case AVX512F:
Craig Topper05fe4b52012-01-09 09:19:09 +00003210 case AVX2:
3211 case AVX:
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003212 case SSE42:
3213 case SSE41:
3214 case SSSE3:
3215 case SSE3:
Michael J. Spencer01e70082010-10-21 05:21:48 +00003216 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00003217 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer01e70082010-10-21 05:21:48 +00003218 break;
3219 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00003220 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer01e70082010-10-21 05:21:48 +00003221 break;
3222 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00003223 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer01e70082010-10-21 05:21:48 +00003224 }
3225 }
3226
Anders Carlssone5e222f2010-01-27 03:47:49 +00003227 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00003228 switch (MMX3DNowLevel) {
Anders Carlssone5e222f2010-01-27 03:47:49 +00003229 case AMD3DNowAthlon:
3230 Builder.defineMacro("__3dNOW_A__");
3231 case AMD3DNow:
3232 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00003233 case MMX:
3234 Builder.defineMacro("__MMX__");
3235 case NoMMX3DNow:
Anders Carlssone5e222f2010-01-27 03:47:49 +00003236 break;
3237 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00003238
3239 if (CPU >= CK_i486) {
3240 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3241 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3242 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3243 }
3244 if (CPU >= CK_i586)
3245 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerbef1d722009-03-02 22:27:17 +00003246}
Anton Korobeynikove7772382009-05-03 13:42:53 +00003247
Douglas Gregore727d212012-01-30 06:38:25 +00003248bool X86TargetInfo::hasFeature(StringRef Feature) const {
3249 return llvm::StringSwitch<bool>(Feature)
3250 .Case("aes", HasAES)
3251 .Case("avx", SSELevel >= AVX)
3252 .Case("avx2", SSELevel >= AVX2)
Craig Topperb7a95d22013-08-21 03:59:22 +00003253 .Case("avx512f", SSELevel >= AVX512F)
Craig Topperbca2c4f2013-08-21 05:29:10 +00003254 .Case("avx512cd", HasAVX512CD)
3255 .Case("avx512er", HasAVX512ER)
3256 .Case("avx512pf", HasAVX512PF)
Stephen Hines176edba2014-12-01 14:53:08 -08003257 .Case("avx512dq", HasAVX512DQ)
3258 .Case("avx512bw", HasAVX512BW)
3259 .Case("avx512vl", HasAVX512VL)
Douglas Gregore727d212012-01-30 06:38:25 +00003260 .Case("bmi", HasBMI)
3261 .Case("bmi2", HasBMI2)
Nick Lewyckyaf945462013-10-05 20:14:27 +00003262 .Case("cx16", HasCX16)
3263 .Case("f16c", HasF16C)
Craig Topper2ae95072012-06-03 21:46:30 +00003264 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003265 .Case("fma4", XOPLevel >= FMA4)
Stephen Hines176edba2014-12-01 14:53:08 -08003266 .Case("fsgsbase", HasFSGSBASE)
Douglas Gregore727d212012-01-30 06:38:25 +00003267 .Case("lzcnt", HasLZCNT)
3268 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3269 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3270 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00003271 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00003272 .Case("popcnt", HasPOPCNT)
Michael Liao72339a02013-03-26 17:52:08 +00003273 .Case("prfchw", HasPRFCHW)
Stephen Hines176edba2014-12-01 14:53:08 -08003274 .Case("rdrnd", HasRDRND)
Michael Liao1bfc28c2013-03-29 05:17:55 +00003275 .Case("rdseed", HasRDSEED)
Stephen Hines176edba2014-12-01 14:53:08 -08003276 .Case("rtm", HasRTM)
Ben Langmuirb83f5a72013-09-19 13:22:04 +00003277 .Case("sha", HasSHA)
Douglas Gregore727d212012-01-30 06:38:25 +00003278 .Case("sse", SSELevel >= SSE1)
3279 .Case("sse2", SSELevel >= SSE2)
3280 .Case("sse3", SSELevel >= SSE3)
3281 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00003282 .Case("sse4.1", SSELevel >= SSE41)
3283 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003284 .Case("sse4a", XOPLevel >= SSE4A)
Stephen Hines176edba2014-12-01 14:53:08 -08003285 .Case("tbm", HasTBM)
Douglas Gregore727d212012-01-30 06:38:25 +00003286 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00003287 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3288 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003289 .Case("xop", XOPLevel >= XOP)
Douglas Gregore727d212012-01-30 06:38:25 +00003290 .Default(false);
3291}
Anton Korobeynikove7772382009-05-03 13:42:53 +00003292
Eli Friedman872996c2008-08-20 02:34:37 +00003293bool
Anders Carlsson36834a72009-02-28 17:11:49 +00003294X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00003295 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +00003296 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +00003297 default: return false;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003298 case 'I':
3299 Info.setRequiresImmediate(0, 31);
3300 return true;
3301 case 'J':
3302 Info.setRequiresImmediate(0, 63);
3303 return true;
3304 case 'K':
3305 Info.setRequiresImmediate(-128, 127);
3306 return true;
3307 case 'L':
3308 // FIXME: properly analyze this constraint:
3309 // must be one of 0xff, 0xffff, or 0xffffffff
3310 return true;
3311 case 'M':
3312 Info.setRequiresImmediate(0, 3);
3313 return true;
3314 case 'N':
3315 Info.setRequiresImmediate(0, 255);
3316 return true;
3317 case 'O':
3318 Info.setRequiresImmediate(0, 127);
3319 return true;
Dale Johanneseneba819a2010-08-24 22:33:12 +00003320 case 'Y': // first letter of a pair:
3321 switch (*(Name+1)) {
3322 default: return false;
3323 case '0': // First SSE register.
3324 case 't': // Any SSE register, when SSE2 is enabled.
3325 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3326 case 'm': // any MMX register, when inter-unit moves enabled.
3327 break; // falls through to setAllowsRegister.
3328 }
Stephen Hines176edba2014-12-01 14:53:08 -08003329 case 'f': // any x87 floating point stack register.
3330 // Constraint 'f' cannot be used for output operands.
3331 if (Info.ConstraintStr[0] == '=')
3332 return false;
3333
3334 Info.setAllowsRegister();
3335 return true;
Eli Friedman872996c2008-08-20 02:34:37 +00003336 case 'a': // eax.
3337 case 'b': // ebx.
3338 case 'c': // ecx.
3339 case 'd': // edx.
3340 case 'S': // esi.
3341 case 'D': // edi.
3342 case 'A': // edx:eax.
3343 case 't': // top of floating point stack.
3344 case 'u': // second from top of floating point stack.
3345 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +00003346 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +00003347 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +00003348 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johanneseneba819a2010-08-24 22:33:12 +00003349 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3350 case 'l': // "Index" registers: any general register that can be used as an
3351 // index in a base+index memory access.
3352 Info.setAllowsRegister();
3353 return true;
3354 case 'C': // SSE floating point constant.
3355 case 'G': // x87 floating point constant.
Anton Korobeynikove7772382009-05-03 13:42:53 +00003356 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00003357 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +00003358 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00003359 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +00003360 return true;
3361 }
3362}
3363
Stephen Hines176edba2014-12-01 14:53:08 -08003364bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3365 unsigned Size) const {
3366 // Strip off constraint modifiers.
3367 while (Constraint[0] == '=' ||
3368 Constraint[0] == '+' ||
3369 Constraint[0] == '&')
3370 Constraint = Constraint.substr(1);
3371
3372 return validateOperandSize(Constraint, Size);
3373}
3374
3375bool X86TargetInfo::validateInputSize(StringRef Constraint,
3376 unsigned Size) const {
3377 return validateOperandSize(Constraint, Size);
3378}
3379
3380bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3381 unsigned Size) const {
3382 switch (Constraint[0]) {
3383 default: break;
3384 case 'y':
3385 return Size <= 64;
3386 case 'f':
3387 case 't':
3388 case 'u':
3389 return Size <= 128;
3390 case 'x':
3391 // 256-bit ymm registers can be used if target supports AVX.
3392 return Size <= (SSELevel >= AVX ? 256U : 128U);
3393 }
3394
3395 return true;
3396}
Dale Johannesen3a161e52010-10-29 23:12:32 +00003397
Eli Friedman872996c2008-08-20 02:34:37 +00003398std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00003399X86TargetInfo::convertConstraint(const char *&Constraint) const {
3400 switch (*Constraint) {
Eli Friedman872996c2008-08-20 02:34:37 +00003401 case 'a': return std::string("{ax}");
3402 case 'b': return std::string("{bx}");
3403 case 'c': return std::string("{cx}");
3404 case 'd': return std::string("{dx}");
3405 case 'S': return std::string("{si}");
3406 case 'D': return std::string("{di}");
Dale Johannesena49254e2010-10-22 21:07:10 +00003407 case 'p': // address
3408 return std::string("im");
Eli Friedman872996c2008-08-20 02:34:37 +00003409 case 't': // top of floating point stack.
3410 return std::string("{st}");
3411 case 'u': // second from top of floating point stack.
3412 return std::string("{st(1)}"); // second from top of floating point stack.
3413 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00003414 return std::string(1, *Constraint);
Eli Friedman872996c2008-08-20 02:34:37 +00003415 }
3416}
Chris Lattner4b009652007-07-25 00:24:17 +00003417
Eli Friedman872996c2008-08-20 02:34:37 +00003418// X86-32 generic target
3419class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00003420public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003421 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003422 DoubleAlign = LongLongAlign = 32;
3423 LongDoubleWidth = 96;
3424 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00003425 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07003426 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman04ede302009-03-29 20:31:09 +00003427 SizeType = UnsignedInt;
3428 PtrDiffType = SignedInt;
3429 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003430 RegParmMax = 3;
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003431
3432 // Use fpret for all types.
3433 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3434 (1 << TargetInfo::Double) |
3435 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00003436
3437 // x86-32 has atomics up to 8 bytes
3438 // FIXME: Check that we actually have cmpxchg8b before setting
3439 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3440 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman872996c2008-08-20 02:34:37 +00003441 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003442 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003443 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman872996c2008-08-20 02:34:37 +00003444 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003445
Stephen Hines651f13c2014-04-23 16:59:28 -07003446 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003447 if (RegNo == 0) return 0;
3448 if (RegNo == 1) return 2;
3449 return -1;
3450 }
Stephen Hines176edba2014-12-01 14:53:08 -08003451 bool validateOperandSize(StringRef Constraint,
3452 unsigned Size) const override {
Bill Wendling68fd6082012-11-12 06:42:51 +00003453 switch (Constraint[0]) {
3454 default: break;
Stephen Hines176edba2014-12-01 14:53:08 -08003455 case 'R':
3456 case 'q':
3457 case 'Q':
Bill Wendling68fd6082012-11-12 06:42:51 +00003458 case 'a':
3459 case 'b':
3460 case 'c':
3461 case 'd':
Stephen Hines176edba2014-12-01 14:53:08 -08003462 case 'S':
3463 case 'D':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00003464 return Size <= 32;
Stephen Hines176edba2014-12-01 14:53:08 -08003465 case 'A':
3466 return Size <= 64;
Bill Wendling68fd6082012-11-12 06:42:51 +00003467 }
3468
Stephen Hines176edba2014-12-01 14:53:08 -08003469 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling68fd6082012-11-12 06:42:51 +00003470 }
Eli Friedman872996c2008-08-20 02:34:37 +00003471};
Eli Friedman872996c2008-08-20 02:34:37 +00003472
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003473class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3474public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003475 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3476 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003477
Stephen Hines651f13c2014-04-23 16:59:28 -07003478 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger8daa7fe2013-11-11 14:00:37 +00003479 unsigned Major, Minor, Micro;
3480 getTriple().getOSVersion(Major, Minor, Micro);
3481 // New NetBSD uses the default rounding mode.
3482 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3483 return X86_32TargetInfo::getFloatEvalMethod();
3484 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003485 return 1;
3486 }
3487};
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003488
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003489class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3490public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003491 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3492 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003493 SizeType = UnsignedLong;
3494 IntPtrType = SignedLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003495 PtrDiffType = SignedLong;
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003496 }
3497};
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003498
Eli Friedman42f74f22012-08-08 23:57:20 +00003499class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3500public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003501 BitrigI386TargetInfo(const llvm::Triple &Triple)
3502 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00003503 SizeType = UnsignedLong;
3504 IntPtrType = SignedLong;
3505 PtrDiffType = SignedLong;
3506 }
3507};
Eli Friedman42f74f22012-08-08 23:57:20 +00003508
Edwin Török36565e52009-06-30 17:10:35 +00003509class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman872996c2008-08-20 02:34:37 +00003510public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003511 DarwinI386TargetInfo(const llvm::Triple &Triple)
3512 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003513 LongDoubleWidth = 128;
3514 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003515 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003516 MaxVectorAlign = 256;
Eli Friedman04ede302009-03-29 20:31:09 +00003517 SizeType = UnsignedLong;
3518 IntPtrType = SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003519 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbar9451c542010-05-27 00:35:16 +00003520 HasAlignMac68kSupport = true;
Edwin Török2d98f9f2009-06-30 17:00:25 +00003521 }
3522
Eli Friedman872996c2008-08-20 02:34:37 +00003523};
Daniel Dunbar64c77a12009-06-29 20:52:51 +00003524
Eli Friedman23cb7912008-08-21 01:40:19 +00003525// x86-32 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003526class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman23cb7912008-08-21 01:40:19 +00003527public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003528 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3529 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattnera8a69e12009-06-24 17:12:15 +00003530 WCharType = UnsignedShort;
Eli Friedmanb28055e2009-06-08 21:16:17 +00003531 DoubleAlign = LongLongAlign = 64;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07003532 bool IsWinCOFF =
3533 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
3534 DescriptionString = IsWinCOFF ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"
3535 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedman23cb7912008-08-21 01:40:19 +00003536 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003537 void getTargetDefines(const LangOptions &Opts,
3538 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003539 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Eli Friedman23cb7912008-08-21 01:40:19 +00003540 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003541};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003542
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003543// x86-32 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003544class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003545public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003546 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003547 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003548 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003549 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003550 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003551 void getTargetDefines(const LangOptions &Opts,
3552 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003553 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003554 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003555 // The value of the following reflects processor type.
3556 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3557 // We lost the original triple, so we use the default.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003558 Builder.defineMacro("_M_IX86", "600");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003559 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003560};
3561} // end anonymous namespace
3562
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003563static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3564 Builder.defineMacro("__MSVCRT__");
3565 Builder.defineMacro("__MINGW32__");
3566
3567 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3568 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3569 // macro anyway for pre-processor compatibility.
3570 if (Opts.MicrosoftExt)
3571 Builder.defineMacro("__declspec", "__declspec");
3572 else
3573 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3574
3575 if (!Opts.MicrosoftExt) {
3576 // Provide macros for all the calling convention keywords. Provide both
3577 // single and double underscore prefixed variants. These are available on
3578 // x64 as well as x86, even though they have no effect.
3579 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3580 for (const char *CC : CCs) {
3581 std::string GCCSpelling = "__attribute__((__";
3582 GCCSpelling += CC;
3583 GCCSpelling += "__))";
3584 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3585 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3586 }
3587 }
3588}
3589
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003590namespace {
3591// x86-32 MinGW target
3592class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3593public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003594 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3595 : WindowsX86_32TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003596 void getTargetDefines(const LangOptions &Opts,
3597 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003598 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003599 DefineStd(Builder, "WIN32", Opts);
3600 DefineStd(Builder, "WINNT", Opts);
3601 Builder.defineMacro("_X86_");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003602 addMinGWDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003603 }
3604};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003605
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003606// x86-32 Cygwin target
3607class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3608public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003609 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3610 : X86_32TargetInfo(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003611 TLSSupported = false;
3612 WCharType = UnsignedShort;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003613 DoubleAlign = LongLongAlign = 64;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003614 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003615 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003616 void getTargetDefines(const LangOptions &Opts,
3617 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003618 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003619 Builder.defineMacro("_X86_");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003620 Builder.defineMacro("__CYGWIN__");
3621 Builder.defineMacro("__CYGWIN32__");
3622 DefineStd(Builder, "unix", Opts);
Douglas Gregor9b22a172010-04-21 05:52:38 +00003623 if (Opts.CPlusPlus)
3624 Builder.defineMacro("_GNU_SOURCE");
Eli Friedman6b6ca942009-06-08 06:11:14 +00003625 }
Eli Friedman23cb7912008-08-21 01:40:19 +00003626};
Eli Friedman23cb7912008-08-21 01:40:19 +00003627
Chris Lattnerf853e732010-04-11 19:29:39 +00003628// x86-32 Haiku target
3629class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3630public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003631 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerf853e732010-04-11 19:29:39 +00003632 SizeType = UnsignedLong;
Chris Lattner5b8b18a2010-04-22 17:48:00 +00003633 IntPtrType = SignedLong;
3634 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003635 ProcessIDType = SignedLong;
Rafael Espindolaa7bdfdd2010-11-09 16:41:02 +00003636 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003637 this->TLSSupported = false;
Eli Friedman08f845b2010-08-22 01:00:03 +00003638 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003639 void getTargetDefines(const LangOptions &Opts,
3640 MacroBuilder &Builder) const override {
Chris Lattnerf853e732010-04-11 19:29:39 +00003641 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3642 Builder.defineMacro("__INTEL__");
3643 Builder.defineMacro("__HAIKU__");
3644 }
3645};
Chris Lattnerf853e732010-04-11 19:29:39 +00003646
Douglas Gregordca52262011-07-01 22:41:14 +00003647// RTEMS Target
3648template<typename Target>
3649class RTEMSTargetInfo : public OSTargetInfo<Target> {
3650protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07003651 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3652 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003653 // RTEMS defines; list based off of gcc output
3654
Douglas Gregordca52262011-07-01 22:41:14 +00003655 Builder.defineMacro("__rtems__");
3656 Builder.defineMacro("__ELF__");
3657 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003658
Douglas Gregordca52262011-07-01 22:41:14 +00003659public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003660 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3661 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00003662
Benjamin Kramer9df08232013-06-29 16:37:14 +00003663 switch (Triple.getArch()) {
3664 default:
3665 case llvm::Triple::x86:
3666 // this->MCountName = ".mcount";
3667 break;
3668 case llvm::Triple::mips:
3669 case llvm::Triple::mipsel:
3670 case llvm::Triple::ppc:
3671 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003672 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003673 // this->MCountName = "_mcount";
3674 break;
3675 case llvm::Triple::arm:
3676 // this->MCountName = "__mcount";
3677 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003678 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003679 }
Douglas Gregordca52262011-07-01 22:41:14 +00003680};
3681
Douglas Gregordca52262011-07-01 22:41:14 +00003682// x86-32 RTEMS target
3683class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3684public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003685 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003686 SizeType = UnsignedLong;
3687 IntPtrType = SignedLong;
3688 PtrDiffType = SignedLong;
3689 this->UserLabelPrefix = "";
3690 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003691 void getTargetDefines(const LangOptions &Opts,
3692 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003693 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3694 Builder.defineMacro("__INTEL__");
3695 Builder.defineMacro("__rtems__");
3696 }
3697};
Douglas Gregordca52262011-07-01 22:41:14 +00003698
Eli Friedman872996c2008-08-20 02:34:37 +00003699// x86-64 generic target
3700class X86_64TargetInfo : public X86TargetInfo {
3701public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003702 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Stephen Hines176edba2014-12-01 14:53:08 -08003703 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003704 bool IsWinCOFF =
3705 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003706 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003707 LongDoubleWidth = 128;
3708 LongDoubleAlign = 128;
Rafael Espindolabfa7c002010-06-04 23:15:27 +00003709 LargeArrayMinWidth = 128;
3710 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003711 SuitableAlign = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003712 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3713 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3714 IntPtrType = IsX32 ? SignedInt : SignedLong;
3715 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003716 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003717 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00003718
Stephen Hines176edba2014-12-01 14:53:08 -08003719 // Pointers are 32-bit in x32.
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003720 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3721 : IsWinCOFF
3722 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3723 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003724
3725 // Use fpret only for long double.
3726 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003727
Anders Carlsson321b7ac2011-10-31 16:27:11 +00003728 // Use fp2ret for _Complex long double.
3729 ComplexLongDoubleUsesFP2Ret = true;
3730
Eli Friedman2be46072011-10-14 20:59:01 +00003731 // x86-64 has atomics up to 16 bytes.
Eli Friedman2be46072011-10-14 20:59:01 +00003732 MaxAtomicPromoteWidth = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003733 MaxAtomicInlineWidth = 128;
Chris Lattner4b009652007-07-25 00:24:17 +00003734 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003735 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003736 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson7dd1c952007-11-24 23:38:12 +00003737 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00003738
Stephen Hines651f13c2014-04-23 16:59:28 -07003739 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003740 if (RegNo == 0) return 0;
3741 if (RegNo == 1) return 1;
3742 return -1;
3743 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003744
Stephen Hines651f13c2014-04-23 16:59:28 -07003745 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003746 return (CC == CC_C ||
Stephen Hines176edba2014-12-01 14:53:08 -08003747 CC == CC_X86VectorCall ||
Charles Davise8519c32013-08-30 04:39:01 +00003748 CC == CC_IntelOclBicc ||
3749 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003750 }
3751
Stephen Hines651f13c2014-04-23 16:59:28 -07003752 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00003753 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003754 }
3755
Stephen Hines176edba2014-12-01 14:53:08 -08003756 // for x32 we need it here explicitly
3757 bool hasInt128Type() const override { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +00003758};
Eli Friedman872996c2008-08-20 02:34:37 +00003759
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003760// x86-64 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003761class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003762public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003763 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3764 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003765 WCharType = UnsignedShort;
Mike Stump4da7a162009-10-08 23:00:00 +00003766 LongWidth = LongAlign = 32;
Michael J. Spencer3d796932010-10-18 07:10:59 +00003767 DoubleAlign = LongLongAlign = 64;
Nate Begeman472bd992010-07-21 02:02:56 +00003768 IntMaxType = SignedLongLong;
Nate Begeman472bd992010-07-21 02:02:56 +00003769 Int64Type = SignedLongLong;
Cameron Esfahani32083822010-09-15 00:28:12 +00003770 SizeType = UnsignedLongLong;
3771 PtrDiffType = SignedLongLong;
3772 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003773 this->UserLabelPrefix = "";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003774 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003775
Stephen Hines651f13c2014-04-23 16:59:28 -07003776 void getTargetDefines(const LangOptions &Opts,
3777 MacroBuilder &Builder) const override {
Michael J. Spencer01e70082010-10-21 05:21:48 +00003778 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003779 Builder.defineMacro("_WIN64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003780 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003781
Stephen Hines651f13c2014-04-23 16:59:28 -07003782 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003783 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003784 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003785
Stephen Hines651f13c2014-04-23 16:59:28 -07003786 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07003787 switch (CC) {
3788 case CC_X86StdCall:
3789 case CC_X86ThisCall:
3790 case CC_X86FastCall:
3791 return CCCR_Ignore;
3792 case CC_C:
3793 case CC_X86VectorCall:
3794 case CC_IntelOclBicc:
3795 case CC_X86_64SysV:
3796 return CCCR_OK;
3797 default:
3798 return CCCR_Warning;
3799 }
Charles Davise8519c32013-08-30 04:39:01 +00003800 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003801};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003802
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003803// x86-64 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003804class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003805public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003806 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003807 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003808 LongDoubleWidth = LongDoubleAlign = 64;
3809 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003810 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003811 void getTargetDefines(const LangOptions &Opts,
3812 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003813 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003814 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003815 Builder.defineMacro("_M_X64");
Michael J. Spencer01e70082010-10-21 05:21:48 +00003816 Builder.defineMacro("_M_AMD64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003817 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003818};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003819
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003820// x86-64 MinGW target
3821class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3822public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003823 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3824 : WindowsX86_64TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003825 void getTargetDefines(const LangOptions &Opts,
3826 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003827 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003828 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003829 Builder.defineMacro("__MINGW64__");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003830 addMinGWDefines(Opts, Builder);
Stephen Hines176edba2014-12-01 14:53:08 -08003831
3832 // GCC defines this macro when it is using __gxx_personality_seh0.
3833 if (!Opts.SjLjExceptions)
3834 Builder.defineMacro("__SEH__");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003835 }
3836};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003837
Eli Friedman38e31802009-07-01 03:36:11 +00003838class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3839public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003840 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3841 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman38e31802009-07-01 03:36:11 +00003842 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003843 MaxVectorAlign = 256;
Stephen Hines651f13c2014-04-23 16:59:28 -07003844 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3845 llvm::Triple T = llvm::Triple(Triple);
Stephen Hines176edba2014-12-01 14:53:08 -08003846 if (T.isiOS())
Stephen Hines651f13c2014-04-23 16:59:28 -07003847 UseSignedCharForObjCBool = false;
3848 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman38e31802009-07-01 03:36:11 +00003849 }
3850};
Eli Friedman38e31802009-07-01 03:36:11 +00003851
Eli Friedman96ada022009-07-05 22:31:18 +00003852class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3853public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003854 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3855 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman96ada022009-07-05 22:31:18 +00003856 IntMaxType = SignedLongLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003857 Int64Type = SignedLongLong;
3858 }
3859};
Eli Friedman96ada022009-07-05 22:31:18 +00003860
Eli Friedman42f74f22012-08-08 23:57:20 +00003861class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3862public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003863 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3864 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3865 IntMaxType = SignedLongLong;
Benjamin Kramer9df08232013-06-29 16:37:14 +00003866 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003867 }
3868};
Tim Northoverc264e162013-01-31 12:13:10 +00003869
Eli Friedmanbe727fe2008-08-20 07:44:10 +00003870class ARMTargetInfo : public TargetInfo {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003871 // Possible FPU choices.
3872 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003873 VFP2FPU = (1 << 0),
3874 VFP3FPU = (1 << 1),
3875 VFP4FPU = (1 << 2),
Bernard Ogdenf779e652013-10-24 18:32:51 +00003876 NeonFPU = (1 << 3),
3877 FPARMV8 = (1 << 4)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003878 };
3879
Silviu Baranga1db2e272013-10-21 10:54:53 +00003880 // Possible HWDiv features.
3881 enum HWDivMode {
3882 HWDivThumb = (1 << 0),
3883 HWDivARM = (1 << 1)
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003884 };
3885
3886 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenf779e652013-10-24 18:32:51 +00003887 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003888 }
3889
3890 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3891 static const char * const GCCRegNames[];
Daniel Dunbar40b774e2009-09-17 07:03:19 +00003892
Daniel Dunbar33b40752009-12-18 18:42:37 +00003893 std::string ABI, CPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003894
Rafael Espindola5389b842013-08-21 21:59:03 +00003895 enum {
3896 FP_Default,
3897 FP_VFP,
3898 FP_Neon
3899 } FPMath;
3900
Bernard Ogdenf779e652013-10-24 18:32:51 +00003901 unsigned FPU : 5;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003902
Logan Chieneae5a8202012-10-10 06:56:20 +00003903 unsigned IsAAPCS : 1;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003904 unsigned IsThumb : 1;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003905 unsigned HWDiv : 2;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003906
3907 // Initialized via features.
3908 unsigned SoftFloat : 1;
3909 unsigned SoftFloatABI : 1;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003910
Bernard Ogden909f35a2013-10-29 09:47:51 +00003911 unsigned CRC : 1;
Stephen Hines651f13c2014-04-23 16:59:28 -07003912 unsigned Crypto : 1;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003913
Stephen Hines176edba2014-12-01 14:53:08 -08003914 // ACLE 6.5.1 Hardware floating point
3915 enum {
3916 HW_FP_HP = (1 << 1), /// half (16-bit)
3917 HW_FP_SP = (1 << 2), /// single (32-bit)
3918 HW_FP_DP = (1 << 3), /// double (64-bit)
3919 };
3920 uint32_t HW_FP;
3921
Chris Lattnerb4527522010-03-03 19:03:45 +00003922 static const Builtin::Info BuiltinInfo[];
3923
Rafael Espindola620c0af2013-05-13 20:09:47 +00003924 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola620c0af2013-05-13 20:09:47 +00003925 StringRef ArchName = T.getArchName();
Stephen Hines651f13c2014-04-23 16:59:28 -07003926 if (T.getArch() == llvm::Triple::arm ||
3927 T.getArch() == llvm::Triple::armeb) {
3928 StringRef VersionStr;
3929 if (ArchName.startswith("armv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003930 VersionStr = ArchName.substr(4, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003931 else if (ArchName.startswith("armebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003932 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003933 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003934 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003935 unsigned Version;
3936 if (VersionStr.getAsInteger(10, Version))
3937 return false;
3938 return Version >= 6;
3939 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003940 assert(T.getArch() == llvm::Triple::thumb ||
3941 T.getArch() == llvm::Triple::thumbeb);
3942 StringRef VersionStr;
3943 if (ArchName.startswith("thumbv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003944 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003945 else if (ArchName.startswith("thumbebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003946 VersionStr = ArchName.substr(8, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003947 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003948 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003949 unsigned Version;
3950 if (VersionStr.getAsInteger(10, Version))
3951 return false;
3952 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003953 }
3954
Stephen Hines651f13c2014-04-23 16:59:28 -07003955 void setABIAAPCS() {
3956 IsAAPCS = true;
3957
3958 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3959 const llvm::Triple &T = getTriple();
3960
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003961 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3962 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3963 T.getOS() == llvm::Triple::Bitrig)
Bill Wendling85ad3892013-12-02 19:19:57 +00003964 SizeType = UnsignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003965 else
3966 SizeType = UnsignedInt;
3967
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003968 switch (T.getOS()) {
3969 case llvm::Triple::NetBSD:
Bill Wendling604470b2013-12-01 04:22:48 +00003970 WCharType = SignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003971 break;
3972 case llvm::Triple::Win32:
3973 WCharType = UnsignedShort;
3974 break;
3975 case llvm::Triple::Linux:
3976 default:
Bill Wendling604470b2013-12-01 04:22:48 +00003977 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3978 WCharType = UnsignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003979 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07003980 }
3981
3982 UseBitFieldTypeAlignment = true;
3983
3984 ZeroLengthBitfieldBoundary = 0;
3985
Stephen Hines176edba2014-12-01 14:53:08 -08003986 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3987 // so set preferred for small types to 32.
3988 if (T.isOSBinFormatMachO()) {
3989 DescriptionString =
3990 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3991 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3992 } else if (T.isOSWindows()) {
Stephen Hines176edba2014-12-01 14:53:08 -08003993 assert(!BigEndian && "Windows on ARM does not support big endian");
3994 DescriptionString = "e"
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07003995 "-m:w"
Stephen Hines176edba2014-12-01 14:53:08 -08003996 "-p:32:32"
3997 "-i64:64"
3998 "-v128:64:128"
3999 "-a:0:32"
4000 "-n32"
4001 "-S64";
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004002 } else if (T.isOSNaCl()) {
4003 assert(!BigEndian && "NaCl on ARM does not support big endian");
4004 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Stephen Hines651f13c2014-04-23 16:59:28 -07004005 } else {
Stephen Hines176edba2014-12-01 14:53:08 -08004006 DescriptionString =
4007 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4008 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Stephen Hines651f13c2014-04-23 16:59:28 -07004009 }
4010
4011 // FIXME: Enumerated types are variable width in straight AAPCS.
4012 }
4013
4014 void setABIAPCS() {
4015 const llvm::Triple &T = getTriple();
4016
4017 IsAAPCS = false;
4018
4019 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
4020
4021 // size_t is unsigned int on FreeBSD.
4022 if (T.getOS() == llvm::Triple::FreeBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00004023 SizeType = UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07004024 else
4025 SizeType = UnsignedLong;
4026
4027 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4028 WCharType = SignedInt;
4029
4030 // Do not respect the alignment of bit-field types when laying out
4031 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4032 UseBitFieldTypeAlignment = false;
4033
4034 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4035 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4036 /// gcc.
4037 ZeroLengthBitfieldBoundary = 32;
4038
Stephen Hines176edba2014-12-01 14:53:08 -08004039 if (T.isOSBinFormatMachO())
4040 DescriptionString =
4041 BigEndian
4042 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4043 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4044 else
4045 DescriptionString =
4046 BigEndian
4047 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4048 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Stephen Hines651f13c2014-04-23 16:59:28 -07004049
4050 // FIXME: Override "preferred align" for double and long long.
4051 }
4052
4053public:
4054 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
4055 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Stephen Hines176edba2014-12-01 14:53:08 -08004056 IsAAPCS(true), HW_FP(0) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004057 BigEndian = IsBigEndian;
4058
4059 switch (getTriple().getOS()) {
4060 case llvm::Triple::NetBSD:
4061 PtrDiffType = SignedLong;
4062 break;
4063 default:
Bill Wendling85ad3892013-12-02 19:19:57 +00004064 PtrDiffType = SignedInt;
Bill Wendling604470b2013-12-01 04:22:48 +00004065 break;
4066 }
Daniel Dunbarf0156562009-09-17 16:21:10 +00004067
Chris Lattnere20b8122010-04-23 16:29:58 +00004068 // {} in inline assembly are neon specifiers, not assembly variant
4069 // specifiers.
4070 NoAsmVariants = true;
Michael J. Spencerd5513a32010-10-21 03:16:25 +00004071
Daniel Dunbar33b40752009-12-18 18:42:37 +00004072 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0a542ca2009-12-18 19:57:13 +00004073 IsThumb = getTriple().getArchName().startswith("thumb");
Stephen Hines651f13c2014-04-23 16:59:28 -07004074
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004075 // FIXME: This duplicates code from the driver that sets the -target-abi
4076 // option - this code is used if -target-abi isn't passed and should
4077 // be unified in some way.
4078 if (Triple.isOSBinFormatMachO()) {
4079 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4080 // the frontend matches that.
4081 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4082 Triple.getOS() == llvm::Triple::UnknownOS ||
4083 StringRef(CPU).startswith("cortex-m")) {
4084 setABI("aapcs");
4085 } else {
4086 setABI("apcs-gnu");
4087 }
4088 } else if (Triple.isOSWindows()) {
4089 // FIXME: this is invalid for WindowsCE
4090 setABI("aapcs");
4091 } else {
4092 // Select the default based on the platform.
4093 switch (Triple.getEnvironment()) {
4094 case llvm::Triple::Android:
4095 case llvm::Triple::GNUEABI:
4096 case llvm::Triple::GNUEABIHF:
4097 setABI("aapcs-linux");
4098 break;
4099 case llvm::Triple::EABIHF:
4100 case llvm::Triple::EABI:
4101 setABI("aapcs");
4102 break;
4103 case llvm::Triple::GNU:
4104 setABI("apcs-gnu");
4105 break;
4106 default:
4107 if (Triple.getOS() == llvm::Triple::NetBSD)
4108 setABI("apcs-gnu");
4109 else
4110 setABI("aapcs");
4111 break;
4112 }
4113 }
John McCall68086b92010-08-21 22:46:04 +00004114
4115 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00004116 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00004117
4118 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00004119 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00004120 if (shouldUseInlineAtomic(getTriple()))
4121 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00004122
4123 // Do force alignment of members that follow zero length bitfields. If
Stephen Hines176edba2014-12-01 14:53:08 -08004124 // the alignment of the zero-length bitfield is greater than the member
4125 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloye45b9b72012-03-12 09:14:10 +00004126 // zero length bitfield.
4127 UseZeroLengthBitfieldAlignment = true;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00004128 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004129 StringRef getABI() const override { return ABI; }
Stephen Hines651f13c2014-04-23 16:59:28 -07004130 bool setABI(const std::string &Name) override {
Daniel Dunbar0d83d512009-09-14 00:35:03 +00004131 ABI = Name;
4132
Daniel Dunbarb9531632009-09-14 00:02:24 +00004133 // The defaults (above) are for AAPCS, check if we need to change them.
4134 //
4135 // FIXME: We need support for -meabi... we could just mangle it into the
4136 // name.
4137 if (Name == "apcs-gnu") {
Stephen Hines651f13c2014-04-23 16:59:28 -07004138 setABIAPCS();
4139 return true;
4140 }
4141 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4142 setABIAAPCS();
4143 return true;
4144 }
4145 return false;
Daniel Dunbarb9531632009-09-14 00:02:24 +00004146 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00004147
Stephen Hines651f13c2014-04-23 16:59:28 -07004148 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004149 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004150 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4151 Features["vfp2"] = true;
Stephen Hines176edba2014-12-01 14:53:08 -08004152 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golin1302f9f2013-09-13 17:02:45 +00004153 Features["vfp3"] = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004154 Features["neon"] = true;
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004155 }
4156 else if (CPU == "cortex-a5") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004157 Features["vfp4"] = true;
4158 Features["neon"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004159 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4160 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Stephen Hines176edba2014-12-01 14:53:08 -08004161 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004162 Features["vfp4"] = true;
4163 Features["neon"] = true;
4164 Features["hwdiv"] = true;
4165 Features["hwdiv-arm"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004166 } else if (CPU == "cyclone") {
4167 Features["v8fp"] = true;
4168 Features["neon"] = true;
4169 Features["hwdiv"] = true;
4170 Features["hwdiv-arm"] = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004171 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenf779e652013-10-24 18:32:51 +00004172 Features["fp-armv8"] = true;
4173 Features["neon"] = true;
4174 Features["hwdiv"] = true;
4175 Features["hwdiv-arm"] = true;
Bernard Ogden909f35a2013-10-29 09:47:51 +00004176 Features["crc"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004177 Features["crypto"] = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004178 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004179 // Enable the hwdiv extension for all v8a AArch32 cores by
4180 // default.
4181 ArchName == "armv8a" || ArchName == "armv8" ||
Stephen Hines651f13c2014-04-23 16:59:28 -07004182 ArchName == "armebv8a" || ArchName == "armebv8" ||
4183 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4184 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00004185 Features["hwdiv"] = true;
4186 Features["hwdiv-arm"] = true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004187 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004188 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Stephen Hines651f13c2014-04-23 16:59:28 -07004189 Features["hwdiv"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00004190 }
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004191 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00004192
Stephen Hines651f13c2014-04-23 16:59:28 -07004193 bool handleTargetFeatures(std::vector<std::string> &Features,
4194 DiagnosticsEngine &Diags) override {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004195 FPU = 0;
Bernard Ogden909f35a2013-10-29 09:47:51 +00004196 CRC = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07004197 Crypto = 0;
Daniel Dunbar48075d82009-12-19 04:15:38 +00004198 SoftFloat = SoftFloatABI = false;
Silviu Baranga1db2e272013-10-21 10:54:53 +00004199 HWDiv = 0;
Stephen Hines176edba2014-12-01 14:53:08 -08004200
4201 for (const auto &Feature : Features) {
4202 if (Feature == "+soft-float") {
Daniel Dunbar48075d82009-12-19 04:15:38 +00004203 SoftFloat = true;
Stephen Hines176edba2014-12-01 14:53:08 -08004204 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar48075d82009-12-19 04:15:38 +00004205 SoftFloatABI = true;
Stephen Hines176edba2014-12-01 14:53:08 -08004206 } else if (Feature == "+vfp2") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004207 FPU |= VFP2FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004208 HW_FP = HW_FP_SP | HW_FP_DP;
4209 } else if (Feature == "+vfp3") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004210 FPU |= VFP3FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004211 HW_FP = HW_FP_SP | HW_FP_DP;
4212 } else if (Feature == "+vfp4") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004213 FPU |= VFP4FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004214 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4215 } else if (Feature == "+fp-armv8") {
Bernard Ogdenf779e652013-10-24 18:32:51 +00004216 FPU |= FPARMV8;
Stephen Hines176edba2014-12-01 14:53:08 -08004217 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4218 } else if (Feature == "+neon") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00004219 FPU |= NeonFPU;
Stephen Hines176edba2014-12-01 14:53:08 -08004220 HW_FP = HW_FP_SP | HW_FP_DP;
4221 } else if (Feature == "+long64") {
Stephen Hines64f85312011-10-21 14:54:52 -07004222 LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
Stephen Hines176edba2014-12-01 14:53:08 -08004223 } else if (Feature == "+hwdiv") {
Silviu Baranga1db2e272013-10-21 10:54:53 +00004224 HWDiv |= HWDivThumb;
Stephen Hines176edba2014-12-01 14:53:08 -08004225 } else if (Feature == "+hwdiv-arm") {
Silviu Baranga1db2e272013-10-21 10:54:53 +00004226 HWDiv |= HWDivARM;
Stephen Hines176edba2014-12-01 14:53:08 -08004227 } else if (Feature == "+crc") {
Bernard Ogden909f35a2013-10-29 09:47:51 +00004228 CRC = 1;
Stephen Hines176edba2014-12-01 14:53:08 -08004229 } else if (Feature == "+crypto") {
Stephen Hines651f13c2014-04-23 16:59:28 -07004230 Crypto = 1;
Stephen Hines176edba2014-12-01 14:53:08 -08004231 } else if (Feature == "+fp-only-sp") {
4232 HW_FP &= ~HW_FP_DP;
4233 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00004234 }
4235
Rafael Espindola5389b842013-08-21 21:59:03 +00004236 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4237 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4238 return false;
4239 }
4240
4241 if (FPMath == FP_Neon)
4242 Features.push_back("+neonfp");
4243 else if (FPMath == FP_VFP)
4244 Features.push_back("-neonfp");
4245
Daniel Dunbar48075d82009-12-19 04:15:38 +00004246 // Remove front-end specific options which the backend handles differently.
Stephen Hines176edba2014-12-01 14:53:08 -08004247 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4248 for (const auto &FEFeature : FrontEndFeatures) {
4249 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4250 if (Feature != Features.end())
4251 Features.erase(Feature);
4252 }
4253
Rafael Espindola5389b842013-08-21 21:59:03 +00004254 return true;
Daniel Dunbar48075d82009-12-19 04:15:38 +00004255 }
4256
Stephen Hines651f13c2014-04-23 16:59:28 -07004257 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00004258 return llvm::StringSwitch<bool>(Feature)
4259 .Case("arm", true)
4260 .Case("softfloat", SoftFloat)
4261 .Case("thumb", IsThumb)
Amara Emerson2440fb12013-09-16 18:07:35 +00004262 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Baranga1db2e272013-10-21 10:54:53 +00004263 .Case("hwdiv", HWDiv & HWDivThumb)
4264 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregore727d212012-01-30 06:38:25 +00004265 .Default(false);
4266 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004267 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00004268 static const char *getCPUDefineSuffix(StringRef Name) {
Stephen Hines176edba2014-12-01 14:53:08 -08004269 return llvm::StringSwitch<const char *>(Name)
4270 .Cases("arm8", "arm810", "4")
4271 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4272 "4")
4273 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4274 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4275 .Case("ep9312", "4T")
4276 .Cases("arm10tdmi", "arm1020t", "5T")
4277 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4278 .Case("arm926ej-s", "5TEJ")
4279 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4280 .Cases("xscale", "iwmmxt", "5TE")
4281 .Case("arm1136j-s", "6J")
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004282 .Case("arm1136jf-s", "6")
4283 .Cases("mpcorenovfp", "mpcore", "6K")
4284 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Stephen Hines176edba2014-12-01 14:53:08 -08004285 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4286 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4287 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4288 "7A")
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004289 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Stephen Hines176edba2014-12-01 14:53:08 -08004290 .Case("swift", "7S")
4291 .Case("cyclone", "8A")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004292 .Cases("sc300", "cortex-m3", "7M")
Stephen Hines176edba2014-12-01 14:53:08 -08004293 .Cases("cortex-m4", "cortex-m7", "7EM")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004294 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
4295 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Stephen Hines176edba2014-12-01 14:53:08 -08004296 .Default(nullptr);
Daniel Dunbar33b40752009-12-18 18:42:37 +00004297 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004298 static const char *getCPUProfile(StringRef Name) {
Stephen Hines176edba2014-12-01 14:53:08 -08004299 return llvm::StringSwitch<const char *>(Name)
4300 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4301 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4302 "A")
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004303 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
4304 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4305 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004306 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "R")
Stephen Hines176edba2014-12-01 14:53:08 -08004307 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004308 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004309 bool setCPU(const std::string &Name) override {
Daniel Dunbar33b40752009-12-18 18:42:37 +00004310 if (!getCPUDefineSuffix(Name))
4311 return false;
4312
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004313 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4314 StringRef Profile = getCPUProfile(Name);
4315 if (Profile == "M" && MaxAtomicInlineWidth) {
4316 MaxAtomicPromoteWidth = 32;
4317 MaxAtomicInlineWidth = 32;
4318 }
4319
Daniel Dunbar33b40752009-12-18 18:42:37 +00004320 CPU = Name;
4321 return true;
4322 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004323 bool setFPMath(StringRef Name) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004324 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4325 unsigned CPUArchVer) const {
4326 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4327 (CPUArch.find('M') != StringRef::npos);
4328 }
4329 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4330 unsigned CPUArchVer) const {
4331 // We check both CPUArchVer and ArchName because when only triple is
4332 // specified, the default CPU is arm1136j-s.
4333 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4334 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4335 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004336 void getTargetDefines(const LangOptions &Opts,
4337 MacroBuilder &Builder) const override {
Chris Lattnerbef1d722009-03-02 22:27:17 +00004338 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004339 Builder.defineMacro("__arm");
4340 Builder.defineMacro("__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00004341
Chris Lattnerbef1d722009-03-02 22:27:17 +00004342 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004343 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004344
Chris Lattner5f9e2722011-07-23 10:55:15 +00004345 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden51f997d2013-10-24 18:32:44 +00004346 unsigned int CPUArchVer;
Stephen Hines176edba2014-12-01 14:53:08 -08004347 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden51f997d2013-10-24 18:32:44 +00004348 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004349 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004350
4351 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004352 StringRef CPUProfile = getCPUProfile(CPU);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004353 StringRef ArchName = getTriple().getArchName();
4354
4355 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4356 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Stephen Hines176edba2014-12-01 14:53:08 -08004357 if (CPUArch[0] >= '8') {
4358 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4359 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4360 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004361
4362 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4363 // is not defined for the M-profile.
4364 // NOTE that the deffault profile is assumed to be 'A'
4365 if (CPUProfile.empty() || CPUProfile != "M")
4366 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4367
4368 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4369 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4370 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4371 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4372 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4373 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4374 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4375
4376 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4377 // instruction set such as ARM or Thumb.
4378 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4379
4380 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4381
4382 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004383 if (!CPUProfile.empty())
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004384 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
4385
Stephen Hines176edba2014-12-01 14:53:08 -08004386 // ACLE 6.5.1 Hardware Floating Point
4387 if (HW_FP)
4388 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
4389
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004390 // ACLE predefines.
4391 Builder.defineMacro("__ARM_ACLE", "200");
Stephen Hines651f13c2014-04-23 16:59:28 -07004392
Mike Stumpf90a29f2009-04-08 02:07:04 +00004393 // Subtarget options.
Daniel Dunbarf0156562009-09-17 16:21:10 +00004394
Daniel Dunbar33b40752009-12-18 18:42:37 +00004395 // FIXME: It's more complicated than this and we don't really support
4396 // interworking.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004397 // Windows on ARM does not "support" interworking
4398 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004399 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004400
David Tweedb16abb12012-10-25 13:33:01 +00004401 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northover9b796302013-11-11 19:11:22 +00004402 // Embedded targets on Darwin follow AAPCS, but not EABI.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004403 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4404 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbar849289e2012-10-22 18:51:13 +00004405 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004406 Builder.defineMacro("__ARM_PCS", "1");
4407
David Tweedb16abb12012-10-25 13:33:01 +00004408 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004409 Builder.defineMacro("__ARM_PCS_VFP", "1");
4410 }
Daniel Dunbar33b40752009-12-18 18:42:37 +00004411
Daniel Dunbar48075d82009-12-19 04:15:38 +00004412 if (SoftFloat)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004413 Builder.defineMacro("__SOFTFP__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004414
4415 if (CPU == "xscale")
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004416 Builder.defineMacro("__XSCALE__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004417
4418 if (IsThumb) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004419 Builder.defineMacro("__THUMBEL__");
4420 Builder.defineMacro("__thumb__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004421 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004422 Builder.defineMacro("__thumb2__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004423 }
Silviu Baranga1db2e272013-10-21 10:54:53 +00004424 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4425 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004426
4427 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004428 Builder.defineMacro("__APCS_32__");
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004429
Bob Wilsoncfaab002012-09-29 23:52:52 +00004430 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004431 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00004432 if (FPU & VFP2FPU)
4433 Builder.defineMacro("__ARM_VFPV2__");
4434 if (FPU & VFP3FPU)
4435 Builder.defineMacro("__ARM_VFPV3__");
4436 if (FPU & VFP4FPU)
4437 Builder.defineMacro("__ARM_VFPV4__");
4438 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004439
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004440 // This only gets set when Neon instructions are actually available, unlike
4441 // the VFP define, hence the soft float and arch check. This is subtly
4442 // different from gcc, we follow the intent which was that it should be set
4443 // when Neon instructions are actually available.
Stephen Hines651f13c2014-04-23 16:59:28 -07004444 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4445 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004446 Builder.defineMacro("__ARM_NEON__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004447 }
4448
4449 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4450 Opts.ShortWChar ? "2" : "4");
4451
4452 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4453 Opts.ShortEnums ? "1" : "4");
Joey Gouly520ec1e2013-09-18 10:07:09 +00004454
Bernard Ogden909f35a2013-10-29 09:47:51 +00004455 if (CRC)
Joey Gouly520ec1e2013-09-18 10:07:09 +00004456 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao8712ded2013-09-30 22:51:32 +00004457
Stephen Hines651f13c2014-04-23 16:59:28 -07004458 if (Crypto)
4459 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4460
Bernard Ogden51f997d2013-10-24 18:32:44 +00004461 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao8712ded2013-09-30 22:51:32 +00004462 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4463 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4464 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4465 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4466 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004467
4468 bool is5EOrAbove = (CPUArchVer >= 6 ||
4469 (CPUArchVer == 5 &&
4470 CPUArch.find('E') != StringRef::npos));
4471 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4472 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4473 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner9fd73612008-04-21 18:56:49 +00004474 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004475 void getTargetBuiltins(const Builtin::Info *&Records,
4476 unsigned &NumRecords) const override {
Chris Lattnerb4527522010-03-03 19:03:45 +00004477 Records = BuiltinInfo;
4478 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner9fd73612008-04-21 18:56:49 +00004479 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004480 bool isCLZForZeroUndef() const override { return false; }
4481 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chieneae5a8202012-10-10 06:56:20 +00004482 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner9fd73612008-04-21 18:56:49 +00004483 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004484 void getGCCRegNames(const char * const *&Names,
4485 unsigned &NumNames) const override;
4486 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4487 unsigned &NumAliases) const override;
4488 bool validateAsmConstraint(const char *&Name,
4489 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +00004490 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00004491 default: break;
Nate Begeman222823a2008-04-22 05:03:19 +00004492 case 'l': // r0-r7
4493 case 'h': // r8-r15
4494 case 'w': // VFP Floating point register single precision
4495 case 'P': // VFP Floating point register double precision
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00004496 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00004497 return true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004498 case 'I':
4499 case 'J':
4500 case 'K':
4501 case 'L':
4502 case 'M':
4503 // FIXME
4504 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00004505 case 'Q': // A memory address that is a single base register.
4506 Info.setAllowsMemory();
4507 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00004508 case 'U': // a memory reference...
4509 switch (Name[1]) {
4510 case 'q': // ...ARMV4 ldrsb
4511 case 'v': // ...VFP load/store (reg+constant offset)
4512 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00004513 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00004514 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00004515 case 'n': // valid address for Neon doubleword vector load/store
4516 case 'm': // valid address for Neon element and structure load/store
4517 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00004518 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00004519 Info.setAllowsMemory();
4520 Name++;
4521 return true;
4522 }
Nate Begeman222823a2008-04-22 05:03:19 +00004523 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004524 return false;
4525 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004526 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings002333f2011-06-07 23:45:05 +00004527 std::string R;
4528 switch (*Constraint) {
4529 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00004530 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00004531 Constraint++;
4532 break;
Eric Christopher283f4472011-06-17 00:40:18 +00004533 case 'p': // 'p' should be translated to 'r' by default.
4534 R = std::string("r");
4535 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00004536 default:
4537 return std::string(1, *Constraint);
4538 }
4539 return R;
4540 }
Stephen Hines176edba2014-12-01 14:53:08 -08004541 bool
4542 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4543 std::string &SuggestedModifier) const override {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004544 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00004545 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004546
Bill Wendling50d46ca2012-10-25 23:28:48 +00004547 // Strip off constraint modifiers.
4548 while (Constraint[0] == '=' ||
4549 Constraint[0] == '+' ||
4550 Constraint[0] == '&')
4551 Constraint = Constraint.substr(1);
4552
4553 switch (Constraint[0]) {
4554 default: break;
4555 case 'r': {
4556 switch (Modifier) {
4557 default:
Bill Wendlingdd6669d2013-12-09 02:58:56 +00004558 return (isInOut || isOutput || Size <= 64);
Bill Wendling50d46ca2012-10-25 23:28:48 +00004559 case 'q':
4560 // A register of size 32 cannot fit a vector type.
4561 return false;
4562 }
4563 }
4564 }
4565
4566 return true;
4567 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004568 const char *getClobbers() const override {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004569 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00004570 return "";
4571 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00004572
Stephen Hines651f13c2014-04-23 16:59:28 -07004573 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00004574 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4575 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004576
Stephen Hines651f13c2014-04-23 16:59:28 -07004577 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00004578 if (RegNo == 0) return 0;
4579 if (RegNo == 1) return 1;
4580 return -1;
4581 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004582};
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004583
Rafael Espindola5389b842013-08-21 21:59:03 +00004584bool ARMTargetInfo::setFPMath(StringRef Name) {
4585 if (Name == "neon") {
4586 FPMath = FP_Neon;
4587 return true;
4588 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4589 Name == "vfp4") {
4590 FPMath = FP_VFP;
4591 return true;
4592 }
4593 return false;
4594}
4595
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004596const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004597 // Integer registers
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004598 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004599 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4600
4601 // Float registers
4602 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4603 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4604 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004605 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004606
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004607 // Double registers
4608 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4609 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesen0d79b042010-10-28 01:05:37 +00004610 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4611 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004612
4613 // Quad registers
Dale Johannesen0d79b042010-10-28 01:05:37 +00004614 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4615 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004616};
4617
4618void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004619 unsigned &NumNames) const {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004620 Names = GCCRegNames;
4621 NumNames = llvm::array_lengthof(GCCRegNames);
4622}
4623
4624const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004625 { { "a1" }, "r0" },
4626 { { "a2" }, "r1" },
4627 { { "a3" }, "r2" },
4628 { { "a4" }, "r3" },
4629 { { "v1" }, "r4" },
4630 { { "v2" }, "r5" },
4631 { { "v3" }, "r6" },
4632 { { "v4" }, "r7" },
4633 { { "v5" }, "r8" },
4634 { { "v6", "rfp" }, "r9" },
4635 { { "sl" }, "r10" },
4636 { { "fp" }, "r11" },
4637 { { "ip" }, "r12" },
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004638 { { "r13" }, "sp" },
4639 { { "r14" }, "lr" },
4640 { { "r15" }, "pc" },
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004641 // The S, D and Q registers overlap, but aren't really aliases; we
4642 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004643};
4644
4645void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4646 unsigned &NumAliases) const {
4647 Aliases = GCCRegAliases;
4648 NumAliases = llvm::array_lengthof(GCCRegAliases);
4649}
Chris Lattnerb4527522010-03-03 19:03:45 +00004650
4651const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00004652#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00004653#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00004654 ALL_LANGUAGES },
Stephen Hines651f13c2014-04-23 16:59:28 -07004655#include "clang/Basic/BuiltinsNEON.def"
4656
4657#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004658#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Stephen Hines651f13c2014-04-23 16:59:28 -07004659#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4660 ALL_LANGUAGES },
Chris Lattnerb4527522010-03-03 19:03:45 +00004661#include "clang/Basic/BuiltinsARM.def"
4662};
Stephen Hines651f13c2014-04-23 16:59:28 -07004663
4664class ARMleTargetInfo : public ARMTargetInfo {
4665public:
4666 ARMleTargetInfo(const llvm::Triple &Triple)
4667 : ARMTargetInfo(Triple, false) { }
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004668 void getTargetDefines(const LangOptions &Opts,
4669 MacroBuilder &Builder) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004670 Builder.defineMacro("__ARMEL__");
4671 ARMTargetInfo::getTargetDefines(Opts, Builder);
4672 }
4673};
4674
4675class ARMbeTargetInfo : public ARMTargetInfo {
4676public:
4677 ARMbeTargetInfo(const llvm::Triple &Triple)
4678 : ARMTargetInfo(Triple, true) { }
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004679 void getTargetDefines(const LangOptions &Opts,
4680 MacroBuilder &Builder) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004681 Builder.defineMacro("__ARMEB__");
4682 Builder.defineMacro("__ARM_BIG_ENDIAN");
4683 ARMTargetInfo::getTargetDefines(Opts, Builder);
4684 }
4685};
Chris Lattner9fd73612008-04-21 18:56:49 +00004686
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004687class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4688 const llvm::Triple Triple;
4689public:
4690 WindowsARMTargetInfo(const llvm::Triple &Triple)
4691 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4692 TLSSupported = false;
4693 WCharType = UnsignedShort;
4694 SizeType = UnsignedInt;
4695 UserLabelPrefix = "";
4696 }
4697 void getVisualStudioDefines(const LangOptions &Opts,
4698 MacroBuilder &Builder) const {
4699 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4700
4701 // FIXME: this is invalid for WindowsCE
4702 Builder.defineMacro("_M_ARM_NT", "1");
4703 Builder.defineMacro("_M_ARMT", "_M_ARM");
4704 Builder.defineMacro("_M_THUMB", "_M_ARM");
4705
4706 assert((Triple.getArch() == llvm::Triple::arm ||
4707 Triple.getArch() == llvm::Triple::thumb) &&
4708 "invalid architecture for Windows ARM target info");
4709 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4710 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4711
4712 // TODO map the complete set of values
4713 // 31: VFPv3 40: VFPv4
4714 Builder.defineMacro("_M_ARM_FP", "31");
4715 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004716 BuiltinVaListKind getBuiltinVaListKind() const override {
4717 return TargetInfo::CharPtrBuiltinVaList;
4718 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004719};
4720
4721// Windows ARM + Itanium C++ ABI Target
4722class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4723public:
4724 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4725 : WindowsARMTargetInfo(Triple) {
4726 TheCXXABI.set(TargetCXXABI::GenericARM);
4727 }
4728
4729 void getTargetDefines(const LangOptions &Opts,
4730 MacroBuilder &Builder) const override {
4731 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4732
4733 if (Opts.MSVCCompat)
4734 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4735 }
4736};
4737
4738// Windows ARM, MS (C++) ABI
4739class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4740public:
4741 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4742 : WindowsARMTargetInfo(Triple) {
4743 TheCXXABI.set(TargetCXXABI::Microsoft);
4744 }
4745
4746 void getTargetDefines(const LangOptions &Opts,
4747 MacroBuilder &Builder) const override {
4748 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4749 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4750 }
4751};
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004752
Mike Stump25cf7602009-09-09 15:08:12 +00004753class DarwinARMTargetInfo :
Stephen Hines651f13c2014-04-23 16:59:28 -07004754 public DarwinTargetInfo<ARMleTargetInfo> {
Edwin Török36565e52009-06-30 17:10:35 +00004755protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07004756 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4757 MacroBuilder &Builder) const override {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004758 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedman8f575172009-04-19 21:38:35 +00004759 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004760
Edwin Török36565e52009-06-30 17:10:35 +00004761public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004762 DarwinARMTargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004763 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar01045582010-05-27 07:00:26 +00004764 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004765 // iOS always has 64-bit atomic instructions.
Stephen Hines176edba2014-12-01 14:53:08 -08004766 // FIXME: This should be based off of the target features in
4767 // ARMleTargetInfo.
Eli Friedman2be46072011-10-14 20:59:01 +00004768 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004769
4770 // Darwin on iOS uses a variant of the ARM C++ ABI.
4771 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar01045582010-05-27 07:00:26 +00004772 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004773};
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004774
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004775class AArch64TargetInfo : public TargetInfo {
4776 virtual void setDescriptionString() = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07004777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4778 static const char *const GCCRegNames[];
4779
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004780 enum FPUModeEnum {
4781 FPUMode,
4782 NeonMode
4783 };
4784
4785 unsigned FPU;
4786 unsigned CRC;
4787 unsigned Crypto;
4788
Stephen Hines651f13c2014-04-23 16:59:28 -07004789 static const Builtin::Info BuiltinInfo[];
4790
4791 std::string ABI;
4792
4793public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004794 AArch64TargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004795 : TargetInfo(Triple), ABI("aapcs") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004796
4797 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4798 WCharType = SignedInt;
4799
4800 // NetBSD apparently prefers consistency across ARM targets to consistency
4801 // across 64-bit targets.
4802 Int64Type = SignedLongLong;
4803 IntMaxType = SignedLongLong;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004804 } else {
4805 WCharType = UnsignedInt;
4806 Int64Type = SignedLong;
4807 IntMaxType = SignedLong;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004808 }
4809
Stephen Hines651f13c2014-04-23 16:59:28 -07004810 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07004811 MaxVectorAlign = 128;
4812 RegParmMax = 8;
4813 MaxAtomicInlineWidth = 128;
4814 MaxAtomicPromoteWidth = 128;
4815
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004816 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07004817 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4818
Stephen Hines651f13c2014-04-23 16:59:28 -07004819 // {} in inline assembly are neon specifiers, not assembly variant
4820 // specifiers.
4821 NoAsmVariants = true;
4822
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004823 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4824 // contributes to the alignment of the containing aggregate in the same way
4825 // a plain (non bit-field) member of that type would, without exception for
4826 // zero-sized or anonymous bit-fields."
4827 UseBitFieldTypeAlignment = true;
4828 UseZeroLengthBitfieldAlignment = true;
4829
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004830 // AArch64 targets default to using the ARM C++ ABI.
Stephen Hines651f13c2014-04-23 16:59:28 -07004831 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4832 }
4833
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004834 StringRef getABI() const override { return ABI; }
Stephen Hines176edba2014-12-01 14:53:08 -08004835 bool setABI(const std::string &Name) override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004836 if (Name != "aapcs" && Name != "darwinpcs")
4837 return false;
4838
4839 ABI = Name;
4840 return true;
4841 }
4842
Stephen Hines176edba2014-12-01 14:53:08 -08004843 bool setCPU(const std::string &Name) override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004844 bool CPUKnown = llvm::StringSwitch<bool>(Name)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004845 .Case("generic", true)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07004846 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Stephen Hines651f13c2014-04-23 16:59:28 -07004847 .Case("cyclone", true)
4848 .Default(false);
4849 return CPUKnown;
4850 }
4851
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004852 void getTargetDefines(const LangOptions &Opts,
4853 MacroBuilder &Builder) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004854 // Target identification.
Stephen Hines651f13c2014-04-23 16:59:28 -07004855 Builder.defineMacro("__aarch64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004856
4857 // Target properties.
4858 Builder.defineMacro("_LP64");
4859 Builder.defineMacro("__LP64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004860
4861 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4862 Builder.defineMacro("__ARM_ACLE", "200");
4863 Builder.defineMacro("__ARM_ARCH", "8");
4864 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4865
4866 Builder.defineMacro("__ARM_64BIT_STATE");
4867 Builder.defineMacro("__ARM_PCS_AAPCS64");
4868 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4869
4870 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4871 Builder.defineMacro("__ARM_FEATURE_CLZ");
4872 Builder.defineMacro("__ARM_FEATURE_FMA");
4873 Builder.defineMacro("__ARM_FEATURE_DIV");
Stephen Hines176edba2014-12-01 14:53:08 -08004874 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4875 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4876 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4877 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Stephen Hines651f13c2014-04-23 16:59:28 -07004878
4879 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4880
4881 // 0xe implies support for half, single and double precision operations.
4882 Builder.defineMacro("__ARM_FP", "0xe");
4883
4884 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4885 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4886 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4887
4888 if (Opts.FastMath || Opts.FiniteMathOnly)
4889 Builder.defineMacro("__ARM_FP_FAST");
4890
Stephen Hines176edba2014-12-01 14:53:08 -08004891 if (Opts.C99 && !Opts.Freestanding)
Stephen Hines651f13c2014-04-23 16:59:28 -07004892 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4893
4894 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4895
4896 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4897 Opts.ShortEnums ? "1" : "4");
4898
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004899 if (FPU == NeonMode) {
4900 Builder.defineMacro("__ARM_NEON");
4901 // 64-bit NEON supports half, single and double precision operations.
4902 Builder.defineMacro("__ARM_NEON_FP", "0xe");
4903 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004904
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004905 if (CRC)
4906 Builder.defineMacro("__ARM_FEATURE_CRC32");
Stephen Hines651f13c2014-04-23 16:59:28 -07004907
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004908 if (Crypto)
4909 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Stephen Hines651f13c2014-04-23 16:59:28 -07004910 }
4911
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004912 void getTargetBuiltins(const Builtin::Info *&Records,
4913 unsigned &NumRecords) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004914 Records = BuiltinInfo;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004915 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Stephen Hines651f13c2014-04-23 16:59:28 -07004916 }
4917
Stephen Hines176edba2014-12-01 14:53:08 -08004918 bool hasFeature(StringRef Feature) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004919 return Feature == "aarch64" ||
4920 Feature == "arm64" ||
4921 (Feature == "neon" && FPU == NeonMode);
4922 }
4923
4924 bool handleTargetFeatures(std::vector<std::string> &Features,
4925 DiagnosticsEngine &Diags) override {
4926 FPU = FPUMode;
4927 CRC = 0;
4928 Crypto = 0;
4929 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4930 if (Features[i] == "+neon")
4931 FPU = NeonMode;
4932 if (Features[i] == "+crc")
4933 CRC = 1;
4934 if (Features[i] == "+crypto")
4935 Crypto = 1;
4936 }
4937
4938 setDescriptionString();
4939
4940 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004941 }
4942
Stephen Hines176edba2014-12-01 14:53:08 -08004943 bool isCLZForZeroUndef() const override { return false; }
Stephen Hines651f13c2014-04-23 16:59:28 -07004944
Stephen Hines176edba2014-12-01 14:53:08 -08004945 BuiltinVaListKind getBuiltinVaListKind() const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004946 return TargetInfo::AArch64ABIBuiltinVaList;
4947 }
4948
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004949 void getGCCRegNames(const char *const *&Names,
4950 unsigned &NumNames) const override;
4951 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4952 unsigned &NumAliases) const override;
Stephen Hines651f13c2014-04-23 16:59:28 -07004953
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07004954 bool validateAsmConstraint(const char *&Name,
4955 TargetInfo::ConstraintInfo &Info) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004956 switch (*Name) {
4957 default:
4958 return false;
4959 case 'w': // Floating point and SIMD registers (V0-V31)
4960 Info.setAllowsRegister();
4961 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004962 case 'I': // Constant that can be used with an ADD instruction
4963 case 'J': // Constant that can be used with a SUB instruction
4964 case 'K': // Constant that can be used with a 32-bit logical instruction
4965 case 'L': // Constant that can be used with a 64-bit logical instruction
4966 case 'M': // Constant that can be used as a 32-bit MOV immediate
4967 case 'N': // Constant that can be used as a 64-bit MOV immediate
4968 case 'Y': // Floating point constant zero
4969 case 'Z': // Integer constant zero
4970 return true;
4971 case 'Q': // A memory reference with base register and no offset
4972 Info.setAllowsMemory();
4973 return true;
4974 case 'S': // A symbolic address
4975 Info.setAllowsRegister();
4976 return true;
4977 case 'U':
Stephen Hines176edba2014-12-01 14:53:08 -08004978 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4979 // Utf: A memory address suitable for ldp/stp in TF mode.
4980 // Usa: An absolute symbolic address.
4981 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4982 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Stephen Hines651f13c2014-04-23 16:59:28 -07004983 case 'z': // Zero register, wzr or xzr
4984 Info.setAllowsRegister();
4985 return true;
4986 case 'x': // Floating point and SIMD registers (V0-V15)
4987 Info.setAllowsRegister();
4988 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004989 }
4990 return false;
4991 }
4992
Stephen Hines176edba2014-12-01 14:53:08 -08004993 bool
4994 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4995 std::string &SuggestedModifier) const override {
4996 // Strip off constraint modifiers.
4997 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4998 Constraint = Constraint.substr(1);
Stephen Hines651f13c2014-04-23 16:59:28 -07004999
Stephen Hines176edba2014-12-01 14:53:08 -08005000 switch (Constraint[0]) {
5001 default:
5002 return true;
5003 case 'z':
5004 case 'r': {
5005 switch (Modifier) {
5006 case 'x':
5007 case 'w':
5008 // For now assume that the person knows what they're
5009 // doing with the modifier.
5010 return true;
5011 default:
5012 // By default an 'r' constraint will be in the 'x'
5013 // registers.
5014 if (Size == 64)
5015 return true;
5016
5017 SuggestedModifier = "w";
5018 return false;
5019 }
5020 }
5021 }
5022 }
5023
5024 const char *getClobbers() const override { return ""; }
5025
5026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07005027 if (RegNo == 0)
5028 return 0;
5029 if (RegNo == 1)
5030 return 1;
5031 return -1;
5032 }
5033};
5034
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005035const char *const AArch64TargetInfo::GCCRegNames[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07005036 // 32-bit Integer registers
5037 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5038 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5039 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5040
5041 // 64-bit Integer registers
5042 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5043 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5044 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5045
5046 // 32-bit floating point regsisters
5047 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5048 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5049 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5050
5051 // 64-bit floating point regsisters
5052 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5053 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5054 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5055
5056 // Vector registers
5057 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5058 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5059 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5060};
5061
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005062void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Stephen Hines651f13c2014-04-23 16:59:28 -07005063 unsigned &NumNames) const {
5064 Names = GCCRegNames;
5065 NumNames = llvm::array_lengthof(GCCRegNames);
5066}
5067
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005068const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07005069 { { "w31" }, "wsp" },
5070 { { "x29" }, "fp" },
5071 { { "x30" }, "lr" },
5072 { { "x31" }, "sp" },
5073 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5074 // don't want to substitute one of these for a different-sized one.
5075};
5076
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005077void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Stephen Hines651f13c2014-04-23 16:59:28 -07005078 unsigned &NumAliases) const {
5079 Aliases = GCCRegAliases;
5080 NumAliases = llvm::array_lengthof(GCCRegAliases);
5081}
5082
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005083const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07005084#define BUILTIN(ID, TYPE, ATTRS) \
5085 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5086#include "clang/Basic/BuiltinsNEON.def"
5087
5088#define BUILTIN(ID, TYPE, ATTRS) \
5089 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005090#include "clang/Basic/BuiltinsAArch64.def"
5091};
5092
5093class AArch64leTargetInfo : public AArch64TargetInfo {
5094 void setDescriptionString() override {
5095 if (getTriple().isOSBinFormatMachO())
5096 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5097 else
5098 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5099 }
5100
5101public:
5102 AArch64leTargetInfo(const llvm::Triple &Triple)
5103 : AArch64TargetInfo(Triple) {
5104 BigEndian = false;
5105 }
5106 void getTargetDefines(const LangOptions &Opts,
5107 MacroBuilder &Builder) const override {
5108 Builder.defineMacro("__AARCH64EL__");
5109 AArch64TargetInfo::getTargetDefines(Opts, Builder);
5110 }
5111};
5112
5113class AArch64beTargetInfo : public AArch64TargetInfo {
5114 void setDescriptionString() override {
5115 assert(!getTriple().isOSBinFormatMachO());
5116 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5117 }
5118
5119public:
5120 AArch64beTargetInfo(const llvm::Triple &Triple)
5121 : AArch64TargetInfo(Triple) { }
5122 void getTargetDefines(const LangOptions &Opts,
5123 MacroBuilder &Builder) const override {
5124 Builder.defineMacro("__AARCH64EB__");
5125 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5126 Builder.defineMacro("__ARM_BIG_ENDIAN");
5127 AArch64TargetInfo::getTargetDefines(Opts, Builder);
5128 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005129};
Stephen Hines651f13c2014-04-23 16:59:28 -07005130
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005131class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
5132protected:
5133 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5134 MacroBuilder &Builder) const override {
5135 Builder.defineMacro("__AARCH64_SIMD__");
5136 Builder.defineMacro("__ARM64_ARCH_8__");
5137 Builder.defineMacro("__ARM_NEON__");
5138 Builder.defineMacro("__LITTLE_ENDIAN__");
5139 Builder.defineMacro("__REGISTER_PREFIX__", "");
5140 Builder.defineMacro("__arm64", "1");
5141 Builder.defineMacro("__arm64__", "1");
5142
5143 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5144 }
5145
Stephen Hines651f13c2014-04-23 16:59:28 -07005146public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005147 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5148 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07005149 Int64Type = SignedLongLong;
5150 WCharType = SignedInt;
5151 UseSignedCharForObjCBool = false;
5152
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005153 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07005154 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5155
5156 TheCXXABI.set(TargetCXXABI::iOS64);
5157 }
5158
Stephen Hines176edba2014-12-01 14:53:08 -08005159 BuiltinVaListKind getBuiltinVaListKind() const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07005160 return TargetInfo::CharPtrBuiltinVaList;
5161 }
5162};
Stephen Hines651f13c2014-04-23 16:59:28 -07005163
Tony Linthicum96319392011-12-12 21:14:55 +00005164// Hexagon abstract base class
5165class HexagonTargetInfo : public TargetInfo {
5166 static const Builtin::Info BuiltinInfo[];
5167 static const char * const GCCRegNames[];
5168 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5169 std::string CPU;
5170public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005171 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005172 BigEndian = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07005173 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum96319392011-12-12 21:14:55 +00005174
5175 // {} in inline assembly are packet specifiers, not assembly variant
5176 // specifiers.
5177 NoAsmVariants = true;
5178 }
5179
Stephen Hines651f13c2014-04-23 16:59:28 -07005180 void getTargetBuiltins(const Builtin::Info *&Records,
5181 unsigned &NumRecords) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00005182 Records = BuiltinInfo;
5183 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5184 }
5185
Stephen Hines651f13c2014-04-23 16:59:28 -07005186 bool validateAsmConstraint(const char *&Name,
5187 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00005188 return true;
5189 }
5190
Stephen Hines651f13c2014-04-23 16:59:28 -07005191 void getTargetDefines(const LangOptions &Opts,
5192 MacroBuilder &Builder) const override;
Tony Linthicum96319392011-12-12 21:14:55 +00005193
Stephen Hines651f13c2014-04-23 16:59:28 -07005194 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005195 return Feature == "hexagon";
5196 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005197
5198 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005199 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00005200 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005201 void getGCCRegNames(const char * const *&Names,
5202 unsigned &NumNames) const override;
5203 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5204 unsigned &NumAliases) const override;
5205 const char *getClobbers() const override {
Tony Linthicum96319392011-12-12 21:14:55 +00005206 return "";
5207 }
Sebastian Pop43115d42012-01-13 20:37:10 +00005208
5209 static const char *getHexagonCPUSuffix(StringRef Name) {
5210 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00005211 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00005212 .Case("hexagonv5", "5")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005213 .Default(nullptr);
Sebastian Pop43115d42012-01-13 20:37:10 +00005214 }
5215
Stephen Hines651f13c2014-04-23 16:59:28 -07005216 bool setCPU(const std::string &Name) override {
Sebastian Pop43115d42012-01-13 20:37:10 +00005217 if (!getHexagonCPUSuffix(Name))
5218 return false;
5219
Tony Linthicum96319392011-12-12 21:14:55 +00005220 CPU = Name;
5221 return true;
5222 }
5223};
5224
5225void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5226 MacroBuilder &Builder) const {
5227 Builder.defineMacro("qdsp6");
5228 Builder.defineMacro("__qdsp6", "1");
5229 Builder.defineMacro("__qdsp6__", "1");
5230
5231 Builder.defineMacro("hexagon");
5232 Builder.defineMacro("__hexagon", "1");
5233 Builder.defineMacro("__hexagon__", "1");
5234
5235 if(CPU == "hexagonv1") {
5236 Builder.defineMacro("__HEXAGON_V1__");
5237 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5238 if(Opts.HexagonQdsp6Compat) {
5239 Builder.defineMacro("__QDSP6_V1__");
5240 Builder.defineMacro("__QDSP6_ARCH__", "1");
5241 }
5242 }
5243 else if(CPU == "hexagonv2") {
5244 Builder.defineMacro("__HEXAGON_V2__");
5245 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5246 if(Opts.HexagonQdsp6Compat) {
5247 Builder.defineMacro("__QDSP6_V2__");
5248 Builder.defineMacro("__QDSP6_ARCH__", "2");
5249 }
5250 }
5251 else if(CPU == "hexagonv3") {
5252 Builder.defineMacro("__HEXAGON_V3__");
5253 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5254 if(Opts.HexagonQdsp6Compat) {
5255 Builder.defineMacro("__QDSP6_V3__");
5256 Builder.defineMacro("__QDSP6_ARCH__", "3");
5257 }
5258 }
5259 else if(CPU == "hexagonv4") {
5260 Builder.defineMacro("__HEXAGON_V4__");
5261 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5262 if(Opts.HexagonQdsp6Compat) {
5263 Builder.defineMacro("__QDSP6_V4__");
5264 Builder.defineMacro("__QDSP6_ARCH__", "4");
5265 }
5266 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00005267 else if(CPU == "hexagonv5") {
5268 Builder.defineMacro("__HEXAGON_V5__");
5269 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5270 if(Opts.HexagonQdsp6Compat) {
5271 Builder.defineMacro("__QDSP6_V5__");
5272 Builder.defineMacro("__QDSP6_ARCH__", "5");
5273 }
5274 }
Tony Linthicum96319392011-12-12 21:14:55 +00005275}
5276
5277const char * const HexagonTargetInfo::GCCRegNames[] = {
5278 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5279 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5280 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5281 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5282 "p0", "p1", "p2", "p3",
5283 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5284};
5285
5286void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5287 unsigned &NumNames) const {
5288 Names = GCCRegNames;
5289 NumNames = llvm::array_lengthof(GCCRegNames);
5290}
5291
5292
5293const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5294 { { "sp" }, "r29" },
5295 { { "fp" }, "r30" },
5296 { { "lr" }, "r31" },
5297 };
5298
5299void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5300 unsigned &NumAliases) const {
5301 Aliases = GCCRegAliases;
5302 NumAliases = llvm::array_lengthof(GCCRegAliases);
5303}
5304
5305
5306const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5307#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5308#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5309 ALL_LANGUAGES },
5310#include "clang/Basic/BuiltinsHexagon.def"
5311};
Tony Linthicum96319392011-12-12 21:14:55 +00005312
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005313// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5314class SparcTargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005315 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5316 static const char * const GCCRegNames[];
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005317 bool SoftFloat;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005318public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005319 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005320
Stephen Hines651f13c2014-04-23 16:59:28 -07005321 bool handleTargetFeatures(std::vector<std::string> &Features,
5322 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005323 SoftFloat = false;
5324 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5325 if (Features[i] == "+soft-float")
5326 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00005327 return true;
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005328 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005329 void getTargetDefines(const LangOptions &Opts,
5330 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005331 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005332 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005333
5334 if (SoftFloat)
5335 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005336 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005337
5338 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005339 return llvm::StringSwitch<bool>(Feature)
5340 .Case("softfloat", SoftFloat)
5341 .Case("sparc", true)
5342 .Default(false);
5343 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005344
5345 void getTargetBuiltins(const Builtin::Info *&Records,
5346 unsigned &NumRecords) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005347 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005348 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005350 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005351 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005352 void getGCCRegNames(const char * const *&Names,
5353 unsigned &NumNames) const override;
5354 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5355 unsigned &NumAliases) const override;
5356 bool validateAsmConstraint(const char *&Name,
5357 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005358 // FIXME: Implement!
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005359 switch (*Name) {
5360 case 'I': // Signed 13-bit constant
5361 case 'J': // Zero
5362 case 'K': // 32-bit constant with the low 12 bits clear
5363 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5364 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5365 case 'N': // Same as 'K' but zext (required for SIMode)
5366 case 'O': // The constant 4096
5367 return true;
5368 }
Eli Friedmanff158dd2008-08-20 07:28:14 +00005369 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005370 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005371 const char *getClobbers() const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005372 // FIXME: Implement!
5373 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005374 }
5375};
5376
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005377const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005378 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5379 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5380 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5381 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5382};
5383
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005384void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5385 unsigned &NumNames) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005386 Names = GCCRegNames;
5387 NumNames = llvm::array_lengthof(GCCRegNames);
5388}
5389
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005390const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikove7772382009-05-03 13:42:53 +00005391 { { "g0" }, "r0" },
5392 { { "g1" }, "r1" },
5393 { { "g2" }, "r2" },
5394 { { "g3" }, "r3" },
5395 { { "g4" }, "r4" },
5396 { { "g5" }, "r5" },
5397 { { "g6" }, "r6" },
5398 { { "g7" }, "r7" },
5399 { { "o0" }, "r8" },
5400 { { "o1" }, "r9" },
5401 { { "o2" }, "r10" },
5402 { { "o3" }, "r11" },
5403 { { "o4" }, "r12" },
5404 { { "o5" }, "r13" },
5405 { { "o6", "sp" }, "r14" },
5406 { { "o7" }, "r15" },
5407 { { "l0" }, "r16" },
5408 { { "l1" }, "r17" },
5409 { { "l2" }, "r18" },
5410 { { "l3" }, "r19" },
5411 { { "l4" }, "r20" },
5412 { { "l5" }, "r21" },
5413 { { "l6" }, "r22" },
5414 { { "l7" }, "r23" },
5415 { { "i0" }, "r24" },
5416 { { "i1" }, "r25" },
5417 { { "i2" }, "r26" },
5418 { { "i3" }, "r27" },
5419 { { "i4" }, "r28" },
5420 { { "i5" }, "r29" },
5421 { { "i6", "fp" }, "r30" },
5422 { { "i7" }, "r31" },
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005423};
5424
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005425void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5426 unsigned &NumAliases) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005427 Aliases = GCCRegAliases;
5428 NumAliases = llvm::array_lengthof(GCCRegAliases);
5429}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005430
5431// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5432class SparcV8TargetInfo : public SparcTargetInfo {
5433public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005434 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07005435 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005436 }
5437
Stephen Hines651f13c2014-04-23 16:59:28 -07005438 void getTargetDefines(const LangOptions &Opts,
5439 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005440 SparcTargetInfo::getTargetDefines(Opts, Builder);
5441 Builder.defineMacro("__sparcv8");
5442 }
5443};
5444
5445// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5446class SparcV9TargetInfo : public SparcTargetInfo {
5447public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005448 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005449 // FIXME: Support Sparc quad-precision long double?
Stephen Hines651f13c2014-04-23 16:59:28 -07005450 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00005451 // This is an LP64 platform.
5452 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005453
5454 // OpenBSD uses long long for int64_t and intmax_t.
Stephen Hines176edba2014-12-01 14:53:08 -08005455 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005456 IntMaxType = SignedLongLong;
Stephen Hines176edba2014-12-01 14:53:08 -08005457 else
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005458 IntMaxType = SignedLong;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005459 Int64Type = IntMaxType;
Stephen Hines651f13c2014-04-23 16:59:28 -07005460
5461 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5462 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5463 LongDoubleWidth = 128;
5464 LongDoubleAlign = 128;
5465 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5466 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005467 }
5468
Stephen Hines651f13c2014-04-23 16:59:28 -07005469 void getTargetDefines(const LangOptions &Opts,
5470 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005471 SparcTargetInfo::getTargetDefines(Opts, Builder);
5472 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00005473 Builder.defineMacro("__arch64__");
Stephen Hines176edba2014-12-01 14:53:08 -08005474 // Solaris doesn't need these variants, but the BSDs do.
5475 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00005476 Builder.defineMacro("__sparc64__");
5477 Builder.defineMacro("__sparc_v9__");
5478 Builder.defineMacro("__sparcv9__");
5479 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005480 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005481
5482 bool setCPU(const std::string &Name) override {
5483 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5484 .Case("v9", true)
5485 .Case("ultrasparc", true)
5486 .Case("ultrasparc3", true)
5487 .Case("niagara", true)
5488 .Case("niagara2", true)
5489 .Case("niagara3", true)
5490 .Case("niagara4", true)
5491 .Default(false);
5492
5493 // No need to store the CPU yet. There aren't any CPU-specific
5494 // macros to define.
5495 return CPUKnown;
5496 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005497};
5498
Edwin Török36565e52009-06-30 17:10:35 +00005499class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005500public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005501 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5502 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedman7cca0982008-11-02 02:43:55 +00005503 SizeType = UnsignedInt;
5504 PtrDiffType = SignedInt;
Eli Friedmanff158dd2008-08-20 07:28:14 +00005505 }
5506};
Chris Lattner4b009652007-07-25 00:24:17 +00005507
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005508class SystemZTargetInfo : public TargetInfo {
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005509 static const Builtin::Info BuiltinInfo[];
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005510 static const char *const GCCRegNames[];
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005511 std::string CPU;
5512 bool HasTransactionalExecution;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005513
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005514public:
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005515 SystemZTargetInfo(const llvm::Triple &Triple)
5516 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false) {
5517 IntMaxType = SignedLong;
5518 Int64Type = SignedLong;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005519 TLSSupported = true;
5520 IntWidth = IntAlign = 32;
5521 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5522 PointerWidth = PointerAlign = 64;
5523 LongDoubleWidth = 128;
5524 LongDoubleAlign = 64;
5525 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5526 MinGlobalAlign = 16;
5527 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5528 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5529 }
5530 void getTargetDefines(const LangOptions &Opts,
5531 MacroBuilder &Builder) const override {
5532 Builder.defineMacro("__s390__");
5533 Builder.defineMacro("__s390x__");
5534 Builder.defineMacro("__zarch__");
5535 Builder.defineMacro("__LONG_DOUBLE_128__");
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005536 if (HasTransactionalExecution)
5537 Builder.defineMacro("__HTM__");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005538 }
5539 void getTargetBuiltins(const Builtin::Info *&Records,
5540 unsigned &NumRecords) const override {
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005541 Records = BuiltinInfo;
5542 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005543 }
5544
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005545 void getGCCRegNames(const char *const *&Names,
5546 unsigned &NumNames) const override;
5547 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5548 unsigned &NumAliases) const override {
5549 // No aliases.
5550 Aliases = nullptr;
5551 NumAliases = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005552 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005553 bool validateAsmConstraint(const char *&Name,
5554 TargetInfo::ConstraintInfo &info) const override;
5555 const char *getClobbers() const override {
5556 // FIXME: Is this really right?
5557 return "";
5558 }
5559 BuiltinVaListKind getBuiltinVaListKind() const override {
5560 return TargetInfo::SystemZBuiltinVaList;
5561 }
5562 bool setCPU(const std::string &Name) override {
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005563 CPU = Name;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005564 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5565 .Case("z10", true)
5566 .Case("z196", true)
5567 .Case("zEC12", true)
5568 .Default(false);
5569
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005570 return CPUKnown;
5571 }
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005572 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5573 if (CPU == "zEC12")
5574 Features["transactional-execution"] = true;
5575 }
5576
5577 bool handleTargetFeatures(std::vector<std::string> &Features,
5578 DiagnosticsEngine &Diags) override {
5579 HasTransactionalExecution = false;
5580 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5581 if (Features[i] == "+transactional-execution")
5582 HasTransactionalExecution = true;
5583 }
5584 return true;
5585 }
5586
5587 bool hasFeature(StringRef Feature) const override {
5588 return llvm::StringSwitch<bool>(Feature)
5589 .Case("systemz", true)
5590 .Case("htm", HasTransactionalExecution)
5591 .Default(false);
5592 }
5593};
5594
5595const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5596#define BUILTIN(ID, TYPE, ATTRS) \
5597 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5598#include "clang/Basic/BuiltinsSystemZ.def"
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005599};
5600
5601const char *const SystemZTargetInfo::GCCRegNames[] = {
5602 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5603 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5604 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5605 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5606};
5607
5608void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5609 unsigned &NumNames) const {
5610 Names = GCCRegNames;
5611 NumNames = llvm::array_lengthof(GCCRegNames);
5612}
5613
5614bool SystemZTargetInfo::
5615validateAsmConstraint(const char *&Name,
5616 TargetInfo::ConstraintInfo &Info) const {
5617 switch (*Name) {
5618 default:
5619 return false;
5620
5621 case 'a': // Address register
5622 case 'd': // Data register (equivalent to 'r')
5623 case 'f': // Floating-point register
5624 Info.setAllowsRegister();
5625 return true;
5626
5627 case 'I': // Unsigned 8-bit constant
5628 case 'J': // Unsigned 12-bit constant
5629 case 'K': // Signed 16-bit constant
5630 case 'L': // Signed 20-bit displacement (on all targets we support)
5631 case 'M': // 0x7fffffff
5632 return true;
5633
5634 case 'Q': // Memory with base and unsigned 12-bit displacement
5635 case 'R': // Likewise, plus an index
5636 case 'S': // Memory with base and signed 20-bit displacement
5637 case 'T': // Likewise, plus an index
5638 Info.setAllowsMemory();
5639 return true;
5640 }
5641}
Ulrich Weigandb8409212013-05-06 16:26:41 +00005642
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005643 class MSP430TargetInfo : public TargetInfo {
5644 static const char * const GCCRegNames[];
5645 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005646 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005647 BigEndian = false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005648 TLSSupported = false;
Anton Korobeynikov2a6630a2010-01-30 12:55:11 +00005649 IntWidth = 16; IntAlign = 16;
5650 LongWidth = 32; LongLongWidth = 64;
5651 LongAlign = LongLongAlign = 16;
5652 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005653 SuitableAlign = 16;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005654 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005655 IntMaxType = SignedLongLong;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005656 IntPtrType = SignedInt;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005657 PtrDiffType = SignedInt;
Edward O'Callaghan14a70a32009-11-21 00:49:54 +00005658 SigAtomicType = SignedLong;
Stephen Hines176edba2014-12-01 14:53:08 -08005659 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Stephen Hines651f13c2014-04-23 16:59:28 -07005660 }
5661 void getTargetDefines(const LangOptions &Opts,
5662 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005663 Builder.defineMacro("MSP430");
5664 Builder.defineMacro("__MSP430__");
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005665 // FIXME: defines for different 'flavours' of MCU
5666 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005667 void getTargetBuiltins(const Builtin::Info *&Records,
5668 unsigned &NumRecords) const override {
5669 // FIXME: Implement.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005670 Records = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005671 NumRecords = 0;
5672 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005673 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005674 return Feature == "msp430";
5675 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005676 void getGCCRegNames(const char * const *&Names,
5677 unsigned &NumNames) const override;
5678 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5679 unsigned &NumAliases) const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005680 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005681 Aliases = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005682 NumAliases = 0;
5683 }
Stephen Hines176edba2014-12-01 14:53:08 -08005684 bool
5685 validateAsmConstraint(const char *&Name,
5686 TargetInfo::ConstraintInfo &info) const override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005687 // FIXME: implement
5688 switch (*Name) {
5689 case 'K': // the constant 1
5690 case 'L': // constant -1^20 .. 1^19
5691 case 'M': // constant 1-4:
5692 return true;
5693 }
Anton Korobeynikov174219b2009-10-15 23:17:13 +00005694 // No target constraints for now.
5695 return false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005696 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005697 const char *getClobbers() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005698 // FIXME: Is this really right?
5699 return "";
5700 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005701 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005702 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00005703 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005704 }
5705 };
5706
5707 const char * const MSP430TargetInfo::GCCRegNames[] = {
5708 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5709 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5710 };
5711
5712 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5713 unsigned &NumNames) const {
5714 Names = GCCRegNames;
5715 NumNames = llvm::array_lengthof(GCCRegNames);
5716 }
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005717
Mike Stump25cf7602009-09-09 15:08:12 +00005718 // LLVM and Clang cannot be used directly to output native binaries for
5719 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005720 // type and alignment information.
Mike Stump25cf7602009-09-09 15:08:12 +00005721 //
5722 // TCE uses the llvm bitcode as input and uses it for generating customized
5723 // target processor and program binary. TCE co-design environment is
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005724 // publicly available in http://tce.cs.tut.fi
5725
Eli Friedman209f5bb2011-10-07 19:51:42 +00005726 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5727 3, // opencl_global
5728 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00005729 5, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005730 // FIXME: generic has to be added to the target
5731 0, // opencl_generic
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00005732 0, // cuda_device
5733 0, // cuda_constant
5734 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00005735 };
5736
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005737 class TCETargetInfo : public TargetInfo{
5738 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005739 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005740 TLSSupported = false;
5741 IntWidth = 32;
5742 LongWidth = LongLongWidth = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005743 PointerWidth = 32;
5744 IntAlign = 32;
5745 LongAlign = LongLongAlign = 32;
5746 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005747 SuitableAlign = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005748 SizeType = UnsignedInt;
5749 IntMaxType = SignedLong;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005750 IntPtrType = SignedInt;
5751 PtrDiffType = SignedInt;
5752 FloatWidth = 32;
5753 FloatAlign = 32;
5754 DoubleWidth = 32;
5755 DoubleAlign = 32;
5756 LongDoubleWidth = 32;
5757 LongDoubleAlign = 32;
5758 FloatFormat = &llvm::APFloat::IEEEsingle;
5759 DoubleFormat = &llvm::APFloat::IEEEsingle;
5760 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Stephen Hines651f13c2014-04-23 16:59:28 -07005761 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5762 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00005763 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005764 UseAddrSpaceMapMangling = true;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005765 }
5766
Stephen Hines651f13c2014-04-23 16:59:28 -07005767 void getTargetDefines(const LangOptions &Opts,
5768 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005769 DefineStd(Builder, "tce", Opts);
5770 Builder.defineMacro("__TCE__");
5771 Builder.defineMacro("__TCE_V1__");
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005772 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005773 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005774 return Feature == "tce";
5775 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005776
5777 void getTargetBuiltins(const Builtin::Info *&Records,
5778 unsigned &NumRecords) const override {}
5779 const char *getClobbers() const override {
Daniel Dunbar2e967de2009-08-24 09:54:37 +00005780 return "";
5781 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005782 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005783 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005784 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005785 void getGCCRegNames(const char * const *&Names,
5786 unsigned &NumNames) const override {}
5787 bool validateAsmConstraint(const char *&Name,
5788 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005789 return true;
5790 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005791 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5792 unsigned &NumAliases) const override {}
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005793 };
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005794
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005795class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005796 virtual void setDescriptionString() = 0;
5797
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005798 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005799 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005800 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005801 bool IsMicromips;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005802 bool IsNan2008;
Simon Atanasyand96e3152013-04-14 14:07:30 +00005803 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005804 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00005805 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005806 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005807 enum DspRevEnum {
5808 NoDSP, DSP1, DSP2
5809 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00005810 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005811
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005812protected:
Akira Hatanaka550ed202013-10-29 19:00:35 +00005813 bool HasFP64;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005814 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005815
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005816public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005817 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5818 const std::string &CPUStr)
5819 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005820 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005821 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5822 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5823 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005824
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005825 bool isNaN2008Default() const {
5826 return CPU == "mips32r6" || CPU == "mips64r6";
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005827 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005828
5829 bool isFP64Default() const {
5830 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5831 }
5832
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005833 bool isNan2008() const override {
5834 return IsNan2008;
5835 }
5836
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005837 StringRef getABI() const override { return ABI; }
5838 bool setCPU(const std::string &Name) override {
5839 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5840 getTriple().getArch() == llvm::Triple::mipsel;
5841 CPU = Name;
5842 return llvm::StringSwitch<bool>(Name)
5843 .Case("mips1", IsMips32)
5844 .Case("mips2", IsMips32)
5845 .Case("mips3", true)
5846 .Case("mips4", true)
5847 .Case("mips5", true)
5848 .Case("mips32", IsMips32)
5849 .Case("mips32r2", IsMips32)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005850 .Case("mips32r3", IsMips32)
5851 .Case("mips32r5", IsMips32)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005852 .Case("mips32r6", IsMips32)
5853 .Case("mips64", true)
5854 .Case("mips64r2", true)
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005855 .Case("mips64r3", true)
5856 .Case("mips64r5", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005857 .Case("mips64r6", true)
5858 .Case("octeon", true)
5859 .Default(false);
5860 }
5861 const std::string& getCPU() const { return CPU; }
Stephen Hines651f13c2014-04-23 16:59:28 -07005862 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005863 if (CPU == "octeon")
5864 Features["mips64r2"] = Features["cnmips"] = true;
5865 else
5866 Features[CPU] = true;
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005867 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005868
Stephen Hines651f13c2014-04-23 16:59:28 -07005869 void getTargetDefines(const LangOptions &Opts,
5870 MacroBuilder &Builder) const override {
5871 Builder.defineMacro("__mips__");
Simon Atanasyand4935a02012-08-29 19:14:58 +00005872 Builder.defineMacro("_mips");
Stephen Hines651f13c2014-04-23 16:59:28 -07005873 if (Opts.GNUMode)
5874 Builder.defineMacro("mips");
5875
Simon Atanasyand4935a02012-08-29 19:14:58 +00005876 Builder.defineMacro("__REGISTER_PREFIX__", "");
5877
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005878 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005879 case HardFloat:
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005880 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005881 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005882 case SoftFloat:
5883 Builder.defineMacro("__mips_soft_float", Twine(1));
5884 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00005885 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005886
Simon Atanasyand96e3152013-04-14 14:07:30 +00005887 if (IsSingleFloat)
5888 Builder.defineMacro("__mips_single_float", Twine(1));
5889
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005890 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5891 Builder.defineMacro("_MIPS_FPSET",
5892 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5893
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005894 if (IsMips16)
5895 Builder.defineMacro("__mips16", Twine(1));
5896
Simon Atanasyan321ae792013-04-14 14:07:51 +00005897 if (IsMicromips)
5898 Builder.defineMacro("__mips_micromips", Twine(1));
5899
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005900 if (IsNan2008)
5901 Builder.defineMacro("__mips_nan2008", Twine(1));
5902
Simon Atanasyana1b62272012-07-05 20:16:22 +00005903 switch (DspRev) {
5904 default:
5905 break;
5906 case DSP1:
5907 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5908 Builder.defineMacro("__mips_dsp", Twine(1));
5909 break;
5910 case DSP2:
5911 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5912 Builder.defineMacro("__mips_dspr2", Twine(1));
5913 Builder.defineMacro("__mips_dsp", Twine(1));
5914 break;
5915 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005916
Jack Carterc613b672013-08-12 17:20:29 +00005917 if (HasMSA)
5918 Builder.defineMacro("__mips_msa", Twine(1));
5919
Simon Atanasyan90913892012-04-05 19:28:31 +00005920 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5921 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5922 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00005923
5924 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5925 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005926 }
5927
Stephen Hines651f13c2014-04-23 16:59:28 -07005928 void getTargetBuiltins(const Builtin::Info *&Records,
5929 unsigned &NumRecords) const override {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005930 Records = BuiltinInfo;
5931 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005932 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005933 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka550ed202013-10-29 19:00:35 +00005934 return llvm::StringSwitch<bool>(Feature)
5935 .Case("mips", true)
5936 .Case("fp64", HasFP64)
5937 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00005938 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005939 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005940 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005941 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005942 void getGCCRegNames(const char * const *&Names,
5943 unsigned &NumNames) const override {
Daniel Sanders838f9332013-11-12 12:56:01 +00005944 static const char *const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00005945 // CPU register names
5946 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005947 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5948 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5949 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005950 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5951 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005952 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5953 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5954 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5955 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005956 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005957 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders838f9332013-11-12 12:56:01 +00005958 "$fcc5","$fcc6","$fcc7",
5959 // MSA register names
5960 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5961 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5962 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5963 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5964 // MSA control register names
5965 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5966 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005967 };
5968 Names = GCCRegNames;
5969 NumNames = llvm::array_lengthof(GCCRegNames);
5970 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005971 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5972 unsigned &NumAliases) const override = 0;
5973 bool validateAsmConstraint(const char *&Name,
5974 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005975 switch (*Name) {
5976 default:
Douglas Gregora95cba92011-11-02 20:52:01 +00005977 return false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005978 case 'r': // CPU registers.
5979 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Stephen Hines176edba2014-12-01 14:53:08 -08005980 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005981 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00005982 case 'c': // $25 for indirect jumps
5983 case 'l': // lo register
5984 case 'x': // hilo register pair
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005985 Info.setAllowsRegister();
5986 return true;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07005987 case 'I': // Signed 16-bit constant
5988 case 'J': // Integer 0
5989 case 'K': // Unsigned 16-bit constant
5990 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5991 case 'M': // Constants not loadable via lui, addiu, or ori
5992 case 'N': // Constant -1 to -65535
5993 case 'O': // A signed 15-bit constant
5994 case 'P': // A constant between 1 go 65535
5995 return true;
Jack Carter97102302013-03-05 19:10:54 +00005996 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00005997 Info.setAllowsMemory();
5998 return true;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07005999 case 'Z':
6000 if (Name[1] == 'C') { // An address usable by ll, and sc.
6001 Info.setAllowsMemory();
6002 Name++; // Skip over 'Z'.
6003 return true;
6004 }
6005 return false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006006 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006007 }
6008
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07006009 std::string convertConstraint(const char *&Constraint) const override {
6010 std::string R;
6011 switch (*Constraint) {
6012 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6013 if (Constraint[1] == 'C') {
6014 R = std::string("^") + std::string(Constraint, 2);
6015 Constraint++;
6016 return R;
6017 }
6018 break;
6019 }
6020 return TargetInfo::convertConstraint(Constraint);
6021 }
6022
Stephen Hines651f13c2014-04-23 16:59:28 -07006023 const char *getClobbers() const override {
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006024 // In GCC, $1 is not widely used in generated code (it's used only in a few
6025 // specific situations), so there is no real need for users to add it to
6026 // the clobbers list if they want to use it in their inline assembly code.
6027 //
6028 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6029 // code generation, so using it in inline assembly without adding it to the
6030 // clobbers list can cause conflicts between the inline assembly code and
6031 // the surrounding generated code.
6032 //
6033 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6034 // operands, which will conflict with the ".set at" assembler option (which
6035 // we use only for inline assembly, in order to maintain compatibility with
6036 // GCC) and will also conflict with the user's usage of $1.
6037 //
6038 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6039 // register for generated code is to automatically clobber $1 for all inline
6040 // assembly code.
6041 //
6042 // FIXME: We should automatically clobber $1 only for inline assembly code
6043 // which actually uses it. This would allow LLVM to use $1 for inline
6044 // assembly operands if the user's assembly code doesn't use it.
6045 return "~{$1}";
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006046 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00006047
Stephen Hines651f13c2014-04-23 16:59:28 -07006048 bool handleTargetFeatures(std::vector<std::string> &Features,
6049 DiagnosticsEngine &Diags) override {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00006050 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00006051 IsMicromips = false;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006052 IsNan2008 = isNaN2008Default();
Simon Atanasyand96e3152013-04-14 14:07:30 +00006053 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00006054 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00006055 DspRev = NoDSP;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006056 HasFP64 = isFP64Default();
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00006057
6058 for (std::vector<std::string>::iterator it = Features.begin(),
6059 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00006060 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00006061 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00006062 else if (*it == "+soft-float")
6063 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00006064 else if (*it == "+mips16")
6065 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00006066 else if (*it == "+micromips")
6067 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00006068 else if (*it == "+dsp")
6069 DspRev = std::max(DspRev, DSP1);
6070 else if (*it == "+dspr2")
6071 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00006072 else if (*it == "+msa")
6073 HasMSA = true;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00006074 else if (*it == "+fp64")
6075 HasFP64 = true;
6076 else if (*it == "-fp64")
6077 HasFP64 = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006078 else if (*it == "+nan2008")
6079 IsNan2008 = true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006080 else if (*it == "-nan2008")
6081 IsNan2008 = false;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00006082 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00006083
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00006084 // Remove front-end specific options.
Simon Atanasyanbbd99162012-07-05 15:32:46 +00006085 std::vector<std::string>::iterator it =
6086 std::find(Features.begin(), Features.end(), "+soft-float");
6087 if (it != Features.end())
6088 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00006089
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006090 setDescriptionString();
6091
Rafael Espindola5389b842013-08-21 21:59:03 +00006092 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00006093 }
Logan Chiena8f7a972013-02-23 04:24:36 +00006094
Stephen Hines651f13c2014-04-23 16:59:28 -07006095 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00006096 if (RegNo == 0) return 4;
6097 if (RegNo == 1) return 5;
6098 return -1;
6099 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006100
6101 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006102};
6103
Simon Atanasyanfbf70052012-06-28 18:23:16 +00006104const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6105#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6107 ALL_LANGUAGES },
6108#include "clang/Basic/BuiltinsMips.def"
6109};
6110
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006111class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006112public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006113 Mips32TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07006114 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanakaa044ad92011-11-05 01:48:34 +00006115 SizeType = UnsignedInt;
6116 PtrDiffType = SignedInt;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006117 Int64Type = SignedLongLong;
6118 IntMaxType = Int64Type;
Akira Hatanakadbee9492013-01-18 21:58:11 +00006119 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanakaa044ad92011-11-05 01:48:34 +00006120 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006121 bool setABI(const std::string &Name) override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006122 if (Name == "o32" || Name == "eabi") {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006123 ABI = Name;
6124 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006125 }
6126 return false;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006127 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006128 void getTargetDefines(const LangOptions &Opts,
6129 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006130 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Douglas Gregorb7bcfe82011-11-09 15:17:16 +00006131
Stephen Hines651f13c2014-04-23 16:59:28 -07006132 Builder.defineMacro("__mips", "32");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006133 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6134
6135 const std::string& CPUStr = getCPU();
6136 if (CPUStr == "mips32")
6137 Builder.defineMacro("__mips_isa_rev", "1");
6138 else if (CPUStr == "mips32r2")
6139 Builder.defineMacro("__mips_isa_rev", "2");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006140 else if (CPUStr == "mips32r3")
6141 Builder.defineMacro("__mips_isa_rev", "3");
6142 else if (CPUStr == "mips32r5")
6143 Builder.defineMacro("__mips_isa_rev", "5");
6144 else if (CPUStr == "mips32r6")
6145 Builder.defineMacro("__mips_isa_rev", "6");
Stephen Hines651f13c2014-04-23 16:59:28 -07006146
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006147 if (ABI == "o32") {
6148 Builder.defineMacro("__mips_o32");
6149 Builder.defineMacro("_ABIO32", "1");
6150 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6151 }
6152 else if (ABI == "eabi")
6153 Builder.defineMacro("__mips_eabi");
6154 else
David Blaikieb219cfc2011-09-23 05:06:16 +00006155 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006156 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006157 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6158 unsigned &NumAliases) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006159 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6160 { { "at" }, "$1" },
6161 { { "v0" }, "$2" },
6162 { { "v1" }, "$3" },
6163 { { "a0" }, "$4" },
6164 { { "a1" }, "$5" },
6165 { { "a2" }, "$6" },
6166 { { "a3" }, "$7" },
6167 { { "t0" }, "$8" },
6168 { { "t1" }, "$9" },
6169 { { "t2" }, "$10" },
6170 { { "t3" }, "$11" },
6171 { { "t4" }, "$12" },
6172 { { "t5" }, "$13" },
6173 { { "t6" }, "$14" },
6174 { { "t7" }, "$15" },
6175 { { "s0" }, "$16" },
6176 { { "s1" }, "$17" },
6177 { { "s2" }, "$18" },
6178 { { "s3" }, "$19" },
6179 { { "s4" }, "$20" },
6180 { { "s5" }, "$21" },
6181 { { "s6" }, "$22" },
6182 { { "s7" }, "$23" },
6183 { { "t8" }, "$24" },
6184 { { "t9" }, "$25" },
6185 { { "k0" }, "$26" },
6186 { { "k1" }, "$27" },
6187 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00006188 { { "sp","$sp" }, "$29" },
6189 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006190 { { "ra" }, "$31" }
6191 };
6192 Aliases = GCCRegAliases;
6193 NumAliases = llvm::array_lengthof(GCCRegAliases);
6194 }
6195};
6196
6197class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006198 void setDescriptionString() override {
6199 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006200 }
6201
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006202public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006203 Mips32EBTargetInfo(const llvm::Triple &Triple)
6204 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006205 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006206 void getTargetDefines(const LangOptions &Opts,
6207 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006208 DefineStd(Builder, "MIPSEB", Opts);
6209 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006210 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006211 }
6212};
6213
6214class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006215 void setDescriptionString() override {
6216 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006217 }
6218
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006219public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006220 Mips32ELTargetInfo(const llvm::Triple &Triple)
6221 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00006222 BigEndian = false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006223 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006224 void getTargetDefines(const LangOptions &Opts,
6225 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006226 DefineStd(Builder, "MIPSEL", Opts);
6227 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006228 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00006229 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006230};
6231
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006232class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006233public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006234 Mips64TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07006235 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanaka12507592011-10-22 00:07:27 +00006236 LongDoubleWidth = LongDoubleAlign = 128;
6237 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00006238 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6239 LongDoubleWidth = LongDoubleAlign = 64;
6240 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6241 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006242 setN64ABITypes();
Nick Lewycky7ec59c72011-12-16 22:34:14 +00006243 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00006244 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanaka12507592011-10-22 00:07:27 +00006245 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006246
6247 void setN64ABITypes() {
6248 LongWidth = LongAlign = 64;
6249 PointerWidth = PointerAlign = 64;
6250 SizeType = UnsignedLong;
6251 PtrDiffType = SignedLong;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006252 Int64Type = SignedLong;
6253 IntMaxType = Int64Type;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006254 }
6255
6256 void setN32ABITypes() {
6257 LongWidth = LongAlign = 32;
6258 PointerWidth = PointerAlign = 32;
6259 SizeType = UnsignedInt;
6260 PtrDiffType = SignedInt;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006261 Int64Type = SignedLongLong;
6262 IntMaxType = Int64Type;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006263 }
6264
Stephen Hines651f13c2014-04-23 16:59:28 -07006265 bool setABI(const std::string &Name) override {
Akira Hatanaka12507592011-10-22 00:07:27 +00006266 if (Name == "n32") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006267 setN32ABITypes();
Simon Atanasyane9616a42013-02-27 14:55:49 +00006268 ABI = Name;
6269 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006270 }
6271 if (Name == "n64") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006272 setN64ABITypes();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006273 ABI = Name;
Simon Atanasyane9616a42013-02-27 14:55:49 +00006274 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006275 }
6276 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006277 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006278
Stephen Hines651f13c2014-04-23 16:59:28 -07006279 void getTargetDefines(const LangOptions &Opts,
6280 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006281 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00006282
Stephen Hines651f13c2014-04-23 16:59:28 -07006283 Builder.defineMacro("__mips", "64");
Simon Atanasyan600a5132012-08-29 20:50:11 +00006284 Builder.defineMacro("__mips64");
6285 Builder.defineMacro("__mips64__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006286 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6287
6288 const std::string& CPUStr = getCPU();
6289 if (CPUStr == "mips64")
6290 Builder.defineMacro("__mips_isa_rev", "1");
6291 else if (CPUStr == "mips64r2")
6292 Builder.defineMacro("__mips_isa_rev", "2");
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006293 else if (CPUStr == "mips64r3")
6294 Builder.defineMacro("__mips_isa_rev", "3");
6295 else if (CPUStr == "mips64r5")
6296 Builder.defineMacro("__mips_isa_rev", "5");
6297 else if (CPUStr == "mips64r6")
6298 Builder.defineMacro("__mips_isa_rev", "6");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006299
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006300 if (ABI == "n32") {
6301 Builder.defineMacro("__mips_n32");
6302 Builder.defineMacro("_ABIN32", "2");
6303 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6304 }
6305 else if (ABI == "n64") {
6306 Builder.defineMacro("__mips_n64");
6307 Builder.defineMacro("_ABI64", "3");
6308 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6309 }
6310 else
6311 llvm_unreachable("Invalid ABI for Mips64.");
6312 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006313 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6314 unsigned &NumAliases) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006315 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6316 { { "at" }, "$1" },
6317 { { "v0" }, "$2" },
6318 { { "v1" }, "$3" },
6319 { { "a0" }, "$4" },
6320 { { "a1" }, "$5" },
6321 { { "a2" }, "$6" },
6322 { { "a3" }, "$7" },
6323 { { "a4" }, "$8" },
6324 { { "a5" }, "$9" },
6325 { { "a6" }, "$10" },
6326 { { "a7" }, "$11" },
6327 { { "t0" }, "$12" },
6328 { { "t1" }, "$13" },
6329 { { "t2" }, "$14" },
6330 { { "t3" }, "$15" },
6331 { { "s0" }, "$16" },
6332 { { "s1" }, "$17" },
6333 { { "s2" }, "$18" },
6334 { { "s3" }, "$19" },
6335 { { "s4" }, "$20" },
6336 { { "s5" }, "$21" },
6337 { { "s6" }, "$22" },
6338 { { "s7" }, "$23" },
6339 { { "t8" }, "$24" },
6340 { { "t9" }, "$25" },
6341 { { "k0" }, "$26" },
6342 { { "k1" }, "$27" },
6343 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00006344 { { "sp","$sp" }, "$29" },
6345 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006346 { { "ra" }, "$31" }
6347 };
6348 Aliases = GCCRegAliases;
6349 NumAliases = llvm::array_lengthof(GCCRegAliases);
6350 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006351
6352 bool hasInt128Type() const override { return true; }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006353};
6354
6355class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006356 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006357 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07006358 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006359 else
Stephen Hines651f13c2014-04-23 16:59:28 -07006360 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006361
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006362 }
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006363
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006364public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006365 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006366 : Mips64TargetInfoBase(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07006367 void getTargetDefines(const LangOptions &Opts,
6368 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006369 DefineStd(Builder, "MIPSEB", Opts);
6370 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006371 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006372 }
6373};
6374
6375class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07006376 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006377 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07006378 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00006379 else
Stephen Hines651f13c2014-04-23 16:59:28 -07006380 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006381 }
6382public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006383 Mips64ELTargetInfo(const llvm::Triple &Triple)
6384 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00006385 // Default ABI is n64.
6386 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006387 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006388 void getTargetDefines(const LangOptions &Opts,
6389 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006390 DefineStd(Builder, "MIPSEL", Opts);
6391 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00006392 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006393 }
6394};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00006395
Ivan Krasinef05abd2011-08-24 20:22:22 +00006396class PNaClTargetInfo : public TargetInfo {
6397public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006398 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00006399 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006400 this->UserLabelPrefix = "";
6401 this->LongAlign = 32;
6402 this->LongWidth = 32;
6403 this->PointerAlign = 32;
6404 this->PointerWidth = 32;
6405 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006406 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00006407 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00006408 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00006409 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00006410 this->SizeType = TargetInfo::UnsignedInt;
6411 this->PtrDiffType = TargetInfo::SignedInt;
6412 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00006413 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00006414 }
6415
Stephen Hines651f13c2014-04-23 16:59:28 -07006416 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006417 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006418 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006419 Builder.defineMacro("__le32__");
6420 Builder.defineMacro("__pnacl__");
6421 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006422 void getTargetDefines(const LangOptions &Opts,
6423 MacroBuilder &Builder) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006424 getArchDefines(Opts, Builder);
6425 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006426 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00006427 return Feature == "pnacl";
6428 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006429 void getTargetBuiltins(const Builtin::Info *&Records,
6430 unsigned &NumRecords) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006431 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006432 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00006433 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006434 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006435 void getGCCRegNames(const char * const *&Names,
6436 unsigned &NumNames) const override;
6437 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6438 unsigned &NumAliases) const override;
6439 bool validateAsmConstraint(const char *&Name,
6440 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006441 return false;
6442 }
6443
Stephen Hines651f13c2014-04-23 16:59:28 -07006444 const char *getClobbers() const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006445 return "";
6446 }
6447};
6448
6449void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6450 unsigned &NumNames) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006451 Names = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006452 NumNames = 0;
6453}
6454
6455void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6456 unsigned &NumAliases) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006457 Aliases = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006458 NumAliases = 0;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006459}
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006460
Stephen Hines176edba2014-12-01 14:53:08 -08006461class Le64TargetInfo : public TargetInfo {
6462 static const Builtin::Info BuiltinInfo[];
6463
6464public:
6465 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6466 BigEndian = false;
6467 NoAsmVariants = true;
6468 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6469 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6470 DescriptionString =
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006471 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
Stephen Hines176edba2014-12-01 14:53:08 -08006472 }
6473
6474 void getTargetDefines(const LangOptions &Opts,
6475 MacroBuilder &Builder) const override {
6476 DefineStd(Builder, "unix", Opts);
6477 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6478 Builder.defineMacro("__ELF__");
6479 }
6480 void getTargetBuiltins(const Builtin::Info *&Records,
6481 unsigned &NumRecords) const override {
6482 Records = BuiltinInfo;
6483 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6484 }
6485 BuiltinVaListKind getBuiltinVaListKind() const override {
6486 return TargetInfo::PNaClABIBuiltinVaList;
6487 }
6488 const char *getClobbers() const override { return ""; }
6489 void getGCCRegNames(const char *const *&Names,
6490 unsigned &NumNames) const override {
6491 Names = nullptr;
6492 NumNames = 0;
6493 }
6494 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6495 unsigned &NumAliases) const override {
6496 Aliases = nullptr;
6497 NumAliases = 0;
6498 }
6499 bool validateAsmConstraint(const char *&Name,
6500 TargetInfo::ConstraintInfo &Info) const override {
6501 return false;
6502 }
6503
6504 bool hasProtectedVisibility() const override { return false; }
6505};
6506} // end anonymous namespace.
6507
6508const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6509#define BUILTIN(ID, TYPE, ATTRS) \
6510 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6511#include "clang/Basic/BuiltinsLe64.def"
6512};
6513
6514namespace {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006515 static const unsigned SPIRAddrSpaceMap[] = {
6516 1, // opencl_global
6517 3, // opencl_local
6518 2, // opencl_constant
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006519 4, // opencl_generic
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006520 0, // cuda_device
6521 0, // cuda_constant
6522 0 // cuda_shared
6523 };
6524 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006525 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006526 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006527 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6528 "SPIR target must use unknown OS");
6529 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6530 "SPIR target must use unknown environment type");
6531 BigEndian = false;
6532 TLSSupported = false;
6533 LongWidth = LongAlign = 64;
6534 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00006535 UseAddrSpaceMapMangling = true;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006536 // Define available target features
6537 // These must be defined in sorted order!
6538 NoAsmVariants = true;
6539 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006540 void getTargetDefines(const LangOptions &Opts,
6541 MacroBuilder &Builder) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006542 DefineStd(Builder, "SPIR", Opts);
6543 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006544 bool hasFeature(StringRef Feature) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006545 return Feature == "spir";
6546 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006547
6548 void getTargetBuiltins(const Builtin::Info *&Records,
6549 unsigned &NumRecords) const override {}
6550 const char *getClobbers() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006551 return "";
6552 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006553 void getGCCRegNames(const char * const *&Names,
6554 unsigned &NumNames) const override {}
Stephen Hines176edba2014-12-01 14:53:08 -08006555 bool
6556 validateAsmConstraint(const char *&Name,
6557 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006558 return true;
6559 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006560 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6561 unsigned &NumAliases) const override {}
6562 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006563 return TargetInfo::VoidPtrBuiltinVaList;
6564 }
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006565
6566 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6567 return (CC == CC_SpirFunction ||
6568 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6569 }
6570
6571 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6572 return CC_SpirFunction;
6573 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006574 };
6575
6576
6577 class SPIR32TargetInfo : public SPIRTargetInfo {
6578 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006579 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006580 PointerWidth = PointerAlign = 32;
6581 SizeType = TargetInfo::UnsignedInt;
6582 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6583 DescriptionString
Stephen Hines651f13c2014-04-23 16:59:28 -07006584 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6585 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00006586 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006587 void getTargetDefines(const LangOptions &Opts,
6588 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00006589 DefineStd(Builder, "SPIR32", Opts);
6590 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006591 };
6592
6593 class SPIR64TargetInfo : public SPIRTargetInfo {
6594 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006595 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006596 PointerWidth = PointerAlign = 64;
6597 SizeType = TargetInfo::UnsignedLong;
6598 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07006599 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6600 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00006601 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006602 void getTargetDefines(const LangOptions &Opts,
6603 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00006604 DefineStd(Builder, "SPIR64", Opts);
6605 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006606 };
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006607
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006608class XCoreTargetInfo : public TargetInfo {
6609 static const Builtin::Info BuiltinInfo[];
6610public:
6611 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6612 BigEndian = false;
6613 NoAsmVariants = true;
6614 LongLongAlign = 32;
6615 SuitableAlign = 32;
6616 DoubleAlign = LongDoubleAlign = 32;
Robert Lytton18162192013-11-12 10:09:30 +00006617 SizeType = UnsignedInt;
6618 PtrDiffType = SignedInt;
6619 IntPtrType = SignedInt;
6620 WCharType = UnsignedChar;
6621 WIntType = UnsignedInt;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006622 UseZeroLengthBitfieldAlignment = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07006623 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
6624 "-f64:32-a:0:32-n32";
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006625 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006626 void getTargetDefines(const LangOptions &Opts,
6627 MacroBuilder &Builder) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006628 Builder.defineMacro("__XS1B__");
6629 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006630 void getTargetBuiltins(const Builtin::Info *&Records,
6631 unsigned &NumRecords) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006632 Records = BuiltinInfo;
6633 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6634 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006635 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006636 return TargetInfo::VoidPtrBuiltinVaList;
6637 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006638 const char *getClobbers() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006639 return "";
6640 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006641 void getGCCRegNames(const char * const *&Names,
6642 unsigned &NumNames) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006643 static const char * const GCCRegNames[] = {
6644 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6645 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6646 };
6647 Names = GCCRegNames;
6648 NumNames = llvm::array_lengthof(GCCRegNames);
6649 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006650 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6651 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006652 Aliases = nullptr;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006653 NumAliases = 0;
6654 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006655 bool validateAsmConstraint(const char *&Name,
6656 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006657 return false;
6658 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006659 int getEHDataRegisterNumber(unsigned RegNo) const override {
6660 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6661 return (RegNo < 2)? RegNo : -1;
6662 }
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006663};
6664
6665const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6666#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6667#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6668 ALL_LANGUAGES },
6669#include "clang/Basic/BuiltinsXCore.def"
6670};
6671} // end anonymous namespace.
6672
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006673namespace {
6674// x86_32 Android target
6675class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6676public:
6677 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6678 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6679 SuitableAlign = 32;
6680 LongDoubleWidth = 64;
6681 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6682 }
6683};
6684} // end anonymous namespace
6685
6686namespace {
6687// x86_64 Android target
6688class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6689public:
6690 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6691 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6692 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6693 }
6694};
6695} // end anonymous namespace
6696
Ivan Krasinef05abd2011-08-24 20:22:22 +00006697
Chris Lattner4b009652007-07-25 00:24:17 +00006698//===----------------------------------------------------------------------===//
6699// Driver code
6700//===----------------------------------------------------------------------===//
6701
Benjamin Kramer9df08232013-06-29 16:37:14 +00006702static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006703 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006704
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006705 switch (Triple.getArch()) {
6706 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006707 return nullptr;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006708
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006709 case llvm::Triple::xcore:
6710 return new XCoreTargetInfo(Triple);
6711
6712 case llvm::Triple::hexagon:
6713 return new HexagonTargetInfo(Triple);
6714
6715 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006716 if (Triple.isOSDarwin())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006717 return new DarwinAArch64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006718
6719 switch (os) {
Stephen Hines176edba2014-12-01 14:53:08 -08006720 case llvm::Triple::FreeBSD:
6721 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006722 case llvm::Triple::Linux:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006723 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
6724 case llvm::Triple::NetBSD:
6725 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006726 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006727 return new AArch64leTargetInfo(Triple);
6728 }
6729
Stephen Hines651f13c2014-04-23 16:59:28 -07006730 case llvm::Triple::aarch64_be:
6731 switch (os) {
Stephen Hines176edba2014-12-01 14:53:08 -08006732 case llvm::Triple::FreeBSD:
6733 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006734 case llvm::Triple::Linux:
6735 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6736 case llvm::Triple::NetBSD:
6737 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6738 default:
6739 return new AArch64beTargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00006740 }
6741
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006742 case llvm::Triple::arm:
Daniel Dunbar3f361b52009-09-11 01:14:50 +00006743 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07006744 if (Triple.isOSBinFormatMachO())
6745 return new DarwinARMTargetInfo(Triple);
6746
6747 switch (os) {
6748 case llvm::Triple::Linux:
6749 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
6750 case llvm::Triple::FreeBSD:
6751 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
6752 case llvm::Triple::NetBSD:
6753 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
6754 case llvm::Triple::OpenBSD:
6755 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
6756 case llvm::Triple::Bitrig:
6757 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
6758 case llvm::Triple::RTEMS:
6759 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
6760 case llvm::Triple::NaCl:
6761 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006762 case llvm::Triple::Win32:
6763 switch (Triple.getEnvironment()) {
6764 default:
6765 return new ARMleTargetInfo(Triple);
6766 case llvm::Triple::Itanium:
6767 return new ItaniumWindowsARMleTargetInfo(Triple);
6768 case llvm::Triple::MSVC:
6769 return new MicrosoftARMleTargetInfo(Triple);
6770 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006771 default:
6772 return new ARMleTargetInfo(Triple);
6773 }
6774
6775 case llvm::Triple::armeb:
6776 case llvm::Triple::thumbeb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006777 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006778 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006779
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006780 switch (os) {
Rafael Espindolad16a2202010-06-10 00:46:51 +00006781 case llvm::Triple::Linux:
Stephen Hines651f13c2014-04-23 16:59:28 -07006782 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006783 case llvm::Triple::FreeBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006784 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006785 case llvm::Triple::NetBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006786 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006787 case llvm::Triple::OpenBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006788 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006789 case llvm::Triple::Bitrig:
Stephen Hines651f13c2014-04-23 16:59:28 -07006790 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006791 case llvm::Triple::RTEMS:
Stephen Hines651f13c2014-04-23 16:59:28 -07006792 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006793 case llvm::Triple::NaCl:
Stephen Hines651f13c2014-04-23 16:59:28 -07006794 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006795 default:
Stephen Hines651f13c2014-04-23 16:59:28 -07006796 return new ARMbeTargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006797 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006798
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006799 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006800 return new MSP430TargetInfo(Triple);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006801
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006802 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006803 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006804 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006805 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006806 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006807 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006808 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006809 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006810 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006811 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006812 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006813 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006814 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006815
6816 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006817 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006818 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006819 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006820 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006821 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006822 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006823 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006824 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006825 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicbbac9aa2013-09-21 01:27:01 +00006826 case llvm::Triple::NaCl:
6827 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006828 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006829 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006830 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00006831
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006832 case llvm::Triple::mips64:
6833 switch (os) {
6834 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006835 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006836 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006837 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006838 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006839 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006840 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006841 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006842 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006843 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006844 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006845 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006846 }
6847
6848 case llvm::Triple::mips64el:
6849 switch (os) {
6850 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006851 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006852 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006853 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006854 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006855 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006856 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006857 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006858 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006859 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006860 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006861 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006862 }
6863
Ivan Krasinef05abd2011-08-24 20:22:22 +00006864 case llvm::Triple::le32:
6865 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00006866 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006867 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00006868 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006869 return nullptr;
Chris Lattnere03ae302010-02-16 18:14:57 +00006870 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006871
Stephen Hines176edba2014-12-01 14:53:08 -08006872 case llvm::Triple::le64:
6873 return new Le64TargetInfo(Triple);
6874
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006875 case llvm::Triple::ppc:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006876 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006877 return new DarwinPPC32TargetInfo(Triple);
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00006878 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006879 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006880 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006881 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006882 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006883 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006884 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006885 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006886 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006887 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006888 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006889 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006890 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006891 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006892
6893 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006894 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006895 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006896 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006897 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006898 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006899 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006900 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006901 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006902 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006903 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006904 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006905 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006906 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006907 }
Daniel Dunbard58c03f2009-11-15 06:48:46 +00006908
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006909 case llvm::Triple::ppc64le:
6910 switch (os) {
6911 case llvm::Triple::Linux:
6912 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07006913 case llvm::Triple::NetBSD:
6914 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006915 default:
6916 return new PPC64TargetInfo(Triple);
Reid Spencer5f016e22007-07-11 17:01:13 +00006917 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006918
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006919 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006920 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006921 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006922 return new NVPTX64TargetInfo(Triple);
Chris Lattner2c026472010-03-06 21:21:27 +00006923
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006924 case llvm::Triple::amdgcn:
Eli Friedman6505a292012-10-12 23:32:00 +00006925 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006926 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00006927
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006928 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006929 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006930 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006931 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006932 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006933 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006934 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006935 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006936 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006937 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006938 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006939 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006940 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006941 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006942 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006943
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006944 case llvm::Triple::sparcv9:
6945 switch (os) {
6946 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006947 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006948 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006949 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006950 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006951 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006952 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006953 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006954 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006955 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006956 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006957 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006958 }
6959
Ulrich Weigandb8409212013-05-06 16:26:41 +00006960 case llvm::Triple::systemz:
6961 switch (os) {
6962 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006963 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006964 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006965 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006966 }
6967
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006968 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006969 return new TCETargetInfo(Triple);
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006970
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006971 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006972 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006973 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006974
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006975 switch (os) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07006976 case llvm::Triple::Linux: {
6977 switch (Triple.getEnvironment()) {
6978 default:
6979 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6980 case llvm::Triple::Android:
6981 return new AndroidX86_32TargetInfo(Triple);
6982 }
6983 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006984 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006985 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006986 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006987 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006988 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006989 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006990 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006991 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006992 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006993 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006994 case llvm::Triple::KFreeBSD:
6995 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner6f4bed52010-07-07 16:01:42 +00006996 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006997 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006998 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006999 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07007000 case llvm::Triple::Win32: {
7001 switch (Triple.getEnvironment()) {
7002 default:
7003 return new X86_32TargetInfo(Triple);
7004 case llvm::Triple::Cygnus:
7005 return new CygwinX86_32TargetInfo(Triple);
7006 case llvm::Triple::GNU:
7007 return new MinGWX86_32TargetInfo(Triple);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007008 case llvm::Triple::Itanium:
Stephen Hines651f13c2014-04-23 16:59:28 -07007009 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007010 return new MicrosoftX86_32TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07007011 }
7012 }
Chris Lattnerf853e732010-04-11 19:29:39 +00007013 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007014 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00007015 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007016 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00007017 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007018 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007019 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007020 return new X86_32TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007021 }
7022
7023 case llvm::Triple::x86_64:
Stephen Hines651f13c2014-04-23 16:59:28 -07007024 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramer9df08232013-06-29 16:37:14 +00007025 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00007026
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007027 switch (os) {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07007028 case llvm::Triple::CloudABI:
7029 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
7030 case llvm::Triple::Linux: {
7031 switch (Triple.getEnvironment()) {
7032 default:
7033 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7034 case llvm::Triple::Android:
7035 return new AndroidX86_64TargetInfo(Triple);
7036 }
7037 }
Chris Lattner1eac0812010-01-09 05:41:14 +00007038 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007039 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007040 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007041 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007042 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007043 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00007044 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007045 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007046 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007047 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00007048 case llvm::Triple::KFreeBSD:
7049 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007050 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007051 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07007052 case llvm::Triple::Win32: {
7053 switch (Triple.getEnvironment()) {
7054 default:
7055 return new X86_64TargetInfo(Triple);
7056 case llvm::Triple::GNU:
7057 return new MinGWX86_64TargetInfo(Triple);
7058 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007059 return new MicrosoftX86_64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07007060 }
7061 }
Eli Bendersky441d9f72012-12-04 18:38:10 +00007062 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007063 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Stephen Hines0e2c34f2015-03-23 12:09:02 -07007064 case llvm::Triple::PS4:
7065 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007066 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00007067 return new X86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007068 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00007069
7070 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00007071 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00007072 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007073 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00007074 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00007075 }
7076 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00007077 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00007078 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007079 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00007080 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00007081 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00007082 }
Chris Lattner4b009652007-07-25 00:24:17 +00007083}
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007084
7085/// CreateTargetInfo - Return the target info object for the specified target
7086/// triple.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007087TargetInfo *
7088TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7089 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregor49a87542012-11-16 04:24:59 +00007090 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007091
7092 // Construct the target
Stephen Hines651f13c2014-04-23 16:59:28 -07007093 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007094 if (!Target) {
7095 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007096 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007097 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07007098 Target->TargetOpts = Opts;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007099
Daniel Dunbar33b40752009-12-18 18:42:37 +00007100 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00007101 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7102 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007103 return nullptr;
Daniel Dunbar33b40752009-12-18 18:42:37 +00007104 }
7105
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007106 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00007107 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7108 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007109 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007110 }
7111
Rafael Espindola5389b842013-08-21 21:59:03 +00007112 // Set the fp math unit.
7113 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7114 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007115 return nullptr;
Rafael Espindola5389b842013-08-21 21:59:03 +00007116 }
7117
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007118 // Compute the default target features, we need the target to handle this
7119 // because features may have dependencies on one another.
7120 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00007121 Target->getDefaultFeatures(Features);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007122
7123 // Apply the user specified deltas.
Rafael Espindolac84ed542013-08-20 18:57:55 +00007124 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7125 I < N; ++I) {
7126 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007127 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00007128 bool Enabled = Name[0] == '+';
7129 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007130 }
7131
7132 // Add the features to the compile options.
7133 //
7134 // FIXME: If we are completely confident that we have the right set, we only
7135 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00007136 Opts->Features.clear();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007137 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7138 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00007139 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3d11ced2013-10-16 21:26:26 +00007140 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007141 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007142
Stephen Hines651f13c2014-04-23 16:59:28 -07007143 return Target.release();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00007144}