blob: 1dfddb559d289424148b6e532014019c511f6e5d [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Craig Topper3164f332014-03-11 03:39:26 +0000191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Craig Topper3164f332014-03-11 03:39:26 +0000203 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000207 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000211
Craig Topper3164f332014-03-11 03:39:26 +0000212 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000216
John McCalleed64c72012-01-29 01:20:30 +0000217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000220 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000221 return false;
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223};
224
Chris Lattner30ba6742009-08-10 19:03:04 +0000225
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
Craig Topper3164f332014-03-11 03:39:26 +0000230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 }
240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000244
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
Craig Topper3164f332014-03-11 03:39:26 +0000259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 // FreeBSD defines; list based off of gcc output
262
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
276 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277 }
278public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000279 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
280 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000281
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000282 switch (Triple.getArch()) {
283 default:
284 case llvm::Triple::x86:
285 case llvm::Triple::x86_64:
286 this->MCountName = ".mcount";
287 break;
288 case llvm::Triple::mips:
289 case llvm::Triple::mipsel:
290 case llvm::Triple::ppc:
291 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000292 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000293 this->MCountName = "_mcount";
294 break;
295 case llvm::Triple::arm:
296 this->MCountName = "__mcount";
297 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000298 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300};
301
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000302// GNU/kFreeBSD Target
303template<typename Target>
304class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
305protected:
Craig Topper3164f332014-03-11 03:39:26 +0000306 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
307 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308 // GNU/kFreeBSD defines; list based off of gcc output
309
310 DefineStd(Builder, "unix", Opts);
311 Builder.defineMacro("__FreeBSD_kernel__");
312 Builder.defineMacro("__GLIBC__");
313 Builder.defineMacro("__ELF__");
314 if (Opts.POSIXThreads)
315 Builder.defineMacro("_REENTRANT");
316 if (Opts.CPlusPlus)
317 Builder.defineMacro("_GNU_SOURCE");
318 }
319public:
Eric Christopher917e9522014-11-18 22:36:15 +0000320 KFreeBSDTargetInfo(const llvm::Triple &Triple)
321 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000322 this->UserLabelPrefix = "";
323 }
324};
325
Chris Lattner3e2ee142010-07-07 16:01:42 +0000326// Minix Target
327template<typename Target>
328class MinixTargetInfo : public OSTargetInfo<Target> {
329protected:
Craig Topper3164f332014-03-11 03:39:26 +0000330 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
331 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000332 // Minix defines
333
334 Builder.defineMacro("__minix", "3");
335 Builder.defineMacro("_EM_WSIZE", "4");
336 Builder.defineMacro("_EM_PSIZE", "4");
337 Builder.defineMacro("_EM_SSIZE", "2");
338 Builder.defineMacro("_EM_LSIZE", "4");
339 Builder.defineMacro("_EM_FSIZE", "4");
340 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000341 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000342 DefineStd(Builder, "unix", Opts);
343 }
344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000345 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
346 this->UserLabelPrefix = "";
347 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000348};
349
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350// Linux target
351template<typename Target>
352class LinuxTargetInfo : public OSTargetInfo<Target> {
353protected:
Craig Topper3164f332014-03-11 03:39:26 +0000354 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
355 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000357 DefineStd(Builder, "unix", Opts);
358 DefineStd(Builder, "linux", Opts);
359 Builder.defineMacro("__gnu_linux__");
360 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000361 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000362 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000363 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000364 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000365 if (Opts.CPlusPlus)
366 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000367 }
368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000369 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000370 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000371 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000372
373 switch (Triple.getArch()) {
374 default:
375 break;
376 case llvm::Triple::ppc:
377 case llvm::Triple::ppc64:
378 case llvm::Triple::ppc64le:
379 this->MCountName = "_mcount";
380 break;
381 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000382 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000383
Craig Topper3164f332014-03-11 03:39:26 +0000384 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000385 return ".text.startup";
386 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000387};
388
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000389// NetBSD Target
390template<typename Target>
391class NetBSDTargetInfo : public OSTargetInfo<Target> {
392protected:
Craig Topper3164f332014-03-11 03:39:26 +0000393 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
394 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000395 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("__NetBSD__");
397 Builder.defineMacro("__unix__");
398 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000399 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000400 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000401
402 switch (Triple.getArch()) {
403 default:
404 break;
405 case llvm::Triple::arm:
406 case llvm::Triple::armeb:
407 case llvm::Triple::thumb:
408 case llvm::Triple::thumbeb:
409 Builder.defineMacro("__ARM_DWARF_EH__");
410 break;
411 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000412 }
413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000414 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
415 this->UserLabelPrefix = "";
416 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000417};
418
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419// OpenBSD Target
420template<typename Target>
421class OpenBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425 // OpenBSD defines; list based off of gcc output
426
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("__OpenBSD__");
428 DefineStd(Builder, "unix", Opts);
429 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000430 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000431 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000432 }
433public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000434 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
435 this->UserLabelPrefix = "";
436 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000437
Eli Friedman3715d1f2011-12-15 02:15:56 +0000438 switch (Triple.getArch()) {
439 default:
440 case llvm::Triple::x86:
441 case llvm::Triple::x86_64:
442 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000443 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000444 this->MCountName = "__mcount";
445 break;
446 case llvm::Triple::mips64:
447 case llvm::Triple::mips64el:
448 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000449 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000450 this->MCountName = "_mcount";
451 break;
452 }
453 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000454};
455
Eli Friedman9fa28852012-08-08 23:57:20 +0000456// Bitrig Target
457template<typename Target>
458class BitrigTargetInfo : public OSTargetInfo<Target> {
459protected:
Craig Topper3164f332014-03-11 03:39:26 +0000460 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
461 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000462 // Bitrig defines; list based off of gcc output
463
464 Builder.defineMacro("__Bitrig__");
465 DefineStd(Builder, "unix", Opts);
466 Builder.defineMacro("__ELF__");
467 if (Opts.POSIXThreads)
468 Builder.defineMacro("_REENTRANT");
469 }
470public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000471 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
472 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000473 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000474 }
475};
476
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000477// PSP Target
478template<typename Target>
479class PSPTargetInfo : public OSTargetInfo<Target> {
480protected:
Craig Topper3164f332014-03-11 03:39:26 +0000481 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
482 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000483 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000484 Builder.defineMacro("PSP");
485 Builder.defineMacro("_PSP");
486 Builder.defineMacro("__psp__");
487 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000488 }
489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000490 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000491 this->UserLabelPrefix = "";
492 }
493};
494
John Thompsone467e192009-11-19 17:18:50 +0000495// PS3 PPU Target
496template<typename Target>
497class PS3PPUTargetInfo : public OSTargetInfo<Target> {
498protected:
Craig Topper3164f332014-03-11 03:39:26 +0000499 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
500 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000501 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000502 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000503 Builder.defineMacro("__PPU__");
504 Builder.defineMacro("__CELLOS_LV2__");
505 Builder.defineMacro("__ELF__");
506 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000507 Builder.defineMacro("_ARCH_PPC64");
508 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000509 }
510public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000511 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000512 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000513 this->LongWidth = this->LongAlign = 32;
514 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000515 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000516 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000517 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000518 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000519 }
520};
521
Torok Edwinb2b37c62009-06-30 17:10:35 +0000522// Solaris target
523template<typename Target>
524class SolarisTargetInfo : public OSTargetInfo<Target> {
525protected:
Craig Topper3164f332014-03-11 03:39:26 +0000526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
527 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 DefineStd(Builder, "sun", Opts);
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
531 Builder.defineMacro("__svr4__");
532 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000533 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
534 // newer, but to 500 for everything else. feature_test.h has a check to
535 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000536 // with a new version.
537 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000538 Builder.defineMacro("_XOPEN_SOURCE", "600");
539 else
540 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000541 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000542 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000543 Builder.defineMacro("_LARGEFILE_SOURCE");
544 Builder.defineMacro("_LARGEFILE64_SOURCE");
545 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000546 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000547 }
548public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000549 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000551 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000552 // FIXME: WIntType should be SignedLong
553 }
554};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000555
556// Windows target
557template<typename Target>
558class WindowsTargetInfo : public OSTargetInfo<Target> {
559protected:
Craig Topper3164f332014-03-11 03:39:26 +0000560 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
561 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000562 Builder.defineMacro("_WIN32");
563 }
564 void getVisualStudioDefines(const LangOptions &Opts,
565 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000566 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000567 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000568 Builder.defineMacro("_CPPRTTI");
569
570 if (Opts.Exceptions)
571 Builder.defineMacro("_CPPUNWIND");
572 }
573
574 if (!Opts.CharIsSigned)
575 Builder.defineMacro("_CHAR_UNSIGNED");
576
577 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
578 // but it works for now.
579 if (Opts.POSIXThreads)
580 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000581
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000582 if (Opts.MSCompatibilityVersion) {
583 Builder.defineMacro("_MSC_VER",
584 Twine(Opts.MSCompatibilityVersion / 100000));
585 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000586 // FIXME We cannot encode the revision information into 32-bits
587 Builder.defineMacro("_MSC_BUILD", Twine(1));
588 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000589
590 if (Opts.MicrosoftExt) {
591 Builder.defineMacro("_MSC_EXTENSIONS");
592
593 if (Opts.CPlusPlus11) {
594 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
595 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
596 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
597 }
598 }
599
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000600 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601 }
602
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000603public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000604 WindowsTargetInfo(const llvm::Triple &Triple)
605 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000606};
607
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000608template <typename Target>
609class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000610protected:
Craig Topper3164f332014-03-11 03:39:26 +0000611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
612 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000613 if (Opts.POSIXThreads)
614 Builder.defineMacro("_REENTRANT");
615 if (Opts.CPlusPlus)
616 Builder.defineMacro("_GNU_SOURCE");
617
618 DefineStd(Builder, "unix", Opts);
619 Builder.defineMacro("__ELF__");
620 Builder.defineMacro("__native_client__");
621 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000622
623public:
624 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000625 this->UserLabelPrefix = "";
626 this->LongAlign = 32;
627 this->LongWidth = 32;
628 this->PointerAlign = 32;
629 this->PointerWidth = 32;
630 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000631 this->Int64Type = TargetInfo::SignedLongLong;
632 this->DoubleAlign = 64;
633 this->LongDoubleWidth = 64;
634 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000635 this->LongLongWidth = 64;
636 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000637 this->SizeType = TargetInfo::UnsignedInt;
638 this->PtrDiffType = TargetInfo::SignedInt;
639 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000640 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000641 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000642 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000643 this->DescriptionString =
644 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000645 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000646 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000647 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000648 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000649 } else if (Triple.getArch() == llvm::Triple::mipsel) {
650 // Handled on mips' setDescriptionString.
651 } else {
652 assert(Triple.getArch() == llvm::Triple::le32);
653 this->DescriptionString = "e-p:32:32-i64:64";
654 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000655 }
Craig Topper3164f332014-03-11 03:39:26 +0000656 typename Target::CallingConvCheckResult checkCallingConvention(
657 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000658 return CC == CC_PnaclCall ? Target::CCCR_OK :
659 Target::checkCallingConvention(CC);
660 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000661};
Mike Stump11289f42009-09-09 15:08:12 +0000662} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000663
Chris Lattner09d98f52008-10-05 21:50:58 +0000664//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665// Specific target implementations.
666//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000667
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000668namespace {
669// PPC abstract base class
670class PPCTargetInfo : public TargetInfo {
671 static const Builtin::Info BuiltinInfo[];
672 static const char * const GCCRegNames[];
673 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000674 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000675
676 // Target cpu features.
677 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000678 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000679
Ulrich Weigand8afad612014-07-28 13:17:52 +0000680protected:
681 std::string ABI;
682
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000683public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000684 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000685 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000686 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000687 LongDoubleWidth = LongDoubleAlign = 128;
688 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
689 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000690
Hal Finkel6b984f02012-07-03 16:51:04 +0000691 /// \brief Flags for architecture specific defines.
692 typedef enum {
693 ArchDefineNone = 0,
694 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
695 ArchDefinePpcgr = 1 << 1,
696 ArchDefinePpcsq = 1 << 2,
697 ArchDefine440 = 1 << 3,
698 ArchDefine603 = 1 << 4,
699 ArchDefine604 = 1 << 5,
700 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000701 ArchDefinePwr5 = 1 << 7,
702 ArchDefinePwr5x = 1 << 8,
703 ArchDefinePwr6 = 1 << 9,
704 ArchDefinePwr6x = 1 << 10,
705 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000706 ArchDefinePwr8 = 1 << 12,
707 ArchDefineA2 = 1 << 13,
708 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000709 } ArchDefineTypes;
710
Bill Schmidt38378a02013-02-01 20:23:10 +0000711 // Note: GCC recognizes the following additional cpus:
712 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
713 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
714 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000715 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000716 bool CPUKnown = llvm::StringSwitch<bool>(Name)
717 .Case("generic", true)
718 .Case("440", true)
719 .Case("450", true)
720 .Case("601", true)
721 .Case("602", true)
722 .Case("603", true)
723 .Case("603e", true)
724 .Case("603ev", true)
725 .Case("604", true)
726 .Case("604e", true)
727 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000728 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000729 .Case("g3", true)
730 .Case("7400", true)
731 .Case("g4", true)
732 .Case("7450", true)
733 .Case("g4+", true)
734 .Case("750", true)
735 .Case("970", true)
736 .Case("g5", true)
737 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000738 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000739 .Case("e500mc", true)
740 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000741 .Case("power3", true)
742 .Case("pwr3", true)
743 .Case("power4", true)
744 .Case("pwr4", true)
745 .Case("power5", true)
746 .Case("pwr5", true)
747 .Case("power5x", true)
748 .Case("pwr5x", true)
749 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000750 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000751 .Case("power6x", true)
752 .Case("pwr6x", true)
753 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000754 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000755 .Case("power8", true)
756 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000757 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000758 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000759 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000760 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000761 .Case("powerpc64le", true)
762 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000763 .Default(false);
764
765 if (CPUKnown)
766 CPU = Name;
767
768 return CPUKnown;
769 }
770
Ulrich Weigand8afad612014-07-28 13:17:52 +0000771
772 StringRef getABI() const override { return ABI; }
773
Craig Topper3164f332014-03-11 03:39:26 +0000774 void getTargetBuiltins(const Builtin::Info *&Records,
775 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000776 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000777 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000778 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000779
Craig Topper3164f332014-03-11 03:39:26 +0000780 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000781
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getTargetDefines(const LangOptions &Opts,
783 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000784
Craig Topper3164f332014-03-11 03:39:26 +0000785 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000786
Craig Topper3164f332014-03-11 03:39:26 +0000787 bool handleTargetFeatures(std::vector<std::string> &Features,
788 DiagnosticsEngine &Diags) override;
789 bool hasFeature(StringRef Feature) const override;
790
791 void getGCCRegNames(const char * const *&Names,
792 unsigned &NumNames) const override;
793 void getGCCRegAliases(const GCCRegAlias *&Aliases,
794 unsigned &NumAliases) const override;
795 bool validateAsmConstraint(const char *&Name,
796 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000797 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000798 default: return false;
799 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000800 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000801 case 'b': // Base register
802 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000803 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000804 break;
805 // FIXME: The following are added to allow parsing.
806 // I just took a guess at what the actions should be.
807 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'v': // Altivec vector register
810 Info.setAllowsRegister();
811 break;
812 case 'w':
813 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000814 case 'd':// VSX vector register to hold vector double data
815 case 'f':// VSX vector register to hold vector float data
816 case 's':// VSX vector register to hold scalar float data
817 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000818 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000819 break;
820 default:
821 return false;
822 }
823 Info.setAllowsRegister();
824 Name++; // Skip over 'w'.
825 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000826 case 'h': // `MQ', `CTR', or `LINK' register
827 case 'q': // `MQ' register
828 case 'c': // `CTR' register
829 case 'l': // `LINK' register
830 case 'x': // `CR' register (condition register) number 0
831 case 'y': // `CR' register (condition register)
832 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000833 Info.setAllowsRegister();
834 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000835 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000836 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000837 // (use `L' instead for SImode constants)
838 case 'K': // Unsigned 16-bit constant
839 case 'L': // Signed 16-bit constant shifted left 16 bits
840 case 'M': // Constant larger than 31
841 case 'N': // Exact power of 2
842 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000843 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000844 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000845 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000846 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000847 break;
848 case 'm': // Memory operand. Note that on PowerPC targets, m can
849 // include addresses that update the base register. It
850 // is therefore only safe to use `m' in an asm statement
851 // if that asm statement accesses the operand exactly once.
852 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000853 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000855 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000856 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000857 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
858 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // register to be updated.
860 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000861 if (Name[1] != 's')
862 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000863 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000864 // include any automodification of the base register. Unlike
865 // `m', this constraint can be used in asm statements that
866 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000867 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000868 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000869 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000870 break;
871 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000873 case 'Z': // Memory operand that is an indexed or indirect from a
874 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000875 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000876 Info.setAllowsMemory();
877 Info.setAllowsRegister();
878 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000879 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000880 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000881 // register (`p' is preferable for asm statements)
882 case 'S': // Constant suitable as a 64-bit mask operand
883 case 'T': // Constant suitable as a 32-bit mask operand
884 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000885 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000886 // instructions
887 case 'W': // Vector constant that does not require memory
888 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000889 break;
890 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000891 }
John Thompson07a61a42010-06-24 22:44:13 +0000892 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000893 }
Craig Topper3164f332014-03-11 03:39:26 +0000894 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000895 std::string R;
896 switch (*Constraint) {
897 case 'e':
898 case 'w':
899 // Two-character constraint; add "^" hint for later parsing.
900 R = std::string("^") + std::string(Constraint, 2);
901 Constraint++;
902 break;
903 default:
904 return TargetInfo::convertConstraint(Constraint);
905 }
906 return R;
907 }
Craig Topper3164f332014-03-11 03:39:26 +0000908 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000909 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000910 }
Craig Topper3164f332014-03-11 03:39:26 +0000911 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000912 if (RegNo == 0) return 3;
913 if (RegNo == 1) return 4;
914 return -1;
915 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000916};
Anders Carlssonf511f642007-11-27 04:11:28 +0000917
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000918const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000919#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000920#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000921 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000922#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000923};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000924
Eric Christopher917e9522014-11-18 22:36:15 +0000925/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000926/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000927bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000928 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000929 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
930 // Ignore disabled features.
931 if (Features[i][0] == '-')
932 continue;
933
934 StringRef Feature = StringRef(Features[i]).substr(1);
935
936 if (Feature == "vsx") {
937 HasVSX = true;
938 continue;
939 }
940
Bill Schmidt59eb7672014-10-10 15:09:43 +0000941 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000942 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000943 continue;
944 }
945
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000946 // TODO: Finish this list and add an assert that we've handled them
947 // all.
948 }
949
950 return true;
951}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952
Chris Lattnerecd49032009-03-02 22:27:17 +0000953/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
954/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000955void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000956 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000957 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000958 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000959 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000960 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000961 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000962 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000963 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000964 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000965 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000966 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000967 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000968 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000969
Chris Lattnerecd49032009-03-02 22:27:17 +0000970 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000971 if (getTriple().getArch() == llvm::Triple::ppc64le) {
972 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000973 } else {
974 if (getTriple().getOS() != llvm::Triple::NetBSD &&
975 getTriple().getOS() != llvm::Triple::OpenBSD)
976 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Ulrich Weigand8afad612014-07-28 13:17:52 +0000979 // ABI options.
980 if (ABI == "elfv1")
981 Builder.defineMacro("_CALL_ELF", "1");
982 if (ABI == "elfv2")
983 Builder.defineMacro("_CALL_ELF", "2");
984
Chris Lattnerecd49032009-03-02 22:27:17 +0000985 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000986 Builder.defineMacro("__NATURAL_ALIGNMENT__");
987 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000988
Chris Lattnerecd49032009-03-02 22:27:17 +0000989 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000990 if (LongDoubleWidth == 128)
991 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000992
John Thompsone467e192009-11-19 17:18:50 +0000993 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000994 Builder.defineMacro("__VEC__", "10206");
995 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000996 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000997
998 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000999 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1000 .Case("440", ArchDefineName)
1001 .Case("450", ArchDefineName | ArchDefine440)
1002 .Case("601", ArchDefineName)
1003 .Case("602", ArchDefineName | ArchDefinePpcgr)
1004 .Case("603", ArchDefineName | ArchDefinePpcgr)
1005 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1006 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1007 .Case("604", ArchDefineName | ArchDefinePpcgr)
1008 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1009 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001010 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001011 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1012 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1013 .Case("750", ArchDefineName | ArchDefinePpcgr)
1014 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1015 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001016 .Case("a2", ArchDefineA2)
1017 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001018 .Case("pwr3", ArchDefinePpcgr)
1019 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1020 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1021 | ArchDefinePpcsq)
1022 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1023 | ArchDefinePpcgr | ArchDefinePpcsq)
1024 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1025 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1027 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1028 | ArchDefinePpcsq)
1029 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1030 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001031 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1033 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1034 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001035 .Case("power3", ArchDefinePpcgr)
1036 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1037 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1038 | ArchDefinePpcsq)
1039 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1040 | ArchDefinePpcgr | ArchDefinePpcsq)
1041 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1042 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1044 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1045 | ArchDefinePpcsq)
1046 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1047 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001048 | ArchDefinePpcgr | ArchDefinePpcsq)
1049 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1050 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1051 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001052 .Default(ArchDefineNone);
1053
1054 if (defs & ArchDefineName)
1055 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1056 if (defs & ArchDefinePpcgr)
1057 Builder.defineMacro("_ARCH_PPCGR");
1058 if (defs & ArchDefinePpcsq)
1059 Builder.defineMacro("_ARCH_PPCSQ");
1060 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001061 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001062 if (defs & ArchDefine603)
1063 Builder.defineMacro("_ARCH_603");
1064 if (defs & ArchDefine604)
1065 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001066 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001067 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001069 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001070 if (defs & ArchDefinePwr5x)
1071 Builder.defineMacro("_ARCH_PWR5X");
1072 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001073 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001074 if (defs & ArchDefinePwr6x)
1075 Builder.defineMacro("_ARCH_PWR6X");
1076 if (defs & ArchDefinePwr7)
1077 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001078 if (defs & ArchDefinePwr8)
1079 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001080 if (defs & ArchDefineA2)
1081 Builder.defineMacro("_ARCH_A2");
1082 if (defs & ArchDefineA2q) {
1083 Builder.defineMacro("_ARCH_A2Q");
1084 Builder.defineMacro("_ARCH_QP");
1085 }
1086
1087 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1088 Builder.defineMacro("__bg__");
1089 Builder.defineMacro("__THW_BLUEGENE__");
1090 Builder.defineMacro("__bgq__");
1091 Builder.defineMacro("__TOS_BGQ__");
1092 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001093
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001094 if (HasVSX)
1095 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001096 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001097 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001098
Bill Schmidt38378a02013-02-01 20:23:10 +00001099 // FIXME: The following are not yet generated here by Clang, but are
1100 // generated by GCC:
1101 //
1102 // _SOFT_FLOAT_
1103 // __RECIP_PRECISION__
1104 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001105 // __RECIP__
1106 // __RECIPF__
1107 // __RSQRTE__
1108 // __RSQRTEF__
1109 // _SOFT_DOUBLE_
1110 // __NO_LWSYNC__
1111 // __HAVE_BSWAP__
1112 // __LONGDOUBLE128
1113 // __CMODEL_MEDIUM__
1114 // __CMODEL_LARGE__
1115 // _CALL_SYSV
1116 // _CALL_DARWIN
1117 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001118}
1119
1120void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1121 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1122 .Case("7400", true)
1123 .Case("g4", true)
1124 .Case("7450", true)
1125 .Case("g4+", true)
1126 .Case("970", true)
1127 .Case("g5", true)
1128 .Case("pwr6", true)
1129 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001130 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001131 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001132 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001133 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001134
1135 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001136
1137 if (!ABI.empty())
1138 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001139}
1140
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001141bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001142 return llvm::StringSwitch<bool>(Feature)
1143 .Case("powerpc", true)
1144 .Case("vsx", HasVSX)
1145 .Case("power8-vector", HasP8Vector)
1146 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001147}
Chris Lattner17df24e2008-04-21 18:56:49 +00001148
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001149const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001150 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1151 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1152 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1153 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1154 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1155 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1156 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1157 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001159 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001161 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1162 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1163 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1164 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001165 "vrsave", "vscr",
1166 "spe_acc", "spefscr",
1167 "sfp"
1168};
Chris Lattner10a5b382007-01-29 05:24:35 +00001169
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001170void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171 unsigned &NumNames) const {
1172 Names = GCCRegNames;
1173 NumNames = llvm::array_lengthof(GCCRegNames);
1174}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001175
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001176const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1177 // While some of these aliases do map to different registers
1178 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001179 { { "0" }, "r0" },
1180 { { "1"}, "r1" },
1181 { { "2" }, "r2" },
1182 { { "3" }, "r3" },
1183 { { "4" }, "r4" },
1184 { { "5" }, "r5" },
1185 { { "6" }, "r6" },
1186 { { "7" }, "r7" },
1187 { { "8" }, "r8" },
1188 { { "9" }, "r9" },
1189 { { "10" }, "r10" },
1190 { { "11" }, "r11" },
1191 { { "12" }, "r12" },
1192 { { "13" }, "r13" },
1193 { { "14" }, "r14" },
1194 { { "15" }, "r15" },
1195 { { "16" }, "r16" },
1196 { { "17" }, "r17" },
1197 { { "18" }, "r18" },
1198 { { "19" }, "r19" },
1199 { { "20" }, "r20" },
1200 { { "21" }, "r21" },
1201 { { "22" }, "r22" },
1202 { { "23" }, "r23" },
1203 { { "24" }, "r24" },
1204 { { "25" }, "r25" },
1205 { { "26" }, "r26" },
1206 { { "27" }, "r27" },
1207 { { "28" }, "r28" },
1208 { { "29" }, "r29" },
1209 { { "30" }, "r30" },
1210 { { "31" }, "r31" },
1211 { { "fr0" }, "f0" },
1212 { { "fr1" }, "f1" },
1213 { { "fr2" }, "f2" },
1214 { { "fr3" }, "f3" },
1215 { { "fr4" }, "f4" },
1216 { { "fr5" }, "f5" },
1217 { { "fr6" }, "f6" },
1218 { { "fr7" }, "f7" },
1219 { { "fr8" }, "f8" },
1220 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001221 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001222 { { "fr11" }, "f11" },
1223 { { "fr12" }, "f12" },
1224 { { "fr13" }, "f13" },
1225 { { "fr14" }, "f14" },
1226 { { "fr15" }, "f15" },
1227 { { "fr16" }, "f16" },
1228 { { "fr17" }, "f17" },
1229 { { "fr18" }, "f18" },
1230 { { "fr19" }, "f19" },
1231 { { "fr20" }, "f20" },
1232 { { "fr21" }, "f21" },
1233 { { "fr22" }, "f22" },
1234 { { "fr23" }, "f23" },
1235 { { "fr24" }, "f24" },
1236 { { "fr25" }, "f25" },
1237 { { "fr26" }, "f26" },
1238 { { "fr27" }, "f27" },
1239 { { "fr28" }, "f28" },
1240 { { "fr29" }, "f29" },
1241 { { "fr30" }, "f30" },
1242 { { "fr31" }, "f31" },
1243 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001244};
1245
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001246void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001247 unsigned &NumAliases) const {
1248 Aliases = GCCRegAliases;
1249 NumAliases = llvm::array_lengthof(GCCRegAliases);
1250}
1251} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001252
Chris Lattner5ba61f02006-10-14 07:39:34 +00001253namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001254class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001256 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001257 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001258
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001259 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001260 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001261 case llvm::Triple::FreeBSD:
1262 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001263 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001264 PtrDiffType = SignedInt;
1265 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001266 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001267 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001268 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001269 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001270
Roman Divacky3ffe7462012-03-13 19:20:17 +00001271 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1272 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001273 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001274 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001275
1276 // PPC32 supports atomics up to 4 bytes.
1277 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001278 }
1279
Craig Topper3164f332014-03-11 03:39:26 +00001280 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001281 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001282 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001283 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001284};
1285} // end anonymous namespace.
1286
Bill Schmidt778d3872013-07-26 01:36:11 +00001287// Note: ABI differences may eventually require us to have a separate
1288// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001289namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001290class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001291public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001292 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001293 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001294 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001295 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001296
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001297 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1298 DescriptionString = "e-m:e-i64:64-n32:64";
1299 ABI = "elfv2";
1300 } else {
1301 DescriptionString = "E-m:e-i64:64-n32:64";
1302 ABI = "elfv1";
1303 }
1304
1305 switch (getTriple().getOS()) {
1306 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001307 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001308 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001309 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001310 case llvm::Triple::NetBSD:
1311 IntMaxType = SignedLongLong;
1312 Int64Type = SignedLongLong;
1313 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001314 default:
1315 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001316 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001317
1318 // PPC64 supports atomics up to 8 bytes.
1319 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001320 }
Craig Topper3164f332014-03-11 03:39:26 +00001321 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001322 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001323 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001324 // PPC64 Linux-specifc ABI options.
1325 bool setABI(const std::string &Name) override {
1326 if (Name == "elfv1" || Name == "elfv2") {
1327 ABI = Name;
1328 return true;
1329 }
1330 return false;
1331 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001332};
1333} // end anonymous namespace.
1334
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001335
1336namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001337class DarwinPPC32TargetInfo :
1338 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001339public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001340 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1341 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001342 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001343 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001344 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001345 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001346 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001347 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001348 }
Craig Topper3164f332014-03-11 03:39:26 +00001349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001350 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001351 }
1352};
1353
1354class DarwinPPC64TargetInfo :
1355 public DarwinTargetInfo<PPC64TargetInfo> {
1356public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001357 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1358 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001359 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001360 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001361 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001362 }
1363};
1364} // end anonymous namespace.
1365
Chris Lattner5ba61f02006-10-14 07:39:34 +00001366namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001367 static const unsigned NVPTXAddrSpaceMap[] = {
1368 1, // opencl_global
1369 3, // opencl_local
1370 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001371 // FIXME: generic has to be added to the target
1372 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001373 1, // cuda_device
1374 4, // cuda_constant
1375 3, // cuda_shared
1376 };
1377 class NVPTXTargetInfo : public TargetInfo {
1378 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001379 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001380
1381 // The GPU profiles supported by the NVPTX backend
1382 enum GPUKind {
1383 GK_NONE,
1384 GK_SM20,
1385 GK_SM21,
1386 GK_SM30,
1387 GK_SM35,
1388 } GPU;
1389
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001391 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 BigEndian = false;
1393 TLSSupported = false;
1394 LongWidth = LongAlign = 64;
1395 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001396 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001397 // Define available target features
1398 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001399 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001400 // Set the default GPU to sm20
1401 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001402 }
Craig Topper3164f332014-03-11 03:39:26 +00001403 void getTargetDefines(const LangOptions &Opts,
1404 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001406 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001407 if (Opts.CUDAIsDevice) {
1408 // Set __CUDA_ARCH__ for the GPU specified.
1409 std::string CUDAArchCode;
1410 switch (GPU) {
1411 case GK_SM20:
1412 CUDAArchCode = "200";
1413 break;
1414 case GK_SM21:
1415 CUDAArchCode = "210";
1416 break;
1417 case GK_SM30:
1418 CUDAArchCode = "300";
1419 break;
1420 case GK_SM35:
1421 CUDAArchCode = "350";
1422 break;
1423 default:
1424 llvm_unreachable("Unhandled target CPU");
1425 }
1426 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1427 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001428 }
Craig Topper3164f332014-03-11 03:39:26 +00001429 void getTargetBuiltins(const Builtin::Info *&Records,
1430 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001431 Records = BuiltinInfo;
1432 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001433 }
Craig Topper3164f332014-03-11 03:39:26 +00001434 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001435 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001436 }
Craig Topper3164f332014-03-11 03:39:26 +00001437
1438 void getGCCRegNames(const char * const *&Names,
1439 unsigned &NumNames) const override;
1440 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1441 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001442 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001443 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001444 NumAliases = 0;
1445 }
Eric Christopher917e9522014-11-18 22:36:15 +00001446 bool
1447 validateAsmConstraint(const char *&Name,
1448 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001449 switch (*Name) {
1450 default: return false;
1451 case 'c':
1452 case 'h':
1453 case 'r':
1454 case 'l':
1455 case 'f':
1456 case 'd':
1457 Info.setAllowsRegister();
1458 return true;
1459 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001460 }
Craig Topper3164f332014-03-11 03:39:26 +00001461 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001462 // FIXME: Is this really right?
1463 return "";
1464 }
Craig Topper3164f332014-03-11 03:39:26 +00001465 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001466 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001467 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001468 }
Craig Topper3164f332014-03-11 03:39:26 +00001469 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001470 GPU = llvm::StringSwitch<GPUKind>(Name)
1471 .Case("sm_20", GK_SM20)
1472 .Case("sm_21", GK_SM21)
1473 .Case("sm_30", GK_SM30)
1474 .Case("sm_35", GK_SM35)
1475 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001476
Reid Klecknerbbc01782014-12-03 21:53:36 +00001477 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001478 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001479 };
1480
1481 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1482#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1483#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1484 ALL_LANGUAGES },
1485#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001486 };
1487
1488 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1489 "r0"
1490 };
1491
1492 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1493 unsigned &NumNames) const {
1494 Names = GCCRegNames;
1495 NumNames = llvm::array_lengthof(GCCRegNames);
1496 }
1497
1498 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1499 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001500 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001501 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001502 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1503 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001504 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001505 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001506 };
1507
1508 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1509 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001510 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001511 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001512 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1513 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001514 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001515 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001516 };
1517}
1518
1519namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001520
1521static const unsigned R600AddrSpaceMap[] = {
1522 1, // opencl_global
1523 3, // opencl_local
1524 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001525 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001526 1, // cuda_device
1527 2, // cuda_constant
1528 3 // cuda_shared
1529};
1530
Tom Stellarda96344b2014-08-21 13:58:40 +00001531// If you edit the description strings, make sure you update
1532// getPointerWidthV().
1533
Tom Stellardc74b1e02013-03-04 17:40:53 +00001534static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001535 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1536 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001537
1538static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001539 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1540 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001541
1542static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001543 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001544 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1545 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001546
Eli Friedmand13b41e2012-10-12 23:32:00 +00001547class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001548 static const Builtin::Info BuiltinInfo[];
1549
Tom Stellardc74b1e02013-03-04 17:40:53 +00001550 /// \brief The GPU profiles supported by the R600 target.
1551 enum GPUKind {
1552 GK_NONE,
1553 GK_R600,
1554 GK_R600_DOUBLE_OPS,
1555 GK_R700,
1556 GK_R700_DOUBLE_OPS,
1557 GK_EVERGREEN,
1558 GK_EVERGREEN_DOUBLE_OPS,
1559 GK_NORTHERN_ISLANDS,
1560 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001561 GK_SOUTHERN_ISLANDS,
1562 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001563 } GPU;
1564
Eli Friedmand13b41e2012-10-12 23:32:00 +00001565public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001566 R600TargetInfo(const llvm::Triple &Triple)
1567 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001568 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001569 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001570 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001571 }
1572
Tom Stellarda96344b2014-08-21 13:58:40 +00001573 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1574 if (GPU <= GK_CAYMAN)
1575 return 32;
1576
1577 switch(AddrSpace) {
1578 default:
1579 return 64;
1580 case 0:
1581 case 3:
1582 case 5:
1583 return 32;
1584 }
1585 }
1586
Craig Topper3164f332014-03-11 03:39:26 +00001587 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001588 return "";
1589 }
1590
Craig Topper3164f332014-03-11 03:39:26 +00001591 void getGCCRegNames(const char * const *&Names,
1592 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001593 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001594 numNames = 0;
1595 }
1596
Craig Topper3164f332014-03-11 03:39:26 +00001597 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1598 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001599 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001600 NumAliases = 0;
1601 }
1602
Craig Topper3164f332014-03-11 03:39:26 +00001603 bool validateAsmConstraint(const char *&Name,
1604 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001605 return true;
1606 }
1607
Craig Topper3164f332014-03-11 03:39:26 +00001608 void getTargetBuiltins(const Builtin::Info *&Records,
1609 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001610 Records = BuiltinInfo;
1611 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001612 }
1613
Craig Topper3164f332014-03-11 03:39:26 +00001614 void getTargetDefines(const LangOptions &Opts,
1615 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001616 Builder.defineMacro("__R600__");
1617 }
1618
Craig Topper3164f332014-03-11 03:39:26 +00001619 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001620 return TargetInfo::CharPtrBuiltinVaList;
1621 }
1622
Craig Topper3164f332014-03-11 03:39:26 +00001623 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001624 GPU = llvm::StringSwitch<GPUKind>(Name)
1625 .Case("r600" , GK_R600)
1626 .Case("rv610", GK_R600)
1627 .Case("rv620", GK_R600)
1628 .Case("rv630", GK_R600)
1629 .Case("rv635", GK_R600)
1630 .Case("rs780", GK_R600)
1631 .Case("rs880", GK_R600)
1632 .Case("rv670", GK_R600_DOUBLE_OPS)
1633 .Case("rv710", GK_R700)
1634 .Case("rv730", GK_R700)
1635 .Case("rv740", GK_R700_DOUBLE_OPS)
1636 .Case("rv770", GK_R700_DOUBLE_OPS)
1637 .Case("palm", GK_EVERGREEN)
1638 .Case("cedar", GK_EVERGREEN)
1639 .Case("sumo", GK_EVERGREEN)
1640 .Case("sumo2", GK_EVERGREEN)
1641 .Case("redwood", GK_EVERGREEN)
1642 .Case("juniper", GK_EVERGREEN)
1643 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1644 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1645 .Case("barts", GK_NORTHERN_ISLANDS)
1646 .Case("turks", GK_NORTHERN_ISLANDS)
1647 .Case("caicos", GK_NORTHERN_ISLANDS)
1648 .Case("cayman", GK_CAYMAN)
1649 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001650 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001651 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1652 .Case("verde", GK_SOUTHERN_ISLANDS)
1653 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001654 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001655 .Case("bonaire", GK_SEA_ISLANDS)
1656 .Case("kabini", GK_SEA_ISLANDS)
1657 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001658 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001659 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001660 .Default(GK_NONE);
1661
1662 if (GPU == GK_NONE) {
1663 return false;
1664 }
1665
1666 // Set the correct data layout
1667 switch (GPU) {
1668 case GK_NONE:
1669 case GK_R600:
1670 case GK_R700:
1671 case GK_EVERGREEN:
1672 case GK_NORTHERN_ISLANDS:
1673 DescriptionString = DescriptionStringR600;
1674 break;
1675 case GK_R600_DOUBLE_OPS:
1676 case GK_R700_DOUBLE_OPS:
1677 case GK_EVERGREEN_DOUBLE_OPS:
1678 case GK_CAYMAN:
1679 DescriptionString = DescriptionStringR600DoubleOps;
1680 break;
1681 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001682 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001683 DescriptionString = DescriptionStringSI;
1684 break;
1685 }
1686
1687 return true;
1688 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001689};
1690
Matt Arsenault56f008d2014-06-24 20:45:01 +00001691const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1692#define BUILTIN(ID, TYPE, ATTRS) \
1693 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1694#include "clang/Basic/BuiltinsR600.def"
1695};
1696
Eli Friedmand13b41e2012-10-12 23:32:00 +00001697} // end anonymous namespace
1698
1699namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001700// Namespace for x86 abstract base class
1701const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001702#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001703#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001704 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001705#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001706};
Eli Friedmanb5366062008-05-20 14:21:01 +00001707
Nuno Lopescfca1f02009-12-23 17:49:57 +00001708static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001709 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1710 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001711 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001712 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1713 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1714 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001715 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001716 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1717 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001718};
1719
Eric Christophercdd36352011-06-21 00:05:20 +00001720const TargetInfo::AddlRegName AddlRegNames[] = {
1721 { { "al", "ah", "eax", "rax" }, 0 },
1722 { { "bl", "bh", "ebx", "rbx" }, 3 },
1723 { { "cl", "ch", "ecx", "rcx" }, 2 },
1724 { { "dl", "dh", "edx", "rdx" }, 1 },
1725 { { "esi", "rsi" }, 4 },
1726 { { "edi", "rdi" }, 5 },
1727 { { "esp", "rsp" }, 7 },
1728 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001729};
1730
1731// X86 target abstract base class; x86-32 and x86-64 are very close, so
1732// most of the implementation can be shared.
1733class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001734 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001735 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001736 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001737 enum MMX3DNowEnum {
1738 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1739 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001740 enum XOPEnum {
1741 NoXOP,
1742 SSE4A,
1743 FMA4,
1744 XOP
1745 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001746
Eric Christophere1ddaf92010-04-02 23:50:19 +00001747 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001748 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001749 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001750 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001751 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001752 bool HasBMI;
1753 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001754 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001755 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001756 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001757 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001758 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001759 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001760 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001761 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001762 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1763 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001764 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001765 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001766
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001767 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1768 ///
1769 /// Each enumeration represents a particular CPU supported by Clang. These
1770 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1771 enum CPUKind {
1772 CK_Generic,
1773
1774 /// \name i386
1775 /// i386-generation processors.
1776 //@{
1777 CK_i386,
1778 //@}
1779
1780 /// \name i486
1781 /// i486-generation processors.
1782 //@{
1783 CK_i486,
1784 CK_WinChipC6,
1785 CK_WinChip2,
1786 CK_C3,
1787 //@}
1788
1789 /// \name i586
1790 /// i586-generation processors, P5 microarchitecture based.
1791 //@{
1792 CK_i586,
1793 CK_Pentium,
1794 CK_PentiumMMX,
1795 //@}
1796
1797 /// \name i686
1798 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1799 //@{
1800 CK_i686,
1801 CK_PentiumPro,
1802 CK_Pentium2,
1803 CK_Pentium3,
1804 CK_Pentium3M,
1805 CK_PentiumM,
1806 CK_C3_2,
1807
1808 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1809 /// Clang however has some logic to suport this.
1810 // FIXME: Warn, deprecate, and potentially remove this.
1811 CK_Yonah,
1812 //@}
1813
1814 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001815 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001816 //@{
1817 CK_Pentium4,
1818 CK_Pentium4M,
1819 CK_Prescott,
1820 CK_Nocona,
1821 //@}
1822
1823 /// \name Core
1824 /// Core microarchitecture based processors.
1825 //@{
1826 CK_Core2,
1827
1828 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1829 /// codename which GCC no longer accepts as an option to -march, but Clang
1830 /// has some logic for recognizing it.
1831 // FIXME: Warn, deprecate, and potentially remove this.
1832 CK_Penryn,
1833 //@}
1834
1835 /// \name Atom
1836 /// Atom processors
1837 //@{
1838 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001839 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001840 //@}
1841
1842 /// \name Nehalem
1843 /// Nehalem microarchitecture based processors.
1844 //@{
1845 CK_Corei7,
1846 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001847 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001848 CK_CoreAVX2,
Robert Khasanov50e6f582014-09-19 09:53:48 +00001849 CK_Broadwell,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001850 //@}
1851
Craig Topper449314e2013-08-20 07:09:39 +00001852 /// \name Knights Landing
1853 /// Knights Landing processor.
1854 CK_KNL,
1855
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001856 /// \name Skylake Server
1857 /// Skylake server processor.
1858 CK_SKX,
1859
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001860 /// \name K6
1861 /// K6 architecture processors.
1862 //@{
1863 CK_K6,
1864 CK_K6_2,
1865 CK_K6_3,
1866 //@}
1867
1868 /// \name K7
1869 /// K7 architecture processors.
1870 //@{
1871 CK_Athlon,
1872 CK_AthlonThunderbird,
1873 CK_Athlon4,
1874 CK_AthlonXP,
1875 CK_AthlonMP,
1876 //@}
1877
1878 /// \name K8
1879 /// K8 architecture processors.
1880 //@{
1881 CK_Athlon64,
1882 CK_Athlon64SSE3,
1883 CK_AthlonFX,
1884 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001885 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001886 CK_Opteron,
1887 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001888 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001889 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001890
Benjamin Kramer569f2152012-01-10 11:50:18 +00001891 /// \name Bobcat
1892 /// Bobcat architecture processors.
1893 //@{
1894 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001895 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001896 //@}
1897
1898 /// \name Bulldozer
1899 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001900 //@{
1901 CK_BDVER1,
1902 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001903 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001904 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001905 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001906
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001907 /// This specification is deprecated and will be removed in the future.
1908 /// Users should prefer \see CK_K8.
1909 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001910 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001911 CK_x86_64,
1912 //@}
1913
1914 /// \name Geode
1915 /// Geode processors.
1916 //@{
1917 CK_Geode
1918 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001919 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001920
Rafael Espindolaeb265472013-08-21 21:59:03 +00001921 enum FPMathKind {
1922 FP_Default,
1923 FP_SSE,
1924 FP_387
1925 } FPMath;
1926
Eli Friedman3fd920a2008-08-20 02:34:37 +00001927public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001928 X86TargetInfo(const llvm::Triple &Triple)
1929 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001930 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001931 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1932 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1933 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1934 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1935 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1936 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001937 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001938 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001939 }
Craig Topper3164f332014-03-11 03:39:26 +00001940 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001941 // X87 evaluates with 80 bits "long double" precision.
1942 return SSELevel == NoSSE ? 2 : 0;
1943 }
Craig Topper3164f332014-03-11 03:39:26 +00001944 void getTargetBuiltins(const Builtin::Info *&Records,
1945 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001946 Records = BuiltinInfo;
1947 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001948 }
Craig Topper3164f332014-03-11 03:39:26 +00001949 void getGCCRegNames(const char * const *&Names,
1950 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001951 Names = GCCRegNames;
1952 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001953 }
Craig Topper3164f332014-03-11 03:39:26 +00001954 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1955 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001956 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001957 NumAliases = 0;
1958 }
Craig Topper3164f332014-03-11 03:39:26 +00001959 void getGCCAddlRegNames(const AddlRegName *&Names,
1960 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001961 Names = AddlRegNames;
1962 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001963 }
Craig Topper3164f332014-03-11 03:39:26 +00001964 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00001965 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001966
Akira Hatanaka974131e2014-09-18 18:17:18 +00001967 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1968
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001969 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1970
Akira Hatanaka974131e2014-09-18 18:17:18 +00001971 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1972
Craig Topper3164f332014-03-11 03:39:26 +00001973 std::string convertConstraint(const char *&Constraint) const override;
1974 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001975 return "~{dirflag},~{fpsr},~{flags}";
1976 }
Craig Topper3164f332014-03-11 03:39:26 +00001977 void getTargetDefines(const LangOptions &Opts,
1978 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001979 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1980 bool Enabled);
1981 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1982 bool Enabled);
1983 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1984 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001985 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1986 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001987 setFeatureEnabledImpl(Features, Name, Enabled);
1988 }
1989 // This exists purely to cut down on the number of virtual calls in
1990 // getDefaultFeatures which calls this repeatedly.
1991 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1992 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001993 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1994 bool hasFeature(StringRef Feature) const override;
1995 bool handleTargetFeatures(std::vector<std::string> &Features,
1996 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001997 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001998 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001999 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002000 else if (getTriple().getArch() == llvm::Triple::x86 &&
2001 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002002 return "no-mmx";
2003 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002004 }
Craig Topper3164f332014-03-11 03:39:26 +00002005 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002006 CPU = llvm::StringSwitch<CPUKind>(Name)
2007 .Case("i386", CK_i386)
2008 .Case("i486", CK_i486)
2009 .Case("winchip-c6", CK_WinChipC6)
2010 .Case("winchip2", CK_WinChip2)
2011 .Case("c3", CK_C3)
2012 .Case("i586", CK_i586)
2013 .Case("pentium", CK_Pentium)
2014 .Case("pentium-mmx", CK_PentiumMMX)
2015 .Case("i686", CK_i686)
2016 .Case("pentiumpro", CK_PentiumPro)
2017 .Case("pentium2", CK_Pentium2)
2018 .Case("pentium3", CK_Pentium3)
2019 .Case("pentium3m", CK_Pentium3M)
2020 .Case("pentium-m", CK_PentiumM)
2021 .Case("c3-2", CK_C3_2)
2022 .Case("yonah", CK_Yonah)
2023 .Case("pentium4", CK_Pentium4)
2024 .Case("pentium4m", CK_Pentium4M)
2025 .Case("prescott", CK_Prescott)
2026 .Case("nocona", CK_Nocona)
2027 .Case("core2", CK_Core2)
2028 .Case("penryn", CK_Penryn)
2029 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00002030 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00002031 .Case("corei7", CK_Corei7)
2032 .Case("corei7-avx", CK_Corei7AVX)
2033 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00002034 .Case("core-avx2", CK_CoreAVX2)
Robert Khasanov50e6f582014-09-19 09:53:48 +00002035 .Case("broadwell", CK_Broadwell)
Craig Topper449314e2013-08-20 07:09:39 +00002036 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002037 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00002038 .Case("k6", CK_K6)
2039 .Case("k6-2", CK_K6_2)
2040 .Case("k6-3", CK_K6_3)
2041 .Case("athlon", CK_Athlon)
2042 .Case("athlon-tbird", CK_AthlonThunderbird)
2043 .Case("athlon-4", CK_Athlon4)
2044 .Case("athlon-xp", CK_AthlonXP)
2045 .Case("athlon-mp", CK_AthlonMP)
2046 .Case("athlon64", CK_Athlon64)
2047 .Case("athlon64-sse3", CK_Athlon64SSE3)
2048 .Case("athlon-fx", CK_AthlonFX)
2049 .Case("k8", CK_K8)
2050 .Case("k8-sse3", CK_K8SSE3)
2051 .Case("opteron", CK_Opteron)
2052 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002053 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002054 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002055 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002056 .Case("bdver1", CK_BDVER1)
2057 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002058 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002059 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 .Case("x86-64", CK_x86_64)
2061 .Case("geode", CK_Geode)
2062 .Default(CK_Generic);
2063
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002064 // Perform any per-CPU checks necessary to determine if this CPU is
2065 // acceptable.
2066 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2067 // invalid without explaining *why*.
2068 switch (CPU) {
2069 case CK_Generic:
2070 // No processor selected!
2071 return false;
2072
2073 case CK_i386:
2074 case CK_i486:
2075 case CK_WinChipC6:
2076 case CK_WinChip2:
2077 case CK_C3:
2078 case CK_i586:
2079 case CK_Pentium:
2080 case CK_PentiumMMX:
2081 case CK_i686:
2082 case CK_PentiumPro:
2083 case CK_Pentium2:
2084 case CK_Pentium3:
2085 case CK_Pentium3M:
2086 case CK_PentiumM:
2087 case CK_Yonah:
2088 case CK_C3_2:
2089 case CK_Pentium4:
2090 case CK_Pentium4M:
2091 case CK_Prescott:
2092 case CK_K6:
2093 case CK_K6_2:
2094 case CK_K6_3:
2095 case CK_Athlon:
2096 case CK_AthlonThunderbird:
2097 case CK_Athlon4:
2098 case CK_AthlonXP:
2099 case CK_AthlonMP:
2100 case CK_Geode:
2101 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002102 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002103 return false;
2104
2105 // Fallthrough
2106 case CK_Nocona:
2107 case CK_Core2:
2108 case CK_Penryn:
2109 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002110 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002111 case CK_Corei7:
2112 case CK_Corei7AVX:
2113 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002114 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002115 case CK_Broadwell:
Craig Topper449314e2013-08-20 07:09:39 +00002116 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002117 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002118 case CK_Athlon64:
2119 case CK_Athlon64SSE3:
2120 case CK_AthlonFX:
2121 case CK_K8:
2122 case CK_K8SSE3:
2123 case CK_Opteron:
2124 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002125 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002126 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002127 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002128 case CK_BDVER1:
2129 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002130 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002131 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002132 case CK_x86_64:
2133 return true;
2134 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002135 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002136 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002137
Craig Topper3164f332014-03-11 03:39:26 +00002138 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002139
Craig Topper3164f332014-03-11 03:39:26 +00002140 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002141 // We accept all non-ARM calling conventions
2142 return (CC == CC_X86ThisCall ||
2143 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002144 CC == CC_X86StdCall ||
2145 CC == CC_X86VectorCall ||
2146 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002147 CC == CC_X86Pascal ||
2148 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002149 }
2150
Craig Topper3164f332014-03-11 03:39:26 +00002151 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002152 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002153 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002154};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002155
Rafael Espindolaeb265472013-08-21 21:59:03 +00002156bool X86TargetInfo::setFPMath(StringRef Name) {
2157 if (Name == "387") {
2158 FPMath = FP_387;
2159 return true;
2160 }
2161 if (Name == "sse") {
2162 FPMath = FP_SSE;
2163 return true;
2164 }
2165 return false;
2166}
2167
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002168void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002169 // FIXME: This *really* should not be here.
2170
2171 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002172 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002174
Chandler Carruth212334f2011-09-28 08:55:37 +00002175 switch (CPU) {
2176 case CK_Generic:
2177 case CK_i386:
2178 case CK_i486:
2179 case CK_i586:
2180 case CK_Pentium:
2181 case CK_i686:
2182 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002183 break;
2184 case CK_PentiumMMX:
2185 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002186 case CK_K6:
2187 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002188 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002189 break;
2190 case CK_Pentium3:
2191 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002192 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002193 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002194 break;
2195 case CK_PentiumM:
2196 case CK_Pentium4:
2197 case CK_Pentium4M:
2198 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002199 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002200 break;
2201 case CK_Yonah:
2202 case CK_Prescott:
2203 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002204 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002205 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002206 break;
2207 case CK_Core2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002208 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002209 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002210 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002211 break;
2212 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002213 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002214 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002215 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002216 case CK_SKX:
2217 setFeatureEnabledImpl(Features, "avx512f", true);
2218 setFeatureEnabledImpl(Features, "avx512cd", true);
2219 setFeatureEnabledImpl(Features, "avx512dq", true);
2220 setFeatureEnabledImpl(Features, "avx512bw", true);
2221 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002222 // FALLTHROUGH
2223 case CK_Broadwell:
2224 setFeatureEnabledImpl(Features, "rdseed", true);
2225 setFeatureEnabledImpl(Features, "adx", true);
2226 // FALLTHROUGH
2227 case CK_CoreAVX2:
2228 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002229 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002230 setFeatureEnabledImpl(Features, "bmi", true);
2231 setFeatureEnabledImpl(Features, "bmi2", true);
2232 setFeatureEnabledImpl(Features, "rtm", true);
2233 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002234 // FALLTHROUGH
2235 case CK_CoreAVXi:
2236 setFeatureEnabledImpl(Features, "rdrnd", true);
2237 setFeatureEnabledImpl(Features, "f16c", true);
2238 setFeatureEnabledImpl(Features, "fsgsbase", true);
2239 // FALLTHROUGH
2240 case CK_Corei7AVX:
2241 setFeatureEnabledImpl(Features, "avx", true);
2242 // FALLTHROUGH
2243 case CK_Silvermont:
2244 setFeatureEnabledImpl(Features, "aes", true);
2245 setFeatureEnabledImpl(Features, "pclmul", true);
2246 // FALLTHROUGH
2247 case CK_Corei7:
2248 setFeatureEnabledImpl(Features, "sse4.2", true);
2249 setFeatureEnabledImpl(Features, "cx16", true);
2250 break;
2251 case CK_KNL:
2252 setFeatureEnabledImpl(Features, "avx512f", true);
2253 setFeatureEnabledImpl(Features, "avx512cd", true);
2254 setFeatureEnabledImpl(Features, "avx512er", true);
2255 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002256 setFeatureEnabledImpl(Features, "rdseed", true);
2257 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002258 setFeatureEnabledImpl(Features, "lzcnt", true);
2259 setFeatureEnabledImpl(Features, "bmi", true);
2260 setFeatureEnabledImpl(Features, "bmi2", true);
2261 setFeatureEnabledImpl(Features, "rtm", true);
2262 setFeatureEnabledImpl(Features, "fma", true);
2263 setFeatureEnabledImpl(Features, "rdrnd", true);
2264 setFeatureEnabledImpl(Features, "f16c", true);
2265 setFeatureEnabledImpl(Features, "fsgsbase", true);
2266 setFeatureEnabledImpl(Features, "aes", true);
2267 setFeatureEnabledImpl(Features, "pclmul", true);
2268 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002269 break;
2270 case CK_K6_2:
2271 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002272 case CK_WinChip2:
2273 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002274 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002275 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002276 case CK_Athlon:
2277 case CK_AthlonThunderbird:
2278 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002279 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002280 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002281 case CK_Athlon4:
2282 case CK_AthlonXP:
2283 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002284 setFeatureEnabledImpl(Features, "sse", true);
2285 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002286 break;
2287 case CK_K8:
2288 case CK_Opteron:
2289 case CK_Athlon64:
2290 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002291 setFeatureEnabledImpl(Features, "sse2", true);
2292 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002293 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002294 case CK_AMDFAM10:
2295 setFeatureEnabledImpl(Features, "sse4a", true);
2296 setFeatureEnabledImpl(Features, "lzcnt", true);
2297 setFeatureEnabledImpl(Features, "popcnt", true);
2298 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002299 case CK_K8SSE3:
2300 case CK_OpteronSSE3:
2301 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002302 setFeatureEnabledImpl(Features, "sse3", true);
2303 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002304 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002305 case CK_BTVER2:
2306 setFeatureEnabledImpl(Features, "avx", true);
2307 setFeatureEnabledImpl(Features, "aes", true);
2308 setFeatureEnabledImpl(Features, "pclmul", true);
2309 setFeatureEnabledImpl(Features, "bmi", true);
2310 setFeatureEnabledImpl(Features, "f16c", true);
2311 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002312 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002313 setFeatureEnabledImpl(Features, "ssse3", true);
2314 setFeatureEnabledImpl(Features, "sse4a", true);
2315 setFeatureEnabledImpl(Features, "lzcnt", true);
2316 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002317 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002318 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002319 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002320 case CK_BDVER4:
2321 setFeatureEnabledImpl(Features, "avx2", true);
2322 setFeatureEnabledImpl(Features, "bmi2", true);
2323 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002324 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002325 setFeatureEnabledImpl(Features, "fsgsbase", true);
2326 // FALLTHROUGH
2327 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002328 setFeatureEnabledImpl(Features, "bmi", true);
2329 setFeatureEnabledImpl(Features, "fma", true);
2330 setFeatureEnabledImpl(Features, "f16c", true);
2331 setFeatureEnabledImpl(Features, "tbm", true);
2332 // FALLTHROUGH
2333 case CK_BDVER1:
2334 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002335 setFeatureEnabledImpl(Features, "xop", true);
2336 setFeatureEnabledImpl(Features, "lzcnt", true);
2337 setFeatureEnabledImpl(Features, "aes", true);
2338 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002339 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002340 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002341 break;
Eli Friedman33465822011-07-08 23:31:17 +00002342 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002343}
2344
Rafael Espindolae62e2792013-08-20 13:44:29 +00002345void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002346 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002347 if (Enabled) {
2348 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002349 case AVX512F:
2350 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002351 case AVX2:
2352 Features["avx2"] = true;
2353 case AVX:
2354 Features["avx"] = true;
2355 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002356 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002357 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002358 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002359 case SSSE3:
2360 Features["ssse3"] = true;
2361 case SSE3:
2362 Features["sse3"] = true;
2363 case SSE2:
2364 Features["sse2"] = true;
2365 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002366 Features["sse"] = true;
2367 case NoSSE:
2368 break;
2369 }
2370 return;
2371 }
2372
2373 switch (Level) {
2374 case NoSSE:
2375 case SSE1:
2376 Features["sse"] = false;
2377 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002378 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2379 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002380 case SSE3:
2381 Features["sse3"] = false;
2382 setXOPLevel(Features, NoXOP, false);
2383 case SSSE3:
2384 Features["ssse3"] = false;
2385 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002386 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002387 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002388 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002389 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002390 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002391 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002392 case AVX2:
2393 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002394 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002395 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2396 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2397 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002398 }
2399}
2400
2401void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002402 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002403 if (Enabled) {
2404 switch (Level) {
2405 case AMD3DNowAthlon:
2406 Features["3dnowa"] = true;
2407 case AMD3DNow:
2408 Features["3dnow"] = true;
2409 case MMX:
2410 Features["mmx"] = true;
2411 case NoMMX3DNow:
2412 break;
2413 }
2414 return;
2415 }
2416
2417 switch (Level) {
2418 case NoMMX3DNow:
2419 case MMX:
2420 Features["mmx"] = false;
2421 case AMD3DNow:
2422 Features["3dnow"] = false;
2423 case AMD3DNowAthlon:
2424 Features["3dnowa"] = false;
2425 }
2426}
2427
2428void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002429 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002430 if (Enabled) {
2431 switch (Level) {
2432 case XOP:
2433 Features["xop"] = true;
2434 case FMA4:
2435 Features["fma4"] = true;
2436 setSSELevel(Features, AVX, true);
2437 case SSE4A:
2438 Features["sse4a"] = true;
2439 setSSELevel(Features, SSE3, true);
2440 case NoXOP:
2441 break;
2442 }
2443 return;
2444 }
2445
2446 switch (Level) {
2447 case NoXOP:
2448 case SSE4A:
2449 Features["sse4a"] = false;
2450 case FMA4:
2451 Features["fma4"] = false;
2452 case XOP:
2453 Features["xop"] = false;
2454 }
2455}
2456
Craig Topper86d79ef2013-09-17 04:51:29 +00002457void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2458 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002459 // FIXME: This *really* should not be here. We need some way of translating
2460 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002461 if (Name == "sse4")
2462 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002463
Rafael Espindolae62e2792013-08-20 13:44:29 +00002464 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002465
Craig Topper29561122013-09-19 01:13:07 +00002466 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002467 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002468 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002469 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002470 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002471 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002472 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002473 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002474 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002475 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002476 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002477 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002478 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002479 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002480 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002481 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002482 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002483 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002484 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002485 if (Enabled)
2486 setSSELevel(Features, SSE2, Enabled);
2487 } else if (Name == "pclmul") {
2488 if (Enabled)
2489 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002490 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002491 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002492 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002493 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002494 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002495 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002496 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2497 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002498 if (Enabled)
2499 setSSELevel(Features, AVX512F, Enabled);
2500 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002501 if (Enabled)
2502 setSSELevel(Features, AVX, Enabled);
2503 } else if (Name == "fma4") {
2504 setXOPLevel(Features, FMA4, Enabled);
2505 } else if (Name == "xop") {
2506 setXOPLevel(Features, XOP, Enabled);
2507 } else if (Name == "sse4a") {
2508 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002509 } else if (Name == "f16c") {
2510 if (Enabled)
2511 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002512 } else if (Name == "sha") {
2513 if (Enabled)
2514 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002515 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002516}
2517
Eric Christopher3ff21b32013-10-16 21:26:26 +00002518/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002519/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002520bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002521 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002522 // Remember the maximum enabled sselevel.
2523 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2524 // Ignore disabled features.
2525 if (Features[i][0] == '-')
2526 continue;
2527
Benjamin Kramer27402c62012-03-05 15:10:44 +00002528 StringRef Feature = StringRef(Features[i]).substr(1);
2529
2530 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002531 HasAES = true;
2532 continue;
2533 }
2534
Craig Topper3f122a72012-05-31 05:18:48 +00002535 if (Feature == "pclmul") {
2536 HasPCLMUL = true;
2537 continue;
2538 }
2539
Benjamin Kramer27402c62012-03-05 15:10:44 +00002540 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002541 HasLZCNT = true;
2542 continue;
2543 }
2544
Rafael Espindola89049822013-08-23 20:21:37 +00002545 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002546 HasRDRND = true;
2547 continue;
2548 }
2549
Craig Topper8c7f2512014-11-03 06:51:41 +00002550 if (Feature == "fsgsbase") {
2551 HasFSGSBASE = true;
2552 continue;
2553 }
2554
Benjamin Kramer27402c62012-03-05 15:10:44 +00002555 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002556 HasBMI = true;
2557 continue;
2558 }
2559
Benjamin Kramer27402c62012-03-05 15:10:44 +00002560 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002561 HasBMI2 = true;
2562 continue;
2563 }
2564
Benjamin Kramer27402c62012-03-05 15:10:44 +00002565 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002566 HasPOPCNT = true;
2567 continue;
2568 }
2569
Michael Liao625a8752012-11-10 05:17:46 +00002570 if (Feature == "rtm") {
2571 HasRTM = true;
2572 continue;
2573 }
2574
Michael Liao74f4eaf2013-03-26 17:52:08 +00002575 if (Feature == "prfchw") {
2576 HasPRFCHW = true;
2577 continue;
2578 }
2579
Michael Liaoffaae352013-03-29 05:17:55 +00002580 if (Feature == "rdseed") {
2581 HasRDSEED = true;
2582 continue;
2583 }
2584
Robert Khasanov50e6f582014-09-19 09:53:48 +00002585 if (Feature == "adx") {
2586 HasADX = true;
2587 continue;
2588 }
2589
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002590 if (Feature == "tbm") {
2591 HasTBM = true;
2592 continue;
2593 }
2594
Craig Topperbba778b2012-06-03 21:46:30 +00002595 if (Feature == "fma") {
2596 HasFMA = true;
2597 continue;
2598 }
2599
Manman Rena45358c2012-10-11 00:59:55 +00002600 if (Feature == "f16c") {
2601 HasF16C = true;
2602 continue;
2603 }
2604
Craig Topper679b53a2013-08-21 05:29:10 +00002605 if (Feature == "avx512cd") {
2606 HasAVX512CD = true;
2607 continue;
2608 }
2609
2610 if (Feature == "avx512er") {
2611 HasAVX512ER = true;
2612 continue;
2613 }
2614
2615 if (Feature == "avx512pf") {
2616 HasAVX512PF = true;
2617 continue;
2618 }
2619
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002620 if (Feature == "avx512dq") {
2621 HasAVX512DQ = true;
2622 continue;
2623 }
2624
2625 if (Feature == "avx512bw") {
2626 HasAVX512BW = true;
2627 continue;
2628 }
2629
2630 if (Feature == "avx512vl") {
2631 HasAVX512VL = true;
2632 continue;
2633 }
2634
Ben Langmuir58078d02013-09-19 13:22:04 +00002635 if (Feature == "sha") {
2636 HasSHA = true;
2637 continue;
2638 }
2639
Nick Lewycky50e8f482013-10-05 20:14:27 +00002640 if (Feature == "cx16") {
2641 HasCX16 = true;
2642 continue;
2643 }
2644
Daniel Dunbar979586e2009-11-11 09:38:56 +00002645 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002646 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002647 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002648 .Case("avx2", AVX2)
2649 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002650 .Case("sse4.2", SSE42)
2651 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002652 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002653 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002654 .Case("sse2", SSE2)
2655 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002656 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002657 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002658
Eli Friedman33465822011-07-08 23:31:17 +00002659 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002660 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002661 .Case("3dnowa", AMD3DNowAthlon)
2662 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002663 .Case("mmx", MMX)
2664 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002665 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002666
2667 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2668 .Case("xop", XOP)
2669 .Case("fma4", FMA4)
2670 .Case("sse4a", SSE4A)
2671 .Default(NoXOP);
2672 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002673 }
Eli Friedman33465822011-07-08 23:31:17 +00002674
Craig Topper7481d8a2013-09-10 06:55:47 +00002675 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2676 // Can't do this earlier because we need to be able to explicitly enable
2677 // popcnt and still disable sse4.2.
2678 if (!HasPOPCNT && SSELevel >= SSE42 &&
2679 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2680 HasPOPCNT = true;
2681 Features.push_back("+popcnt");
2682 }
2683
Yunzhong Gao61089362013-10-16 19:07:02 +00002684 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2685 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2686 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2687 HasPRFCHW = true;
2688 Features.push_back("+prfchw");
2689 }
2690
Rafael Espindolaeb265472013-08-21 21:59:03 +00002691 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2692 // matches the selected sse level.
2693 if (FPMath == FP_SSE && SSELevel < SSE1) {
2694 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2695 return false;
2696 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2697 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2698 return false;
2699 }
2700
Eli Friedman33465822011-07-08 23:31:17 +00002701 // Don't tell the backend if we're turning off mmx; it will end up disabling
2702 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002703 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2704 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002705 std::vector<std::string>::iterator it;
2706 it = std::find(Features.begin(), Features.end(), "-mmx");
2707 if (it != Features.end())
2708 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002709 else if (SSELevel > NoSSE)
2710 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002711 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002712}
Chris Lattnerecd49032009-03-02 22:27:17 +00002713
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002714/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2715/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002716void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002717 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002718 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002719 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002720 Builder.defineMacro("__amd64__");
2721 Builder.defineMacro("__amd64");
2722 Builder.defineMacro("__x86_64");
2723 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002724 if (getTriple().getArchName() == "x86_64h") {
2725 Builder.defineMacro("__x86_64h");
2726 Builder.defineMacro("__x86_64h__");
2727 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002728 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002729 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002730 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002731
Chris Lattnerecd49032009-03-02 22:27:17 +00002732 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002733 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2734 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002735 switch (CPU) {
2736 case CK_Generic:
2737 break;
2738 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002739 // The rest are coming from the i386 define above.
2740 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002741 break;
2742 case CK_i486:
2743 case CK_WinChipC6:
2744 case CK_WinChip2:
2745 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002746 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002747 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002748 case CK_PentiumMMX:
2749 Builder.defineMacro("__pentium_mmx__");
2750 Builder.defineMacro("__tune_pentium_mmx__");
2751 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002752 case CK_i586:
2753 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002754 defineCPUMacros(Builder, "i586");
2755 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002756 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002757 case CK_Pentium3:
2758 case CK_Pentium3M:
2759 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002760 Builder.defineMacro("__tune_pentium3__");
2761 // Fallthrough
2762 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002763 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002764 Builder.defineMacro("__tune_pentium2__");
2765 // Fallthrough
2766 case CK_PentiumPro:
2767 Builder.defineMacro("__tune_i686__");
2768 Builder.defineMacro("__tune_pentiumpro__");
2769 // Fallthrough
2770 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002771 Builder.defineMacro("__i686");
2772 Builder.defineMacro("__i686__");
2773 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2774 Builder.defineMacro("__pentiumpro");
2775 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002776 break;
2777 case CK_Pentium4:
2778 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002779 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002780 break;
2781 case CK_Yonah:
2782 case CK_Prescott:
2783 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002784 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002785 break;
2786 case CK_Core2:
2787 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002788 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002789 break;
2790 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002791 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002792 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002793 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002794 defineCPUMacros(Builder, "slm");
2795 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002796 case CK_Corei7:
2797 case CK_Corei7AVX:
2798 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002799 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002800 case CK_Broadwell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002801 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002802 break;
Craig Topper449314e2013-08-20 07:09:39 +00002803 case CK_KNL:
2804 defineCPUMacros(Builder, "knl");
2805 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002806 case CK_SKX:
2807 defineCPUMacros(Builder, "skx");
2808 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002809 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002810 Builder.defineMacro("__k6_2__");
2811 Builder.defineMacro("__tune_k6_2__");
2812 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002813 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002814 if (CPU != CK_K6_2) { // In case of fallthrough
2815 // FIXME: GCC may be enabling these in cases where some other k6
2816 // architecture is specified but -m3dnow is explicitly provided. The
2817 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002818 Builder.defineMacro("__k6_3__");
2819 Builder.defineMacro("__tune_k6_3__");
2820 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002821 // Fallthrough
2822 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002823 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002824 break;
2825 case CK_Athlon:
2826 case CK_AthlonThunderbird:
2827 case CK_Athlon4:
2828 case CK_AthlonXP:
2829 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002830 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002831 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002832 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002833 Builder.defineMacro("__tune_athlon_sse__");
2834 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002835 break;
2836 case CK_K8:
2837 case CK_K8SSE3:
2838 case CK_x86_64:
2839 case CK_Opteron:
2840 case CK_OpteronSSE3:
2841 case CK_Athlon64:
2842 case CK_Athlon64SSE3:
2843 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002844 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002845 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002846 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002847 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002848 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002849 case CK_BTVER1:
2850 defineCPUMacros(Builder, "btver1");
2851 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002852 case CK_BTVER2:
2853 defineCPUMacros(Builder, "btver2");
2854 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002855 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002856 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002857 break;
2858 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002859 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002860 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002861 case CK_BDVER3:
2862 defineCPUMacros(Builder, "bdver3");
2863 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002864 case CK_BDVER4:
2865 defineCPUMacros(Builder, "bdver4");
2866 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002867 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002868 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002869 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002870 }
Chris Lattner96e43572009-03-02 22:40:39 +00002871
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002872 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002873 Builder.defineMacro("__REGISTER_PREFIX__", "");
2874
Chris Lattner6df41af2009-04-19 17:32:33 +00002875 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2876 // functions in glibc header files that use FP Stack inline asm which the
2877 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002878 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002879
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002880 if (HasAES)
2881 Builder.defineMacro("__AES__");
2882
Craig Topper3f122a72012-05-31 05:18:48 +00002883 if (HasPCLMUL)
2884 Builder.defineMacro("__PCLMUL__");
2885
Craig Topper22967d42011-12-25 05:06:45 +00002886 if (HasLZCNT)
2887 Builder.defineMacro("__LZCNT__");
2888
Benjamin Kramer1e250392012-07-07 09:39:18 +00002889 if (HasRDRND)
2890 Builder.defineMacro("__RDRND__");
2891
Craig Topper8c7f2512014-11-03 06:51:41 +00002892 if (HasFSGSBASE)
2893 Builder.defineMacro("__FSGSBASE__");
2894
Craig Topper22967d42011-12-25 05:06:45 +00002895 if (HasBMI)
2896 Builder.defineMacro("__BMI__");
2897
2898 if (HasBMI2)
2899 Builder.defineMacro("__BMI2__");
2900
Craig Topper1de83482011-12-29 16:10:46 +00002901 if (HasPOPCNT)
2902 Builder.defineMacro("__POPCNT__");
2903
Michael Liao625a8752012-11-10 05:17:46 +00002904 if (HasRTM)
2905 Builder.defineMacro("__RTM__");
2906
Michael Liao74f4eaf2013-03-26 17:52:08 +00002907 if (HasPRFCHW)
2908 Builder.defineMacro("__PRFCHW__");
2909
Michael Liaoffaae352013-03-29 05:17:55 +00002910 if (HasRDSEED)
2911 Builder.defineMacro("__RDSEED__");
2912
Robert Khasanov50e6f582014-09-19 09:53:48 +00002913 if (HasADX)
2914 Builder.defineMacro("__ADX__");
2915
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002916 if (HasTBM)
2917 Builder.defineMacro("__TBM__");
2918
Rafael Espindolae62e2792013-08-20 13:44:29 +00002919 switch (XOPLevel) {
2920 case XOP:
2921 Builder.defineMacro("__XOP__");
2922 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002923 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002924 case SSE4A:
2925 Builder.defineMacro("__SSE4A__");
2926 case NoXOP:
2927 break;
2928 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002929
Craig Topperbba778b2012-06-03 21:46:30 +00002930 if (HasFMA)
2931 Builder.defineMacro("__FMA__");
2932
Manman Rena45358c2012-10-11 00:59:55 +00002933 if (HasF16C)
2934 Builder.defineMacro("__F16C__");
2935
Craig Topper679b53a2013-08-21 05:29:10 +00002936 if (HasAVX512CD)
2937 Builder.defineMacro("__AVX512CD__");
2938 if (HasAVX512ER)
2939 Builder.defineMacro("__AVX512ER__");
2940 if (HasAVX512PF)
2941 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002942 if (HasAVX512DQ)
2943 Builder.defineMacro("__AVX512DQ__");
2944 if (HasAVX512BW)
2945 Builder.defineMacro("__AVX512BW__");
2946 if (HasAVX512VL)
2947 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002948
Ben Langmuir58078d02013-09-19 13:22:04 +00002949 if (HasSHA)
2950 Builder.defineMacro("__SHA__");
2951
Nick Lewycky50e8f482013-10-05 20:14:27 +00002952 if (HasCX16)
2953 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2954
Chris Lattner96e43572009-03-02 22:40:39 +00002955 // Each case falls through to the previous one here.
2956 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002957 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002958 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002959 case AVX2:
2960 Builder.defineMacro("__AVX2__");
2961 case AVX:
2962 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002963 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002964 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002965 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002966 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002967 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002968 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002969 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002970 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002971 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002972 Builder.defineMacro("__SSE2__");
2973 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002974 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002975 Builder.defineMacro("__SSE__");
2976 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002977 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002978 break;
2979 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002980
Derek Schuffc7dd7222012-10-11 15:52:22 +00002981 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002982 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002983 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002984 case AVX2:
2985 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002986 case SSE42:
2987 case SSE41:
2988 case SSSE3:
2989 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002990 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002991 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002992 break;
2993 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002994 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002995 break;
2996 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002997 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002998 }
2999 }
3000
Anders Carlssone437c682010-01-27 03:47:49 +00003001 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003002 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003003 case AMD3DNowAthlon:
3004 Builder.defineMacro("__3dNOW_A__");
3005 case AMD3DNow:
3006 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003007 case MMX:
3008 Builder.defineMacro("__MMX__");
3009 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003010 break;
3011 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003012
3013 if (CPU >= CK_i486) {
3014 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3015 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3016 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3017 }
3018 if (CPU >= CK_i586)
3019 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003020}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003021
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003022bool X86TargetInfo::hasFeature(StringRef Feature) const {
3023 return llvm::StringSwitch<bool>(Feature)
3024 .Case("aes", HasAES)
3025 .Case("avx", SSELevel >= AVX)
3026 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003027 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003028 .Case("avx512cd", HasAVX512CD)
3029 .Case("avx512er", HasAVX512ER)
3030 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003031 .Case("avx512dq", HasAVX512DQ)
3032 .Case("avx512bw", HasAVX512BW)
3033 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003034 .Case("bmi", HasBMI)
3035 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003036 .Case("cx16", HasCX16)
3037 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003038 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003039 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003040 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003041 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003042 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3043 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3044 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003045 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003046 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003047 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003048 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003049 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003050 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003051 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003052 .Case("sse", SSELevel >= SSE1)
3053 .Case("sse2", SSELevel >= SSE2)
3054 .Case("sse3", SSELevel >= SSE3)
3055 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003056 .Case("sse4.1", SSELevel >= SSE41)
3057 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003058 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003059 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003060 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003061 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3062 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003063 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003064 .Default(false);
3065}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003066
Eli Friedman3fd920a2008-08-20 02:34:37 +00003067bool
Anders Carlsson58436352009-02-28 17:11:49 +00003068X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003069 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003070 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003071 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003072 case 'Y': // first letter of a pair:
3073 switch (*(Name+1)) {
3074 default: return false;
3075 case '0': // First SSE register.
3076 case 't': // Any SSE register, when SSE2 is enabled.
3077 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3078 case 'm': // any MMX register, when inter-unit moves enabled.
3079 break; // falls through to setAllowsRegister.
3080 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003081 case 'f': // any x87 floating point stack register.
3082 // Constraint 'f' cannot be used for output operands.
3083 if (Info.ConstraintStr[0] == '=')
3084 return false;
3085
3086 Info.setAllowsRegister();
3087 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003088 case 'a': // eax.
3089 case 'b': // ebx.
3090 case 'c': // ecx.
3091 case 'd': // edx.
3092 case 'S': // esi.
3093 case 'D': // edi.
3094 case 'A': // edx:eax.
3095 case 't': // top of floating point stack.
3096 case 'u': // second from top of floating point stack.
3097 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003098 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003099 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003100 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003101 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3102 case 'l': // "Index" registers: any general register that can be used as an
3103 // index in a base+index memory access.
3104 Info.setAllowsRegister();
3105 return true;
3106 case 'C': // SSE floating point constant.
3107 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003108 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003109 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003110 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003111 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003112 return true;
3113 }
3114}
3115
Akira Hatanaka974131e2014-09-18 18:17:18 +00003116bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3117 unsigned Size) const {
3118 // Strip off constraint modifiers.
3119 while (Constraint[0] == '=' ||
3120 Constraint[0] == '+' ||
3121 Constraint[0] == '&')
3122 Constraint = Constraint.substr(1);
3123
3124 return validateOperandSize(Constraint, Size);
3125}
3126
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003127bool X86TargetInfo::validateInputSize(StringRef Constraint,
3128 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003129 return validateOperandSize(Constraint, Size);
3130}
3131
3132bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3133 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003134 switch (Constraint[0]) {
3135 default: break;
3136 case 'y':
3137 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003138 case 'f':
3139 case 't':
3140 case 'u':
3141 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003142 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003143 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003144 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003145 }
3146
3147 return true;
3148}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003149
Eli Friedman3fd920a2008-08-20 02:34:37 +00003150std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003151X86TargetInfo::convertConstraint(const char *&Constraint) const {
3152 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003153 case 'a': return std::string("{ax}");
3154 case 'b': return std::string("{bx}");
3155 case 'c': return std::string("{cx}");
3156 case 'd': return std::string("{dx}");
3157 case 'S': return std::string("{si}");
3158 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003159 case 'p': // address
3160 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003161 case 't': // top of floating point stack.
3162 return std::string("{st}");
3163 case 'u': // second from top of floating point stack.
3164 return std::string("{st(1)}"); // second from top of floating point stack.
3165 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003166 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003167 }
3168}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003169} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003170
3171namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003172// X86-32 generic target
3173class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003174public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003175 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003176 DoubleAlign = LongLongAlign = 32;
3177 LongDoubleWidth = 96;
3178 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003179 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003180 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003181 SizeType = UnsignedInt;
3182 PtrDiffType = SignedInt;
3183 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003184 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003185
3186 // Use fpret for all types.
3187 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3188 (1 << TargetInfo::Double) |
3189 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003190
3191 // x86-32 has atomics up to 8 bytes
3192 // FIXME: Check that we actually have cmpxchg8b before setting
3193 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3194 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003195 }
Craig Topper3164f332014-03-11 03:39:26 +00003196 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003197 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003198 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003199
Craig Topper3164f332014-03-11 03:39:26 +00003200 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003201 if (RegNo == 0) return 0;
3202 if (RegNo == 1) return 2;
3203 return -1;
3204 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003205 bool validateOperandSize(StringRef Constraint,
3206 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003207 switch (Constraint[0]) {
3208 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003209 case 'R':
3210 case 'q':
3211 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003212 case 'a':
3213 case 'b':
3214 case 'c':
3215 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003216 case 'S':
3217 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003218 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003219 case 'A':
3220 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003221 }
3222
Akira Hatanaka974131e2014-09-18 18:17:18 +00003223 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003224 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003225};
3226} // end anonymous namespace
3227
3228namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003229class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3230public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003231 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3232 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003233
Craig Topper3164f332014-03-11 03:39:26 +00003234 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003235 unsigned Major, Minor, Micro;
3236 getTriple().getOSVersion(Major, Minor, Micro);
3237 // New NetBSD uses the default rounding mode.
3238 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3239 return X86_32TargetInfo::getFloatEvalMethod();
3240 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003241 return 1;
3242 }
3243};
3244} // end anonymous namespace
3245
3246namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003247class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3248public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003249 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3250 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003251 SizeType = UnsignedLong;
3252 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003253 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003254 }
3255};
3256} // end anonymous namespace
3257
3258namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003259class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3260public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003261 BitrigI386TargetInfo(const llvm::Triple &Triple)
3262 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003263 SizeType = UnsignedLong;
3264 IntPtrType = SignedLong;
3265 PtrDiffType = SignedLong;
3266 }
3267};
3268} // end anonymous namespace
3269
3270namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003271class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003272public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003273 DarwinI386TargetInfo(const llvm::Triple &Triple)
3274 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003275 LongDoubleWidth = 128;
3276 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003277 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003278 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003279 SizeType = UnsignedLong;
3280 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003281 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003282 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003283 }
3284
Eli Friedman3fd920a2008-08-20 02:34:37 +00003285};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003286} // end anonymous namespace
3287
3288namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003289// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003290class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003291public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003292 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3293 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003294 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003295 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003296 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003297 }
Craig Topper3164f332014-03-11 03:39:26 +00003298 void getTargetDefines(const LangOptions &Opts,
3299 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003300 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3301 }
3302};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003303
3304// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003305class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003306public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003307 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003308 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003309 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003310 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3311 }
Craig Topper3164f332014-03-11 03:39:26 +00003312 void getTargetDefines(const LangOptions &Opts,
3313 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003314 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3315 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3316 // The value of the following reflects processor type.
3317 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3318 // We lost the original triple, so we use the default.
3319 Builder.defineMacro("_M_IX86", "600");
3320 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003321};
3322} // end anonymous namespace
3323
Reid Kleckner47606832014-04-21 20:58:00 +00003324static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3325 Builder.defineMacro("__MSVCRT__");
3326 Builder.defineMacro("__MINGW32__");
3327
3328 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3329 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3330 // macro anyway for pre-processor compatibility.
3331 if (Opts.MicrosoftExt)
3332 Builder.defineMacro("__declspec", "__declspec");
3333 else
3334 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3335
3336 if (!Opts.MicrosoftExt) {
3337 // Provide macros for all the calling convention keywords. Provide both
3338 // single and double underscore prefixed variants. These are available on
3339 // x64 as well as x86, even though they have no effect.
3340 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3341 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003342 std::string GCCSpelling = "__attribute__((__";
3343 GCCSpelling += CC;
3344 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003345 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3346 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3347 }
3348 }
3349}
3350
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003351namespace {
3352// x86-32 MinGW target
3353class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003355 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3356 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003357 void getTargetDefines(const LangOptions &Opts,
3358 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003359 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003360 DefineStd(Builder, "WIN32", Opts);
3361 DefineStd(Builder, "WINNT", Opts);
3362 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003363 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003364 }
3365};
3366} // end anonymous namespace
3367
3368namespace {
3369// x86-32 Cygwin target
3370class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003372 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3373 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003374 TLSSupported = false;
3375 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003376 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003377 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003378 }
Craig Topper3164f332014-03-11 03:39:26 +00003379 void getTargetDefines(const LangOptions &Opts,
3380 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003381 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003382 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003383 Builder.defineMacro("__CYGWIN__");
3384 Builder.defineMacro("__CYGWIN32__");
3385 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003386 if (Opts.CPlusPlus)
3387 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003388 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003389};
3390} // end anonymous namespace
3391
3392namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003393// x86-32 Haiku target
3394class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3395public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003396 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003397 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003398 IntPtrType = SignedLong;
3399 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003400 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003401 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003402 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003403 }
Craig Topper3164f332014-03-11 03:39:26 +00003404 void getTargetDefines(const LangOptions &Opts,
3405 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003406 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3407 Builder.defineMacro("__INTEL__");
3408 Builder.defineMacro("__HAIKU__");
3409 }
3410};
3411} // end anonymous namespace
3412
Douglas Gregor9fabd852011-07-01 22:41:14 +00003413// RTEMS Target
3414template<typename Target>
3415class RTEMSTargetInfo : public OSTargetInfo<Target> {
3416protected:
Craig Topper3164f332014-03-11 03:39:26 +00003417 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3418 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003419 // RTEMS defines; list based off of gcc output
3420
Douglas Gregor9fabd852011-07-01 22:41:14 +00003421 Builder.defineMacro("__rtems__");
3422 Builder.defineMacro("__ELF__");
3423 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003424
Douglas Gregor9fabd852011-07-01 22:41:14 +00003425public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003426 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3427 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003428
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003429 switch (Triple.getArch()) {
3430 default:
3431 case llvm::Triple::x86:
3432 // this->MCountName = ".mcount";
3433 break;
3434 case llvm::Triple::mips:
3435 case llvm::Triple::mipsel:
3436 case llvm::Triple::ppc:
3437 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003438 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003439 // this->MCountName = "_mcount";
3440 break;
3441 case llvm::Triple::arm:
3442 // this->MCountName = "__mcount";
3443 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003444 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003445 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003446};
3447
3448namespace {
3449// x86-32 RTEMS target
3450class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3451public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003452 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003453 SizeType = UnsignedLong;
3454 IntPtrType = SignedLong;
3455 PtrDiffType = SignedLong;
3456 this->UserLabelPrefix = "";
3457 }
Craig Topper3164f332014-03-11 03:39:26 +00003458 void getTargetDefines(const LangOptions &Opts,
3459 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003460 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3461 Builder.defineMacro("__INTEL__");
3462 Builder.defineMacro("__rtems__");
3463 }
3464};
3465} // end anonymous namespace
3466
Chris Lattnerb986aba2010-04-11 19:29:39 +00003467namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003468// x86-64 generic target
3469class X86_64TargetInfo : public X86TargetInfo {
3470public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003471 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003472 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003473 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003474 LongDoubleWidth = 128;
3475 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003476 LargeArrayMinWidth = 128;
3477 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003478 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003479 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3480 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3481 IntPtrType = IsX32 ? SignedInt : SignedLong;
3482 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003483 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003484 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003485
Eric Christopher917e9522014-11-18 22:36:15 +00003486 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003487 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003488 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3489 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003490
3491 // Use fpret only for long double.
3492 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003493
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003494 // Use fp2ret for _Complex long double.
3495 ComplexLongDoubleUsesFP2Ret = true;
3496
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003497 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003498 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003499 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003500 }
Craig Topper3164f332014-03-11 03:39:26 +00003501 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003502 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003503 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003504
Craig Topper3164f332014-03-11 03:39:26 +00003505 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003506 if (RegNo == 0) return 0;
3507 if (RegNo == 1) return 1;
3508 return -1;
3509 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003510
Craig Topper3164f332014-03-11 03:39:26 +00003511 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003512 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003513 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003514 CC == CC_IntelOclBicc ||
3515 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003516 }
3517
Craig Topper3164f332014-03-11 03:39:26 +00003518 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003519 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003520 }
3521
Pavel Chupinfd223e12014-08-04 12:39:43 +00003522 // for x32 we need it here explicitly
3523 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003524};
3525} // end anonymous namespace
3526
3527namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003528// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003529class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003530public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003531 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3532 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003533 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003534 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003535 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003536 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003537 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003538 SizeType = UnsignedLongLong;
3539 PtrDiffType = SignedLongLong;
3540 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003541 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003542 }
Craig Topper3164f332014-03-11 03:39:26 +00003543 void getTargetDefines(const LangOptions &Opts,
3544 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003545 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003546 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003547 }
Craig Topper3164f332014-03-11 03:39:26 +00003548 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003549 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003550 }
Craig Topper3164f332014-03-11 03:39:26 +00003551 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003552 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003553 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003554 CC == CC_IntelOclBicc ||
3555 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3556 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003557};
3558} // end anonymous namespace
3559
3560namespace {
3561// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003562class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003563public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003564 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003565 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003566 LongDoubleWidth = LongDoubleAlign = 64;
3567 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003568 }
Craig Topper3164f332014-03-11 03:39:26 +00003569 void getTargetDefines(const LangOptions &Opts,
3570 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003571 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3572 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003573 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003574 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003575 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003576};
3577} // end anonymous namespace
3578
3579namespace {
3580// x86-64 MinGW target
3581class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3582public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003583 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3584 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003585 void getTargetDefines(const LangOptions &Opts,
3586 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003587 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003588 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003589 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003590 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003591
3592 // GCC defines this macro when it is using __gxx_personality_seh0.
3593 if (!Opts.SjLjExceptions)
3594 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003595 }
3596};
3597} // end anonymous namespace
3598
3599namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003600class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3601public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003602 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3603 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003604 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003605 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003606 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3607 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003608 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003609 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003610 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003611 }
3612};
3613} // end anonymous namespace
3614
3615namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003616class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3617public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003618 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3619 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003620 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003621 Int64Type = SignedLongLong;
3622 }
3623};
3624} // end anonymous namespace
3625
3626namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003627class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3628public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003629 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3630 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3631 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003632 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003633 }
3634};
Tim Northover9bb857a2013-01-31 12:13:10 +00003635}
3636
Eli Friedman9fa28852012-08-08 23:57:20 +00003637
3638namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003639class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003640 // Possible FPU choices.
3641 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003642 VFP2FPU = (1 << 0),
3643 VFP3FPU = (1 << 1),
3644 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003645 NeonFPU = (1 << 3),
3646 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003647 };
3648
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003649 // Possible HWDiv features.
3650 enum HWDivMode {
3651 HWDivThumb = (1 << 0),
3652 HWDivARM = (1 << 1)
3653 };
3654
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003655 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003656 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003657 }
3658
3659 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3660 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003661
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003662 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003663
Rafael Espindolaeb265472013-08-21 21:59:03 +00003664 enum {
3665 FP_Default,
3666 FP_VFP,
3667 FP_Neon
3668 } FPMath;
3669
Bernard Ogdenda13af32013-10-24 18:32:51 +00003670 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003671
Logan Chien57086ce2012-10-10 06:56:20 +00003672 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003673 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003674 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003675
3676 // Initialized via features.
3677 unsigned SoftFloat : 1;
3678 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003679
Bernard Ogden18b57012013-10-29 09:47:51 +00003680 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003681 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003682
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003683 // ACLE 6.5.1 Hardware floating point
3684 enum {
3685 HW_FP_HP = (1 << 1), /// half (16-bit)
3686 HW_FP_SP = (1 << 2), /// single (32-bit)
3687 HW_FP_DP = (1 << 3), /// double (64-bit)
3688 };
3689 uint32_t HW_FP;
3690
Chris Lattner5cc15e02010-03-03 19:03:45 +00003691 static const Builtin::Info BuiltinInfo[];
3692
Rafael Espindola101d5b92013-05-13 20:09:47 +00003693 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003694 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003695 if (T.getArch() == llvm::Triple::arm ||
3696 T.getArch() == llvm::Triple::armeb) {
3697 StringRef VersionStr;
3698 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003699 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003700 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003701 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003702 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003703 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003704 unsigned Version;
3705 if (VersionStr.getAsInteger(10, Version))
3706 return false;
3707 return Version >= 6;
3708 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003709 assert(T.getArch() == llvm::Triple::thumb ||
3710 T.getArch() == llvm::Triple::thumbeb);
3711 StringRef VersionStr;
3712 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003713 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003714 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003715 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003716 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003717 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003718 unsigned Version;
3719 if (VersionStr.getAsInteger(10, Version))
3720 return false;
3721 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003722 }
3723
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003724 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003725 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003726
3727 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003728 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003729
Tim Northover00853e52014-08-05 11:07:26 +00003730 // size_t is unsigned long on MachO-derived environments and NetBSD.
3731 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003732 SizeType = UnsignedLong;
3733 else
3734 SizeType = UnsignedInt;
3735
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003736 switch (T.getOS()) {
3737 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003738 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003739 break;
3740 case llvm::Triple::Win32:
3741 WCharType = UnsignedShort;
3742 break;
3743 case llvm::Triple::Linux:
3744 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003745 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3746 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003747 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003748 }
3749
3750 UseBitFieldTypeAlignment = true;
3751
3752 ZeroLengthBitfieldBoundary = 0;
3753
Tim Northover147cd2f2014-10-14 22:12:21 +00003754 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3755 // so set preferred for small types to 32.
3756 if (T.isOSBinFormatMachO()) {
3757 DescriptionString =
3758 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3759 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3760 } else if (T.isOSWindows()) {
3761 // FIXME: this is invalid for WindowsCE
3762 assert(!BigEndian && "Windows on ARM does not support big endian");
3763 DescriptionString = "e"
3764 "-m:e"
3765 "-p:32:32"
3766 "-i64:64"
3767 "-v128:64:128"
3768 "-a:0:32"
3769 "-n32"
3770 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003771 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003772 DescriptionString =
3773 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3774 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003775 }
3776
3777 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003778 }
3779
3780 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003781 const llvm::Triple &T = getTriple();
3782
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003783 IsAAPCS = false;
3784
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003785 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003786
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003787 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003788 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003789 SizeType = UnsignedInt;
3790 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003791 SizeType = UnsignedLong;
3792
3793 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3794 WCharType = SignedInt;
3795
3796 // Do not respect the alignment of bit-field types when laying out
3797 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3798 UseBitFieldTypeAlignment = false;
3799
3800 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3801 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3802 /// gcc.
3803 ZeroLengthBitfieldBoundary = 32;
3804
Tim Northover147cd2f2014-10-14 22:12:21 +00003805 if (T.isOSBinFormatMachO())
3806 DescriptionString =
3807 BigEndian
3808 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3809 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3810 else
3811 DescriptionString =
3812 BigEndian
3813 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3814 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003815
3816 // FIXME: Override "preferred align" for double and long long.
3817 }
3818
Chris Lattner17df24e2008-04-21 18:56:49 +00003819public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003820 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003821 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003822 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003823 BigEndian = IsBigEndian;
3824
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003825 switch (getTriple().getOS()) {
3826 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003827 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003828 break;
3829 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003830 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003831 break;
3832 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003833
Chris Lattner1a8f3942010-04-23 16:29:58 +00003834 // {} in inline assembly are neon specifiers, not assembly variant
3835 // specifiers.
3836 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003837
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003838 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003839 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003840
Eric Christopher0e261882014-12-05 01:06:59 +00003841 // FIXME: This duplicates code from the driver that sets the -target-abi
3842 // option - this code is used if -target-abi isn't passed and should
3843 // be unified in some way.
3844 if (Triple.isOSBinFormatMachO()) {
3845 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3846 // the frontend matches that.
3847 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3848 Triple.getOS() == llvm::Triple::UnknownOS ||
3849 StringRef(CPU).startswith("cortex-m")) {
3850 setABI("aapcs");
3851 } else {
3852 setABI("apcs-gnu");
3853 }
3854 } else if (Triple.isOSWindows()) {
3855 // FIXME: this is invalid for WindowsCE
3856 setABI("aapcs");
3857 } else {
3858 // Select the default based on the platform.
3859 switch (Triple.getEnvironment()) {
3860 case llvm::Triple::Android:
3861 case llvm::Triple::GNUEABI:
3862 case llvm::Triple::GNUEABIHF:
3863 setABI("aapcs-linux");
3864 break;
3865 case llvm::Triple::EABIHF:
3866 case llvm::Triple::EABI:
3867 setABI("aapcs");
3868 break;
3869 default:
3870 if (Triple.getOS() == llvm::Triple::NetBSD)
3871 setABI("apcs-gnu");
3872 else
3873 setABI("aapcs");
3874 break;
3875 }
3876 }
John McCall86353412010-08-21 22:46:04 +00003877
3878 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003879 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003880
3881 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003882 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003883 if (shouldUseInlineAtomic(getTriple()))
3884 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003885
3886 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003887 // the alignment of the zero-length bitfield is greater than the member
3888 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003889 // zero length bitfield.
3890 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003891 }
Alp Toker4925ba72014-06-07 23:30:42 +00003892 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003893 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003894 ABI = Name;
3895
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003896 // The defaults (above) are for AAPCS, check if we need to change them.
3897 //
3898 // FIXME: We need support for -meabi... we could just mangle it into the
3899 // name.
3900 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003901 setABIAPCS();
3902 return true;
3903 }
3904 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3905 setABIAAPCS();
3906 return true;
3907 }
3908 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003909 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003910
Craig Topper3164f332014-03-11 03:39:26 +00003911 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003912 if (IsAAPCS)
3913 Features["aapcs"] = true;
3914 else
3915 Features["apcs"] = true;
3916
Silviu Barangae5690462013-10-21 10:59:33 +00003917 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003918 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3919 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00003920 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00003921 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003922 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003923 }
3924 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003925 Features["vfp4"] = true;
3926 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003927 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3928 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003929 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003930 Features["vfp4"] = true;
3931 Features["neon"] = true;
3932 Features["hwdiv"] = true;
3933 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003934 } else if (CPU == "cyclone") {
3935 Features["v8fp"] = true;
3936 Features["neon"] = true;
3937 Features["hwdiv"] = true;
3938 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003939 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3940 Features["fp-armv8"] = true;
3941 Features["neon"] = true;
3942 Features["hwdiv"] = true;
3943 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003944 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003945 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003946 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003947 // Enable the hwdiv extension for all v8a AArch32 cores by
3948 // default.
3949 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003950 ArchName == "armebv8a" || ArchName == "armebv8" ||
3951 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3952 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003953 Features["hwdiv"] = true;
3954 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003955 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003956 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003957 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003958 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003959
Craig Topper3164f332014-03-11 03:39:26 +00003960 bool handleTargetFeatures(std::vector<std::string> &Features,
3961 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003962 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003963 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003964 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003965 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003966 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003967
3968 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003969 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003970 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003971 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003972 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003973 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003974 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003975 HW_FP = HW_FP_SP | HW_FP_DP;
3976 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003977 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003978 HW_FP = HW_FP_SP | HW_FP_DP;
3979 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003980 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003981 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3982 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003983 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003984 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3985 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003986 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003987 HW_FP = HW_FP_SP | HW_FP_DP;
3988 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003989 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003990 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003991 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003992 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003993 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003994 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003995 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003996 } else if (Feature == "+fp-only-sp") {
3997 HW_FP &= ~HW_FP_DP;
3998 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003999 }
4000
Rafael Espindolaeb265472013-08-21 21:59:03 +00004001 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4002 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4003 return false;
4004 }
4005
4006 if (FPMath == FP_Neon)
4007 Features.push_back("+neonfp");
4008 else if (FPMath == FP_VFP)
4009 Features.push_back("-neonfp");
4010
Daniel Dunbar893d4752009-12-19 04:15:38 +00004011 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004012 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4013 for (const auto &FEFeature : FrontEndFeatures) {
4014 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4015 if (Feature != Features.end())
4016 Features.erase(Feature);
4017 }
4018
Rafael Espindolaeb265472013-08-21 21:59:03 +00004019 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004020 }
4021
Craig Topper3164f332014-03-11 03:39:26 +00004022 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004023 return llvm::StringSwitch<bool>(Feature)
4024 .Case("arm", true)
4025 .Case("softfloat", SoftFloat)
4026 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004027 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004028 .Case("hwdiv", HWDiv & HWDivThumb)
4029 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004030 .Default(false);
4031 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004032 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004033 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004034 return llvm::StringSwitch<const char *>(Name)
4035 .Cases("arm8", "arm810", "4")
4036 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4037 "4")
4038 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4039 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4040 .Case("ep9312", "4T")
4041 .Cases("arm10tdmi", "arm1020t", "5T")
4042 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4043 .Case("arm926ej-s", "5TEJ")
4044 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4045 .Cases("xscale", "iwmmxt", "5TE")
4046 .Case("arm1136j-s", "6J")
4047 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4048 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4049 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4050 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4051 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4052 "7A")
4053 .Cases("cortex-r4", "cortex-r5", "7R")
4054 .Case("swift", "7S")
4055 .Case("cyclone", "8A")
4056 .Case("cortex-m3", "7M")
4057 .Cases("cortex-m4", "cortex-m7", "7EM")
4058 .Case("cortex-m0", "6M")
4059 .Cases("cortex-a53", "cortex-a57", "8A")
4060 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004061 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004062 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004063 return llvm::StringSwitch<const char *>(Name)
4064 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4065 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4066 "A")
4067 .Cases("cortex-a53", "cortex-a57", "A")
4068 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4069 .Cases("cortex-r4", "cortex-r5", "R")
4070 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004071 }
Craig Topper3164f332014-03-11 03:39:26 +00004072 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004073 if (!getCPUDefineSuffix(Name))
4074 return false;
4075
Tim Northovere8c37212014-07-09 09:24:43 +00004076 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4077 StringRef Profile = getCPUProfile(Name);
4078 if (Profile == "M" && MaxAtomicInlineWidth) {
4079 MaxAtomicPromoteWidth = 32;
4080 MaxAtomicInlineWidth = 32;
4081 }
4082
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004083 CPU = Name;
4084 return true;
4085 }
Craig Topper3164f332014-03-11 03:39:26 +00004086 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004087 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4088 unsigned CPUArchVer) const {
4089 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4090 (CPUArch.find('M') != StringRef::npos);
4091 }
4092 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4093 unsigned CPUArchVer) const {
4094 // We check both CPUArchVer and ArchName because when only triple is
4095 // specified, the default CPU is arm1136j-s.
4096 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4097 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4098 }
Craig Topper3164f332014-03-11 03:39:26 +00004099 void getTargetDefines(const LangOptions &Opts,
4100 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004101 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004102 Builder.defineMacro("__arm");
4103 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004104
Chris Lattnerecd49032009-03-02 22:27:17 +00004105 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004106 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004107
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004108 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004109 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004110 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004111 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004112 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004113
4114 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004115 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004116 StringRef ArchName = getTriple().getArchName();
4117
4118 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4119 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004120 if (CPUArch[0] >= '8') {
4121 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4122 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004123 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004124
4125 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4126 // is not defined for the M-profile.
4127 // NOTE that the deffault profile is assumed to be 'A'
4128 if (CPUProfile.empty() || CPUProfile != "M")
4129 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4130
4131 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4132 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4133 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4134 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4135 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4136 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4137 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4138
4139 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4140 // instruction set such as ARM or Thumb.
4141 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4142
4143 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4144
4145 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004146 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004147 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004148
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004149 // ACLE 6.5.1 Hardware Floating Point
4150 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004151 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004152
Yi Konga44c4d72014-06-27 21:25:42 +00004153 // ACLE predefines.
4154 Builder.defineMacro("__ARM_ACLE", "200");
4155
Mike Stump9d54bd72009-04-08 02:07:04 +00004156 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004157
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004158 // FIXME: It's more complicated than this and we don't really support
4159 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004160 // Windows on ARM does not "support" interworking
4161 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004162 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004163
David Tweed8f676532012-10-25 13:33:01 +00004164 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004165 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004166 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4167 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004168 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004169 Builder.defineMacro("__ARM_PCS", "1");
4170
David Tweed8f676532012-10-25 13:33:01 +00004171 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004172 Builder.defineMacro("__ARM_PCS_VFP", "1");
4173 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004174
Daniel Dunbar893d4752009-12-19 04:15:38 +00004175 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004176 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004177
4178 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004179 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004180
4181 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004182 Builder.defineMacro("__THUMBEL__");
4183 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004184 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004185 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004186 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004187 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4188 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004189
4190 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004191 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004192
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004193 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004194 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004195 if (FPU & VFP2FPU)
4196 Builder.defineMacro("__ARM_VFPV2__");
4197 if (FPU & VFP3FPU)
4198 Builder.defineMacro("__ARM_VFPV3__");
4199 if (FPU & VFP4FPU)
4200 Builder.defineMacro("__ARM_VFPV4__");
4201 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004202
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004203 // This only gets set when Neon instructions are actually available, unlike
4204 // the VFP define, hence the soft float and arch check. This is subtly
4205 // different from gcc, we follow the intent which was that it should be set
4206 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004207 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4208 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004209 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004210 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004211
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004212 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4213 Opts.ShortWChar ? "2" : "4");
4214
4215 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4216 Opts.ShortEnums ? "1" : "4");
4217
Bernard Ogden18b57012013-10-29 09:47:51 +00004218 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004219 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004220
Tim Northover02e38602014-02-03 17:28:04 +00004221 if (Crypto)
4222 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4223
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004224 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4228 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4229 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004230
4231 bool is5EOrAbove = (CPUArchVer >= 6 ||
4232 (CPUArchVer == 5 &&
4233 CPUArch.find('E') != StringRef::npos));
4234 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4235 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4236 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004237 }
Craig Topper3164f332014-03-11 03:39:26 +00004238 void getTargetBuiltins(const Builtin::Info *&Records,
4239 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004240 Records = BuiltinInfo;
4241 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004242 }
Craig Topper3164f332014-03-11 03:39:26 +00004243 bool isCLZForZeroUndef() const override { return false; }
4244 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004245 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004246 }
Craig Topper3164f332014-03-11 03:39:26 +00004247 void getGCCRegNames(const char * const *&Names,
4248 unsigned &NumNames) const override;
4249 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4250 unsigned &NumAliases) const override;
4251 bool validateAsmConstraint(const char *&Name,
4252 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004253 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004254 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004255 case 'l': // r0-r7
4256 case 'h': // r8-r15
4257 case 'w': // VFP Floating point register single precision
4258 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004259 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004260 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004261 case 'Q': // A memory address that is a single base register.
4262 Info.setAllowsMemory();
4263 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004264 case 'U': // a memory reference...
4265 switch (Name[1]) {
4266 case 'q': // ...ARMV4 ldrsb
4267 case 'v': // ...VFP load/store (reg+constant offset)
4268 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004269 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004270 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004271 case 'n': // valid address for Neon doubleword vector load/store
4272 case 'm': // valid address for Neon element and structure load/store
4273 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004274 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004275 Info.setAllowsMemory();
4276 Name++;
4277 return true;
4278 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004279 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004280 return false;
4281 }
Craig Topper3164f332014-03-11 03:39:26 +00004282 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004283 std::string R;
4284 switch (*Constraint) {
4285 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004286 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004287 Constraint++;
4288 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004289 case 'p': // 'p' should be translated to 'r' by default.
4290 R = std::string("r");
4291 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004292 default:
4293 return std::string(1, *Constraint);
4294 }
4295 return R;
4296 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004297 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004298 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004299 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004300 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004301 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004302
Bill Wendling9d1ee112012-10-25 23:28:48 +00004303 // Strip off constraint modifiers.
4304 while (Constraint[0] == '=' ||
4305 Constraint[0] == '+' ||
4306 Constraint[0] == '&')
4307 Constraint = Constraint.substr(1);
4308
4309 switch (Constraint[0]) {
4310 default: break;
4311 case 'r': {
4312 switch (Modifier) {
4313 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004314 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004315 case 'q':
4316 // A register of size 32 cannot fit a vector type.
4317 return false;
4318 }
4319 }
4320 }
4321
4322 return true;
4323 }
Craig Topper3164f332014-03-11 03:39:26 +00004324 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004325 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004326 return "";
4327 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004328
Craig Topper3164f332014-03-11 03:39:26 +00004329 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004330 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4331 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004332
Craig Topper3164f332014-03-11 03:39:26 +00004333 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004334 if (RegNo == 0) return 0;
4335 if (RegNo == 1) return 1;
4336 return -1;
4337 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004338};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004339
Rafael Espindolaeb265472013-08-21 21:59:03 +00004340bool ARMTargetInfo::setFPMath(StringRef Name) {
4341 if (Name == "neon") {
4342 FPMath = FP_Neon;
4343 return true;
4344 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4345 Name == "vfp4") {
4346 FPMath = FP_VFP;
4347 return true;
4348 }
4349 return false;
4350}
4351
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004352const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004353 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004354 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004355 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4356
4357 // Float registers
4358 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4359 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4360 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004361 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004362
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004363 // Double registers
4364 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4365 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004366 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4367 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004368
4369 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004370 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4371 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004372};
4373
4374void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004375 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004376 Names = GCCRegNames;
4377 NumNames = llvm::array_lengthof(GCCRegNames);
4378}
4379
4380const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004381 { { "a1" }, "r0" },
4382 { { "a2" }, "r1" },
4383 { { "a3" }, "r2" },
4384 { { "a4" }, "r3" },
4385 { { "v1" }, "r4" },
4386 { { "v2" }, "r5" },
4387 { { "v3" }, "r6" },
4388 { { "v4" }, "r7" },
4389 { { "v5" }, "r8" },
4390 { { "v6", "rfp" }, "r9" },
4391 { { "sl" }, "r10" },
4392 { { "fp" }, "r11" },
4393 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004394 { { "r13" }, "sp" },
4395 { { "r14" }, "lr" },
4396 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004397 // The S, D and Q registers overlap, but aren't really aliases; we
4398 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004399};
4400
4401void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4402 unsigned &NumAliases) const {
4403 Aliases = GCCRegAliases;
4404 NumAliases = llvm::array_lengthof(GCCRegAliases);
4405}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004406
4407const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004408#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004409#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004410 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004411#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004412
4413#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004414#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004415#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4416 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004417#include "clang/Basic/BuiltinsARM.def"
4418};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004419
4420class ARMleTargetInfo : public ARMTargetInfo {
4421public:
4422 ARMleTargetInfo(const llvm::Triple &Triple)
4423 : ARMTargetInfo(Triple, false) { }
4424 virtual void getTargetDefines(const LangOptions &Opts,
4425 MacroBuilder &Builder) const {
4426 Builder.defineMacro("__ARMEL__");
4427 ARMTargetInfo::getTargetDefines(Opts, Builder);
4428 }
4429};
4430
4431class ARMbeTargetInfo : public ARMTargetInfo {
4432public:
4433 ARMbeTargetInfo(const llvm::Triple &Triple)
4434 : ARMTargetInfo(Triple, true) { }
4435 virtual void getTargetDefines(const LangOptions &Opts,
4436 MacroBuilder &Builder) const {
4437 Builder.defineMacro("__ARMEB__");
4438 Builder.defineMacro("__ARM_BIG_ENDIAN");
4439 ARMTargetInfo::getTargetDefines(Opts, Builder);
4440 }
4441};
Chris Lattner17df24e2008-04-21 18:56:49 +00004442} // end anonymous namespace.
4443
Eli Friedmanf05b7722008-08-20 07:44:10 +00004444namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004445class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4446 const llvm::Triple Triple;
4447public:
4448 WindowsARMTargetInfo(const llvm::Triple &Triple)
4449 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4450 TLSSupported = false;
4451 WCharType = UnsignedShort;
4452 SizeType = UnsignedInt;
4453 UserLabelPrefix = "";
4454 }
4455 void getVisualStudioDefines(const LangOptions &Opts,
4456 MacroBuilder &Builder) const {
4457 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4458
4459 // FIXME: this is invalid for WindowsCE
4460 Builder.defineMacro("_M_ARM_NT", "1");
4461 Builder.defineMacro("_M_ARMT", "_M_ARM");
4462 Builder.defineMacro("_M_THUMB", "_M_ARM");
4463
4464 assert((Triple.getArch() == llvm::Triple::arm ||
4465 Triple.getArch() == llvm::Triple::thumb) &&
4466 "invalid architecture for Windows ARM target info");
4467 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4468 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4469
4470 // TODO map the complete set of values
4471 // 31: VFPv3 40: VFPv4
4472 Builder.defineMacro("_M_ARM_FP", "31");
4473 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004474 BuiltinVaListKind getBuiltinVaListKind() const override {
4475 return TargetInfo::CharPtrBuiltinVaList;
4476 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004477};
4478
4479// Windows ARM + Itanium C++ ABI Target
4480class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4481public:
4482 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4483 : WindowsARMTargetInfo(Triple) {
4484 TheCXXABI.set(TargetCXXABI::GenericARM);
4485 }
4486
4487 void getTargetDefines(const LangOptions &Opts,
4488 MacroBuilder &Builder) const override {
4489 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4490
4491 if (Opts.MSVCCompat)
4492 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4493 }
4494};
4495
4496// Windows ARM, MS (C++) ABI
4497class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4498public:
4499 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4500 : WindowsARMTargetInfo(Triple) {
4501 TheCXXABI.set(TargetCXXABI::Microsoft);
4502 }
4503
4504 void getTargetDefines(const LangOptions &Opts,
4505 MacroBuilder &Builder) const override {
4506 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4507 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4508 }
4509};
4510}
4511
4512
4513namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004514class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004515 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004516protected:
Craig Topper3164f332014-03-11 03:39:26 +00004517 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4518 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004519 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004520 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004521
Torok Edwinb2b37c62009-06-30 17:10:35 +00004522public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004523 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004524 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004525 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004526 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004527 // FIXME: This should be based off of the target features in
4528 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004529 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004530
4531 // Darwin on iOS uses a variant of the ARM C++ ABI.
4532 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004533 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004534};
4535} // end anonymous namespace.
4536
Tony Linthicum76329bf2011-12-12 21:14:55 +00004537
4538namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004539class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004540 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004541 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4542 static const char *const GCCRegNames[];
4543
James Molloy75f5f9e2014-04-16 15:33:48 +00004544 enum FPUModeEnum {
4545 FPUMode,
4546 NeonMode
4547 };
4548
4549 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004550 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004551 unsigned Crypto;
4552
Tim Northovera2ee4332014-03-29 15:09:45 +00004553 static const Builtin::Info BuiltinInfo[];
4554
4555 std::string ABI;
4556
4557public:
Tim Northover573cbee2014-05-24 12:52:07 +00004558 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004559 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004560
4561 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4562 WCharType = SignedInt;
4563
4564 // NetBSD apparently prefers consistency across ARM targets to consistency
4565 // across 64-bit targets.
4566 Int64Type = SignedLongLong;
4567 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004568 } else {
4569 WCharType = UnsignedInt;
4570 Int64Type = SignedLong;
4571 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004572 }
4573
Tim Northovera2ee4332014-03-29 15:09:45 +00004574 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004575 MaxVectorAlign = 128;
4576 RegParmMax = 8;
4577 MaxAtomicInlineWidth = 128;
4578 MaxAtomicPromoteWidth = 128;
4579
4580 LongDoubleWidth = LongDoubleAlign = 128;
4581 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4582
Tim Northovera2ee4332014-03-29 15:09:45 +00004583 // {} in inline assembly are neon specifiers, not assembly variant
4584 // specifiers.
4585 NoAsmVariants = true;
4586
Tim Northover573cbee2014-05-24 12:52:07 +00004587 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004588 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4589 }
4590
Alp Toker4925ba72014-06-07 23:30:42 +00004591 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004592 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004593 if (Name != "aapcs" && Name != "darwinpcs")
4594 return false;
4595
4596 ABI = Name;
4597 return true;
4598 }
4599
David Blaikie1cbb9712014-11-14 19:09:44 +00004600 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004601 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004602 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004603 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004604 .Case("cyclone", true)
4605 .Default(false);
4606 return CPUKnown;
4607 }
4608
4609 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004610 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004611 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004612 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004613
4614 // Target properties.
4615 Builder.defineMacro("_LP64");
4616 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004617
4618 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4619 Builder.defineMacro("__ARM_ACLE", "200");
4620 Builder.defineMacro("__ARM_ARCH", "8");
4621 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4622
4623 Builder.defineMacro("__ARM_64BIT_STATE");
4624 Builder.defineMacro("__ARM_PCS_AAPCS64");
4625 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4626
4627 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4628 Builder.defineMacro("__ARM_FEATURE_CLZ");
4629 Builder.defineMacro("__ARM_FEATURE_FMA");
4630 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004631 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4632 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4633 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4634 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004635
4636 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4637
4638 // 0xe implies support for half, single and double precision operations.
4639 Builder.defineMacro("__ARM_FP", "0xe");
4640
4641 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4642 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4643 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4644
4645 if (Opts.FastMath || Opts.FiniteMathOnly)
4646 Builder.defineMacro("__ARM_FP_FAST");
4647
Richard Smithab506ad2014-10-20 23:26:58 +00004648 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004649 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4650
4651 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4652
4653 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4654 Opts.ShortEnums ? "1" : "4");
4655
James Molloy75f5f9e2014-04-16 15:33:48 +00004656 if (FPU == NeonMode) {
4657 Builder.defineMacro("__ARM_NEON");
4658 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004659 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004660 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004661
Bradley Smith418c5932014-05-02 15:17:51 +00004662 if (CRC)
4663 Builder.defineMacro("__ARM_FEATURE_CRC32");
4664
James Molloy75f5f9e2014-04-16 15:33:48 +00004665 if (Crypto)
4666 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004667 }
4668
4669 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004670 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004671 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004672 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004673 }
4674
David Blaikie1cbb9712014-11-14 19:09:44 +00004675 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004676 return Feature == "aarch64" ||
4677 Feature == "arm64" ||
4678 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004679 }
4680
James Molloy5e73df52014-04-16 15:06:20 +00004681 bool handleTargetFeatures(std::vector<std::string> &Features,
4682 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004683 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004684 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004685 Crypto = 0;
4686 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4687 if (Features[i] == "+neon")
4688 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004689 if (Features[i] == "+crc")
4690 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004691 if (Features[i] == "+crypto")
4692 Crypto = 1;
4693 }
4694
James Molloy5e73df52014-04-16 15:06:20 +00004695 setDescriptionString();
4696
4697 return true;
4698 }
4699
David Blaikie1cbb9712014-11-14 19:09:44 +00004700 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004701
David Blaikie1cbb9712014-11-14 19:09:44 +00004702 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004703 return TargetInfo::AArch64ABIBuiltinVaList;
4704 }
4705
4706 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004707 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004708 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004709 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004710
Eric Christopher917e9522014-11-18 22:36:15 +00004711 virtual bool
4712 validateAsmConstraint(const char *&Name,
4713 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004714 switch (*Name) {
4715 default:
4716 return false;
4717 case 'w': // Floating point and SIMD registers (V0-V31)
4718 Info.setAllowsRegister();
4719 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004720 case 'I': // Constant that can be used with an ADD instruction
4721 case 'J': // Constant that can be used with a SUB instruction
4722 case 'K': // Constant that can be used with a 32-bit logical instruction
4723 case 'L': // Constant that can be used with a 64-bit logical instruction
4724 case 'M': // Constant that can be used as a 32-bit MOV immediate
4725 case 'N': // Constant that can be used as a 64-bit MOV immediate
4726 case 'Y': // Floating point constant zero
4727 case 'Z': // Integer constant zero
4728 return true;
4729 case 'Q': // A memory reference with base register and no offset
4730 Info.setAllowsMemory();
4731 return true;
4732 case 'S': // A symbolic address
4733 Info.setAllowsRegister();
4734 return true;
4735 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004736 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4737 // Utf: A memory address suitable for ldp/stp in TF mode.
4738 // Usa: An absolute symbolic address.
4739 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4740 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004741 case 'z': // Zero register, wzr or xzr
4742 Info.setAllowsRegister();
4743 return true;
4744 case 'x': // Floating point and SIMD registers (V0-V15)
4745 Info.setAllowsRegister();
4746 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004747 }
4748 return false;
4749 }
4750
Akira Hatanaka987f1862014-08-22 06:05:21 +00004751 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004752 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004753 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004754 // Strip off constraint modifiers.
4755 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4756 Constraint = Constraint.substr(1);
4757
4758 switch (Constraint[0]) {
4759 default:
4760 return true;
4761 case 'z':
4762 case 'r': {
4763 switch (Modifier) {
4764 case 'x':
4765 case 'w':
4766 // For now assume that the person knows what they're
4767 // doing with the modifier.
4768 return true;
4769 default:
4770 // By default an 'r' constraint will be in the 'x'
4771 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004772 if (Size == 64)
4773 return true;
4774
4775 SuggestedModifier = "w";
4776 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004777 }
4778 }
4779 }
4780 }
4781
David Blaikie1cbb9712014-11-14 19:09:44 +00004782 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004783
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004784 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004785 if (RegNo == 0)
4786 return 0;
4787 if (RegNo == 1)
4788 return 1;
4789 return -1;
4790 }
4791};
4792
Tim Northover573cbee2014-05-24 12:52:07 +00004793const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004794 // 32-bit Integer registers
4795 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4796 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4797 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4798
4799 // 64-bit Integer registers
4800 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4801 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4802 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4803
4804 // 32-bit floating point regsisters
4805 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4806 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4807 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4808
4809 // 64-bit floating point regsisters
4810 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4811 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4812 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4813
4814 // Vector registers
4815 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4816 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4817 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4818};
4819
Tim Northover573cbee2014-05-24 12:52:07 +00004820void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004821 unsigned &NumNames) const {
4822 Names = GCCRegNames;
4823 NumNames = llvm::array_lengthof(GCCRegNames);
4824}
4825
Tim Northover573cbee2014-05-24 12:52:07 +00004826const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004827 { { "w31" }, "wsp" },
4828 { { "x29" }, "fp" },
4829 { { "x30" }, "lr" },
4830 { { "x31" }, "sp" },
4831 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4832 // don't want to substitute one of these for a different-sized one.
4833};
4834
Tim Northover573cbee2014-05-24 12:52:07 +00004835void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004836 unsigned &NumAliases) const {
4837 Aliases = GCCRegAliases;
4838 NumAliases = llvm::array_lengthof(GCCRegAliases);
4839}
4840
Tim Northover573cbee2014-05-24 12:52:07 +00004841const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004842#define BUILTIN(ID, TYPE, ATTRS) \
4843 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4844#include "clang/Basic/BuiltinsNEON.def"
4845
4846#define BUILTIN(ID, TYPE, ATTRS) \
4847 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004848#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004849};
James Molloy5e73df52014-04-16 15:06:20 +00004850
Tim Northover573cbee2014-05-24 12:52:07 +00004851class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004852 void setDescriptionString() override {
4853 if (getTriple().isOSBinFormatMachO())
4854 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4855 else
4856 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4857 }
4858
4859public:
Tim Northover573cbee2014-05-24 12:52:07 +00004860 AArch64leTargetInfo(const llvm::Triple &Triple)
4861 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004862 BigEndian = false;
4863 }
4864 void getTargetDefines(const LangOptions &Opts,
4865 MacroBuilder &Builder) const override {
4866 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004867 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004868 }
4869};
4870
Tim Northover573cbee2014-05-24 12:52:07 +00004871class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004872 void setDescriptionString() override {
4873 assert(!getTriple().isOSBinFormatMachO());
4874 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4875 }
4876
4877public:
Tim Northover573cbee2014-05-24 12:52:07 +00004878 AArch64beTargetInfo(const llvm::Triple &Triple)
4879 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004880 void getTargetDefines(const LangOptions &Opts,
4881 MacroBuilder &Builder) const override {
4882 Builder.defineMacro("__AARCH64EB__");
4883 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4884 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004885 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004886 }
4887};
Tim Northovera2ee4332014-03-29 15:09:45 +00004888} // end anonymous namespace.
4889
4890namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004891class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004892protected:
4893 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4894 MacroBuilder &Builder) const override {
4895 Builder.defineMacro("__AARCH64_SIMD__");
4896 Builder.defineMacro("__ARM64_ARCH_8__");
4897 Builder.defineMacro("__ARM_NEON__");
4898 Builder.defineMacro("__LITTLE_ENDIAN__");
4899 Builder.defineMacro("__REGISTER_PREFIX__", "");
4900 Builder.defineMacro("__arm64", "1");
4901 Builder.defineMacro("__arm64__", "1");
4902
4903 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4904 }
4905
Tim Northovera2ee4332014-03-29 15:09:45 +00004906public:
Tim Northover573cbee2014-05-24 12:52:07 +00004907 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4908 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004909 Int64Type = SignedLongLong;
4910 WCharType = SignedInt;
4911 UseSignedCharForObjCBool = false;
4912
4913 LongDoubleWidth = LongDoubleAlign = 64;
4914 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4915
4916 TheCXXABI.set(TargetCXXABI::iOS64);
4917 }
4918
David Blaikie1cbb9712014-11-14 19:09:44 +00004919 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004920 return TargetInfo::CharPtrBuiltinVaList;
4921 }
4922};
4923} // end anonymous namespace
4924
4925namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004926// Hexagon abstract base class
4927class HexagonTargetInfo : public TargetInfo {
4928 static const Builtin::Info BuiltinInfo[];
4929 static const char * const GCCRegNames[];
4930 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4931 std::string CPU;
4932public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004933 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004934 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004935 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004936
4937 // {} in inline assembly are packet specifiers, not assembly variant
4938 // specifiers.
4939 NoAsmVariants = true;
4940 }
4941
Craig Topper3164f332014-03-11 03:39:26 +00004942 void getTargetBuiltins(const Builtin::Info *&Records,
4943 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004944 Records = BuiltinInfo;
4945 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4946 }
4947
Craig Topper3164f332014-03-11 03:39:26 +00004948 bool validateAsmConstraint(const char *&Name,
4949 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004950 return true;
4951 }
4952
Craig Topper3164f332014-03-11 03:39:26 +00004953 void getTargetDefines(const LangOptions &Opts,
4954 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004955
Craig Topper3164f332014-03-11 03:39:26 +00004956 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004957 return Feature == "hexagon";
4958 }
Craig Topper3164f332014-03-11 03:39:26 +00004959
4960 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004961 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004962 }
Craig Topper3164f332014-03-11 03:39:26 +00004963 void getGCCRegNames(const char * const *&Names,
4964 unsigned &NumNames) const override;
4965 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4966 unsigned &NumAliases) const override;
4967 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004968 return "";
4969 }
Sebastian Pop86500282012-01-13 20:37:10 +00004970
4971 static const char *getHexagonCPUSuffix(StringRef Name) {
4972 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004973 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004974 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004975 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004976 }
4977
Craig Topper3164f332014-03-11 03:39:26 +00004978 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004979 if (!getHexagonCPUSuffix(Name))
4980 return false;
4981
Tony Linthicum76329bf2011-12-12 21:14:55 +00004982 CPU = Name;
4983 return true;
4984 }
4985};
4986
4987void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4988 MacroBuilder &Builder) const {
4989 Builder.defineMacro("qdsp6");
4990 Builder.defineMacro("__qdsp6", "1");
4991 Builder.defineMacro("__qdsp6__", "1");
4992
4993 Builder.defineMacro("hexagon");
4994 Builder.defineMacro("__hexagon", "1");
4995 Builder.defineMacro("__hexagon__", "1");
4996
4997 if(CPU == "hexagonv1") {
4998 Builder.defineMacro("__HEXAGON_V1__");
4999 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5000 if(Opts.HexagonQdsp6Compat) {
5001 Builder.defineMacro("__QDSP6_V1__");
5002 Builder.defineMacro("__QDSP6_ARCH__", "1");
5003 }
5004 }
5005 else if(CPU == "hexagonv2") {
5006 Builder.defineMacro("__HEXAGON_V2__");
5007 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5008 if(Opts.HexagonQdsp6Compat) {
5009 Builder.defineMacro("__QDSP6_V2__");
5010 Builder.defineMacro("__QDSP6_ARCH__", "2");
5011 }
5012 }
5013 else if(CPU == "hexagonv3") {
5014 Builder.defineMacro("__HEXAGON_V3__");
5015 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5016 if(Opts.HexagonQdsp6Compat) {
5017 Builder.defineMacro("__QDSP6_V3__");
5018 Builder.defineMacro("__QDSP6_ARCH__", "3");
5019 }
5020 }
5021 else if(CPU == "hexagonv4") {
5022 Builder.defineMacro("__HEXAGON_V4__");
5023 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5024 if(Opts.HexagonQdsp6Compat) {
5025 Builder.defineMacro("__QDSP6_V4__");
5026 Builder.defineMacro("__QDSP6_ARCH__", "4");
5027 }
5028 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005029 else if(CPU == "hexagonv5") {
5030 Builder.defineMacro("__HEXAGON_V5__");
5031 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5032 if(Opts.HexagonQdsp6Compat) {
5033 Builder.defineMacro("__QDSP6_V5__");
5034 Builder.defineMacro("__QDSP6_ARCH__", "5");
5035 }
5036 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005037}
5038
5039const char * const HexagonTargetInfo::GCCRegNames[] = {
5040 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5041 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5042 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5043 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5044 "p0", "p1", "p2", "p3",
5045 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5046};
5047
5048void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5049 unsigned &NumNames) const {
5050 Names = GCCRegNames;
5051 NumNames = llvm::array_lengthof(GCCRegNames);
5052}
5053
5054
5055const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5056 { { "sp" }, "r29" },
5057 { { "fp" }, "r30" },
5058 { { "lr" }, "r31" },
5059 };
5060
5061void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5062 unsigned &NumAliases) const {
5063 Aliases = GCCRegAliases;
5064 NumAliases = llvm::array_lengthof(GCCRegAliases);
5065}
5066
5067
5068const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5069#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5070#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5071 ALL_LANGUAGES },
5072#include "clang/Basic/BuiltinsHexagon.def"
5073};
5074}
5075
5076
Chris Lattner5ba61f02006-10-14 07:39:34 +00005077namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005078// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5079class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005080 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5081 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005082 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005083public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005084 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005085
Craig Topper3164f332014-03-11 03:39:26 +00005086 bool handleTargetFeatures(std::vector<std::string> &Features,
5087 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005088 SoftFloat = false;
5089 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5090 if (Features[i] == "+soft-float")
5091 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005092 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005093 }
Craig Topper3164f332014-03-11 03:39:26 +00005094 void getTargetDefines(const LangOptions &Opts,
5095 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005096 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005097 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005098
5099 if (SoftFloat)
5100 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005101 }
Craig Topper3164f332014-03-11 03:39:26 +00005102
5103 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005104 return llvm::StringSwitch<bool>(Feature)
5105 .Case("softfloat", SoftFloat)
5106 .Case("sparc", true)
5107 .Default(false);
5108 }
Craig Topper3164f332014-03-11 03:39:26 +00005109
5110 void getTargetBuiltins(const Builtin::Info *&Records,
5111 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005112 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005113 }
Craig Topper3164f332014-03-11 03:39:26 +00005114 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005115 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005116 }
Craig Topper3164f332014-03-11 03:39:26 +00005117 void getGCCRegNames(const char * const *&Names,
5118 unsigned &NumNames) const override;
5119 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5120 unsigned &NumAliases) const override;
5121 bool validateAsmConstraint(const char *&Name,
5122 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005123 // FIXME: Implement!
5124 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005125 }
Craig Topper3164f332014-03-11 03:39:26 +00005126 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005127 // FIXME: Implement!
5128 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005129 }
5130};
5131
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005132const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005133 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5134 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5135 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5136 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5137};
5138
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005139void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5140 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005141 Names = GCCRegNames;
5142 NumNames = llvm::array_lengthof(GCCRegNames);
5143}
5144
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005145const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005146 { { "g0" }, "r0" },
5147 { { "g1" }, "r1" },
5148 { { "g2" }, "r2" },
5149 { { "g3" }, "r3" },
5150 { { "g4" }, "r4" },
5151 { { "g5" }, "r5" },
5152 { { "g6" }, "r6" },
5153 { { "g7" }, "r7" },
5154 { { "o0" }, "r8" },
5155 { { "o1" }, "r9" },
5156 { { "o2" }, "r10" },
5157 { { "o3" }, "r11" },
5158 { { "o4" }, "r12" },
5159 { { "o5" }, "r13" },
5160 { { "o6", "sp" }, "r14" },
5161 { { "o7" }, "r15" },
5162 { { "l0" }, "r16" },
5163 { { "l1" }, "r17" },
5164 { { "l2" }, "r18" },
5165 { { "l3" }, "r19" },
5166 { { "l4" }, "r20" },
5167 { { "l5" }, "r21" },
5168 { { "l6" }, "r22" },
5169 { { "l7" }, "r23" },
5170 { { "i0" }, "r24" },
5171 { { "i1" }, "r25" },
5172 { { "i2" }, "r26" },
5173 { { "i3" }, "r27" },
5174 { { "i4" }, "r28" },
5175 { { "i5" }, "r29" },
5176 { { "i6", "fp" }, "r30" },
5177 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005178};
5179
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005180void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5181 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005182 Aliases = GCCRegAliases;
5183 NumAliases = llvm::array_lengthof(GCCRegAliases);
5184}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005185
5186// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5187class SparcV8TargetInfo : public SparcTargetInfo {
5188public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005189 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005190 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005191 }
5192
Craig Topper3164f332014-03-11 03:39:26 +00005193 void getTargetDefines(const LangOptions &Opts,
5194 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005195 SparcTargetInfo::getTargetDefines(Opts, Builder);
5196 Builder.defineMacro("__sparcv8");
5197 }
5198};
5199
5200// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5201class SparcV9TargetInfo : public SparcTargetInfo {
5202public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005203 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005204 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005205 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005206 // This is an LP64 platform.
5207 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005208
5209 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005210 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005211 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005212 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005213 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005214 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005215
5216 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5217 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5218 LongDoubleWidth = 128;
5219 LongDoubleAlign = 128;
5220 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005221 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005222 }
5223
Craig Topper3164f332014-03-11 03:39:26 +00005224 void getTargetDefines(const LangOptions &Opts,
5225 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005226 SparcTargetInfo::getTargetDefines(Opts, Builder);
5227 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005228 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005229 // Solaris doesn't need these variants, but the BSDs do.
5230 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005231 Builder.defineMacro("__sparc64__");
5232 Builder.defineMacro("__sparc_v9__");
5233 Builder.defineMacro("__sparcv9__");
5234 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005235 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005236
Craig Topper3164f332014-03-11 03:39:26 +00005237 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005238 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5239 .Case("v9", true)
5240 .Case("ultrasparc", true)
5241 .Case("ultrasparc3", true)
5242 .Case("niagara", true)
5243 .Case("niagara2", true)
5244 .Case("niagara3", true)
5245 .Case("niagara4", true)
5246 .Default(false);
5247
5248 // No need to store the CPU yet. There aren't any CPU-specific
5249 // macros to define.
5250 return CPUKnown;
5251 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005252};
5253
Gabor Greif49991682008-02-21 16:29:08 +00005254} // end anonymous namespace.
5255
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005256namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005257class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005258public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005259 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5260 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005261 SizeType = UnsignedInt;
5262 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005263 }
5264};
5265} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005266
Chris Lattnerb781dc792008-05-08 05:58:21 +00005267namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005268class SystemZTargetInfo : public TargetInfo {
5269 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005270
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005271public:
5272 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5273 TLSSupported = true;
5274 IntWidth = IntAlign = 32;
5275 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5276 PointerWidth = PointerAlign = 64;
5277 LongDoubleWidth = 128;
5278 LongDoubleAlign = 64;
5279 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5280 MinGlobalAlign = 16;
5281 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5282 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5283 }
5284 void getTargetDefines(const LangOptions &Opts,
5285 MacroBuilder &Builder) const override {
5286 Builder.defineMacro("__s390__");
5287 Builder.defineMacro("__s390x__");
5288 Builder.defineMacro("__zarch__");
5289 Builder.defineMacro("__LONG_DOUBLE_128__");
5290 }
5291 void getTargetBuiltins(const Builtin::Info *&Records,
5292 unsigned &NumRecords) const override {
5293 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005294 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005295 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005296 }
5297
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005298 void getGCCRegNames(const char *const *&Names,
5299 unsigned &NumNames) const override;
5300 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5301 unsigned &NumAliases) const override {
5302 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005303 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005304 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005305 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005306 bool validateAsmConstraint(const char *&Name,
5307 TargetInfo::ConstraintInfo &info) const override;
5308 const char *getClobbers() const override {
5309 // FIXME: Is this really right?
5310 return "";
5311 }
5312 BuiltinVaListKind getBuiltinVaListKind() const override {
5313 return TargetInfo::SystemZBuiltinVaList;
5314 }
5315 bool setCPU(const std::string &Name) override {
5316 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5317 .Case("z10", true)
5318 .Case("z196", true)
5319 .Case("zEC12", true)
5320 .Default(false);
5321
5322 // No need to store the CPU yet. There aren't any CPU-specific
5323 // macros to define.
5324 return CPUKnown;
5325 }
5326};
5327
5328const char *const SystemZTargetInfo::GCCRegNames[] = {
5329 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5330 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5331 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5332 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5333};
5334
5335void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5336 unsigned &NumNames) const {
5337 Names = GCCRegNames;
5338 NumNames = llvm::array_lengthof(GCCRegNames);
5339}
5340
5341bool SystemZTargetInfo::
5342validateAsmConstraint(const char *&Name,
5343 TargetInfo::ConstraintInfo &Info) const {
5344 switch (*Name) {
5345 default:
5346 return false;
5347
5348 case 'a': // Address register
5349 case 'd': // Data register (equivalent to 'r')
5350 case 'f': // Floating-point register
5351 Info.setAllowsRegister();
5352 return true;
5353
5354 case 'I': // Unsigned 8-bit constant
5355 case 'J': // Unsigned 12-bit constant
5356 case 'K': // Signed 16-bit constant
5357 case 'L': // Signed 20-bit displacement (on all targets we support)
5358 case 'M': // 0x7fffffff
5359 return true;
5360
5361 case 'Q': // Memory with base and unsigned 12-bit displacement
5362 case 'R': // Likewise, plus an index
5363 case 'S': // Memory with base and signed 20-bit displacement
5364 case 'T': // Likewise, plus an index
5365 Info.setAllowsMemory();
5366 return true;
5367 }
5368}
Ulrich Weigand47445072013-05-06 16:26:41 +00005369}
5370
5371namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005372 class MSP430TargetInfo : public TargetInfo {
5373 static const char * const GCCRegNames[];
5374 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005375 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005376 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005377 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005378 IntWidth = 16; IntAlign = 16;
5379 LongWidth = 32; LongLongWidth = 64;
5380 LongAlign = LongLongAlign = 16;
5381 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005382 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005383 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005384 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005385 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005386 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005387 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005388 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005389 }
5390 void getTargetDefines(const LangOptions &Opts,
5391 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005392 Builder.defineMacro("MSP430");
5393 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005394 // FIXME: defines for different 'flavours' of MCU
5395 }
Craig Topper3164f332014-03-11 03:39:26 +00005396 void getTargetBuiltins(const Builtin::Info *&Records,
5397 unsigned &NumRecords) const override {
5398 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005399 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005400 NumRecords = 0;
5401 }
Craig Topper3164f332014-03-11 03:39:26 +00005402 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005403 return Feature == "msp430";
5404 }
Craig Topper3164f332014-03-11 03:39:26 +00005405 void getGCCRegNames(const char * const *&Names,
5406 unsigned &NumNames) const override;
5407 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5408 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005409 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005410 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005411 NumAliases = 0;
5412 }
Eric Christopher917e9522014-11-18 22:36:15 +00005413 bool
5414 validateAsmConstraint(const char *&Name,
5415 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005416 // No target constraints for now.
5417 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005418 }
Craig Topper3164f332014-03-11 03:39:26 +00005419 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005420 // FIXME: Is this really right?
5421 return "";
5422 }
Craig Topper3164f332014-03-11 03:39:26 +00005423 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005424 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005425 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005426 }
5427 };
5428
5429 const char * const MSP430TargetInfo::GCCRegNames[] = {
5430 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5431 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5432 };
5433
5434 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5435 unsigned &NumNames) const {
5436 Names = GCCRegNames;
5437 NumNames = llvm::array_lengthof(GCCRegNames);
5438 }
5439}
5440
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005441namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005442
Mike Stump11289f42009-09-09 15:08:12 +00005443 // LLVM and Clang cannot be used directly to output native binaries for
5444 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005445 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005446 //
5447 // TCE uses the llvm bitcode as input and uses it for generating customized
5448 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005449 // publicly available in http://tce.cs.tut.fi
5450
Eli Friedman1f191002011-10-07 19:51:42 +00005451 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5452 3, // opencl_global
5453 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005454 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005455 // FIXME: generic has to be added to the target
5456 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005457 0, // cuda_device
5458 0, // cuda_constant
5459 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005460 };
5461
Eli Friedmana9c3d712009-08-19 20:47:07 +00005462 class TCETargetInfo : public TargetInfo{
5463 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005464 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005465 TLSSupported = false;
5466 IntWidth = 32;
5467 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005468 PointerWidth = 32;
5469 IntAlign = 32;
5470 LongAlign = LongLongAlign = 32;
5471 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005472 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005473 SizeType = UnsignedInt;
5474 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005475 IntPtrType = SignedInt;
5476 PtrDiffType = SignedInt;
5477 FloatWidth = 32;
5478 FloatAlign = 32;
5479 DoubleWidth = 32;
5480 DoubleAlign = 32;
5481 LongDoubleWidth = 32;
5482 LongDoubleAlign = 32;
5483 FloatFormat = &llvm::APFloat::IEEEsingle;
5484 DoubleFormat = &llvm::APFloat::IEEEsingle;
5485 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005486 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5487 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005488 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005489 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005490 }
5491
Craig Topper3164f332014-03-11 03:39:26 +00005492 void getTargetDefines(const LangOptions &Opts,
5493 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005494 DefineStd(Builder, "tce", Opts);
5495 Builder.defineMacro("__TCE__");
5496 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005497 }
Craig Topper3164f332014-03-11 03:39:26 +00005498 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005499 return Feature == "tce";
5500 }
Craig Topper3164f332014-03-11 03:39:26 +00005501
5502 void getTargetBuiltins(const Builtin::Info *&Records,
5503 unsigned &NumRecords) const override {}
5504 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005505 return "";
5506 }
Craig Topper3164f332014-03-11 03:39:26 +00005507 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005508 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005509 }
Craig Topper3164f332014-03-11 03:39:26 +00005510 void getGCCRegNames(const char * const *&Names,
5511 unsigned &NumNames) const override {}
5512 bool validateAsmConstraint(const char *&Name,
5513 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005514 return true;
5515 }
Craig Topper3164f332014-03-11 03:39:26 +00005516 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5517 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005518 };
5519}
5520
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005521namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005522class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005523 virtual void setDescriptionString() = 0;
5524
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005525 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005526 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005527 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005528 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005529 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005530 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005531 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005532 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005533 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005534 enum DspRevEnum {
5535 NoDSP, DSP1, DSP2
5536 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005537 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005538
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005539protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005540 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005541 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005542
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005543public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005544 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5545 const std::string &CPUStr)
5546 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005547 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005548 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005549
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005550 bool isNaN2008Default() const {
5551 return CPU == "mips32r6" || CPU == "mips64r6";
5552 }
5553
5554 bool isFP64Default() const {
5555 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5556 }
5557
Alp Toker4925ba72014-06-07 23:30:42 +00005558 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005559 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005560 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5561 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005562 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005563 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005564 .Case("mips1", IsMips32)
5565 .Case("mips2", IsMips32)
5566 .Case("mips3", true)
5567 .Case("mips4", true)
5568 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005569 .Case("mips32", IsMips32)
5570 .Case("mips32r2", IsMips32)
5571 .Case("mips32r6", IsMips32)
5572 .Case("mips64", true)
5573 .Case("mips64r2", true)
5574 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005575 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005576 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005577 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005578 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005579 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005580 // The backend enables certain ABI's by default according to the
5581 // architecture.
5582 // Disable both possible defaults so that we don't end up with multiple
5583 // ABI's selected and trigger an assertion.
5584 Features["o32"] = false;
5585 Features["n64"] = false;
5586
Eric Christopher0b26a612010-03-02 02:41:08 +00005587 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005588 if (CPU == "octeon")
5589 Features["mips64r2"] = Features["cnmips"] = true;
5590 else
5591 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005592 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005593
Craig Topper3164f332014-03-11 03:39:26 +00005594 void getTargetDefines(const LangOptions &Opts,
5595 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005596 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005597 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005598 if (Opts.GNUMode)
5599 Builder.defineMacro("mips");
5600
Simon Atanasyan683535b2012-08-29 19:14:58 +00005601 Builder.defineMacro("__REGISTER_PREFIX__", "");
5602
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005603 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005604 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005605 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005606 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005607 case SoftFloat:
5608 Builder.defineMacro("__mips_soft_float", Twine(1));
5609 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005610 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005611
Simon Atanasyan16071912013-04-14 14:07:30 +00005612 if (IsSingleFloat)
5613 Builder.defineMacro("__mips_single_float", Twine(1));
5614
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005615 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5616 Builder.defineMacro("_MIPS_FPSET",
5617 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5618
Simon Atanasyan72244b62012-07-05 16:06:06 +00005619 if (IsMips16)
5620 Builder.defineMacro("__mips16", Twine(1));
5621
Simon Atanasyan60777612013-04-14 14:07:51 +00005622 if (IsMicromips)
5623 Builder.defineMacro("__mips_micromips", Twine(1));
5624
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005625 if (IsNan2008)
5626 Builder.defineMacro("__mips_nan2008", Twine(1));
5627
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005628 switch (DspRev) {
5629 default:
5630 break;
5631 case DSP1:
5632 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5633 Builder.defineMacro("__mips_dsp", Twine(1));
5634 break;
5635 case DSP2:
5636 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5637 Builder.defineMacro("__mips_dspr2", Twine(1));
5638 Builder.defineMacro("__mips_dsp", Twine(1));
5639 break;
5640 }
5641
Jack Carter44ff1e52013-08-12 17:20:29 +00005642 if (HasMSA)
5643 Builder.defineMacro("__mips_msa", Twine(1));
5644
Simon Atanasyan26f19672012-04-05 19:28:31 +00005645 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5646 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5647 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005648
5649 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5650 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005651 }
5652
Craig Topper3164f332014-03-11 03:39:26 +00005653 void getTargetBuiltins(const Builtin::Info *&Records,
5654 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005655 Records = BuiltinInfo;
5656 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005657 }
Craig Topper3164f332014-03-11 03:39:26 +00005658 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005659 return llvm::StringSwitch<bool>(Feature)
5660 .Case("mips", true)
5661 .Case("fp64", HasFP64)
5662 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005663 }
Craig Topper3164f332014-03-11 03:39:26 +00005664 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005665 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005666 }
Craig Topper3164f332014-03-11 03:39:26 +00005667 void getGCCRegNames(const char * const *&Names,
5668 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005669 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005670 // CPU register names
5671 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005672 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5673 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5674 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005675 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5676 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005677 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5678 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5679 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5680 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005681 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005682 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005683 "$fcc5","$fcc6","$fcc7",
5684 // MSA register names
5685 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5686 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5687 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5688 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5689 // MSA control register names
5690 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5691 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005692 };
5693 Names = GCCRegNames;
5694 NumNames = llvm::array_lengthof(GCCRegNames);
5695 }
Craig Topper3164f332014-03-11 03:39:26 +00005696 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5697 unsigned &NumAliases) const override = 0;
5698 bool validateAsmConstraint(const char *&Name,
5699 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005700 switch (*Name) {
5701 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005702 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005703 case 'r': // CPU registers.
5704 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005705 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005706 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005707 case 'c': // $25 for indirect jumps
5708 case 'l': // lo register
5709 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005710 Info.setAllowsRegister();
5711 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005712 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005713 Info.setAllowsMemory();
5714 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005715 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005716 }
5717
Craig Topper3164f332014-03-11 03:39:26 +00005718 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005719 // FIXME: Implement!
5720 return "";
5721 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005722
Craig Topper3164f332014-03-11 03:39:26 +00005723 bool handleTargetFeatures(std::vector<std::string> &Features,
5724 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005725 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005726 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005727 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005728 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005729 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005730 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005731 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005732
5733 for (std::vector<std::string>::iterator it = Features.begin(),
5734 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005735 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005736 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005737 else if (*it == "+soft-float")
5738 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005739 else if (*it == "+mips16")
5740 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005741 else if (*it == "+micromips")
5742 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005743 else if (*it == "+dsp")
5744 DspRev = std::max(DspRev, DSP1);
5745 else if (*it == "+dspr2")
5746 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005747 else if (*it == "+msa")
5748 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005749 else if (*it == "+fp64")
5750 HasFP64 = true;
5751 else if (*it == "-fp64")
5752 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005753 else if (*it == "+nan2008")
5754 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005755 else if (*it == "-nan2008")
5756 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005757 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005758
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005759 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005760 std::vector<std::string>::iterator it =
5761 std::find(Features.begin(), Features.end(), "+soft-float");
5762 if (it != Features.end())
5763 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005764
Akira Hatanaka9064e362013-10-29 18:30:33 +00005765 setDescriptionString();
5766
Rafael Espindolaeb265472013-08-21 21:59:03 +00005767 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005768 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005769
Craig Topper3164f332014-03-11 03:39:26 +00005770 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005771 if (RegNo == 0) return 4;
5772 if (RegNo == 1) return 5;
5773 return -1;
5774 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005775
5776 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005777};
5778
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005779const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5780#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5781#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5782 ALL_LANGUAGES },
5783#include "clang/Basic/BuiltinsMips.def"
5784};
5785
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005786class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005787public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005789 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005790 SizeType = UnsignedInt;
5791 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005792 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005793 }
Craig Topper3164f332014-03-11 03:39:26 +00005794 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005795 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005796 ABI = Name;
5797 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005798 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005799 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005800 }
Craig Topper3164f332014-03-11 03:39:26 +00005801 void getTargetDefines(const LangOptions &Opts,
5802 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005803 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005804
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005805 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005806 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5807
5808 const std::string& CPUStr = getCPU();
5809 if (CPUStr == "mips32")
5810 Builder.defineMacro("__mips_isa_rev", "1");
5811 else if (CPUStr == "mips32r2")
5812 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005813
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005814 if (ABI == "o32") {
5815 Builder.defineMacro("__mips_o32");
5816 Builder.defineMacro("_ABIO32", "1");
5817 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5818 }
5819 else if (ABI == "eabi")
5820 Builder.defineMacro("__mips_eabi");
5821 else
David Blaikie83d382b2011-09-23 05:06:16 +00005822 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005823 }
Craig Topper3164f332014-03-11 03:39:26 +00005824 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5825 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005826 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5827 { { "at" }, "$1" },
5828 { { "v0" }, "$2" },
5829 { { "v1" }, "$3" },
5830 { { "a0" }, "$4" },
5831 { { "a1" }, "$5" },
5832 { { "a2" }, "$6" },
5833 { { "a3" }, "$7" },
5834 { { "t0" }, "$8" },
5835 { { "t1" }, "$9" },
5836 { { "t2" }, "$10" },
5837 { { "t3" }, "$11" },
5838 { { "t4" }, "$12" },
5839 { { "t5" }, "$13" },
5840 { { "t6" }, "$14" },
5841 { { "t7" }, "$15" },
5842 { { "s0" }, "$16" },
5843 { { "s1" }, "$17" },
5844 { { "s2" }, "$18" },
5845 { { "s3" }, "$19" },
5846 { { "s4" }, "$20" },
5847 { { "s5" }, "$21" },
5848 { { "s6" }, "$22" },
5849 { { "s7" }, "$23" },
5850 { { "t8" }, "$24" },
5851 { { "t9" }, "$25" },
5852 { { "k0" }, "$26" },
5853 { { "k1" }, "$27" },
5854 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005855 { { "sp","$sp" }, "$29" },
5856 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005857 { { "ra" }, "$31" }
5858 };
5859 Aliases = GCCRegAliases;
5860 NumAliases = llvm::array_lengthof(GCCRegAliases);
5861 }
5862};
5863
5864class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005865 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005866 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005867 }
5868
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005869public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005870 Mips32EBTargetInfo(const llvm::Triple &Triple)
5871 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005872 }
Craig Topper3164f332014-03-11 03:39:26 +00005873 void getTargetDefines(const LangOptions &Opts,
5874 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005875 DefineStd(Builder, "MIPSEB", Opts);
5876 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005877 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005878 }
5879};
5880
5881class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005882 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005883 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005884 }
5885
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005886public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005887 Mips32ELTargetInfo(const llvm::Triple &Triple)
5888 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005889 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005890 }
Craig Topper3164f332014-03-11 03:39:26 +00005891 void getTargetDefines(const LangOptions &Opts,
5892 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005893 DefineStd(Builder, "MIPSEL", Opts);
5894 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005895 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005896 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005897};
Akira Hatanakabef17452011-09-20 19:21:49 +00005898
5899class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005900public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005901 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005902 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005903 LongDoubleWidth = LongDoubleAlign = 128;
5904 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005905 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5906 LongDoubleWidth = LongDoubleAlign = 64;
5907 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5908 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005909 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005910 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005911 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005912 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005913
5914 void setN64ABITypes() {
5915 LongWidth = LongAlign = 64;
5916 PointerWidth = PointerAlign = 64;
5917 SizeType = UnsignedLong;
5918 PtrDiffType = SignedLong;
5919 }
5920
5921 void setN32ABITypes() {
5922 LongWidth = LongAlign = 32;
5923 PointerWidth = PointerAlign = 32;
5924 SizeType = UnsignedInt;
5925 PtrDiffType = SignedInt;
5926 }
5927
Craig Topper3164f332014-03-11 03:39:26 +00005928 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005929 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005930 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005931 ABI = Name;
5932 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005933 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005934 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005935 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005936 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005937 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005938 }
5939 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005940 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005941
Craig Topper3164f332014-03-11 03:39:26 +00005942 void getTargetDefines(const LangOptions &Opts,
5943 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005944 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005945
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005946 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005947 Builder.defineMacro("__mips64");
5948 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005949 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5950
5951 const std::string& CPUStr = getCPU();
5952 if (CPUStr == "mips64")
5953 Builder.defineMacro("__mips_isa_rev", "1");
5954 else if (CPUStr == "mips64r2")
5955 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005956
Akira Hatanakabef17452011-09-20 19:21:49 +00005957 if (ABI == "n32") {
5958 Builder.defineMacro("__mips_n32");
5959 Builder.defineMacro("_ABIN32", "2");
5960 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5961 }
5962 else if (ABI == "n64") {
5963 Builder.defineMacro("__mips_n64");
5964 Builder.defineMacro("_ABI64", "3");
5965 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5966 }
5967 else
David Blaikie83d382b2011-09-23 05:06:16 +00005968 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005969 }
Craig Topper3164f332014-03-11 03:39:26 +00005970 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5971 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005972 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5973 { { "at" }, "$1" },
5974 { { "v0" }, "$2" },
5975 { { "v1" }, "$3" },
5976 { { "a0" }, "$4" },
5977 { { "a1" }, "$5" },
5978 { { "a2" }, "$6" },
5979 { { "a3" }, "$7" },
5980 { { "a4" }, "$8" },
5981 { { "a5" }, "$9" },
5982 { { "a6" }, "$10" },
5983 { { "a7" }, "$11" },
5984 { { "t0" }, "$12" },
5985 { { "t1" }, "$13" },
5986 { { "t2" }, "$14" },
5987 { { "t3" }, "$15" },
5988 { { "s0" }, "$16" },
5989 { { "s1" }, "$17" },
5990 { { "s2" }, "$18" },
5991 { { "s3" }, "$19" },
5992 { { "s4" }, "$20" },
5993 { { "s5" }, "$21" },
5994 { { "s6" }, "$22" },
5995 { { "s7" }, "$23" },
5996 { { "t8" }, "$24" },
5997 { { "t9" }, "$25" },
5998 { { "k0" }, "$26" },
5999 { { "k1" }, "$27" },
6000 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006001 { { "sp","$sp" }, "$29" },
6002 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006003 { { "ra" }, "$31" }
6004 };
6005 Aliases = GCCRegAliases;
6006 NumAliases = llvm::array_lengthof(GCCRegAliases);
6007 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006008
6009 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006010};
6011
6012class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006013 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006014 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006015 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006016 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006017 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006018
Akira Hatanakabef17452011-09-20 19:21:49 +00006019 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006020
Akira Hatanakabef17452011-09-20 19:21:49 +00006021public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006022 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006023 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006024 void getTargetDefines(const LangOptions &Opts,
6025 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006026 DefineStd(Builder, "MIPSEB", Opts);
6027 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006028 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006029 }
6030};
6031
6032class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006033 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006034 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006035 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006036 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006037 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006038 }
6039public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006040 Mips64ELTargetInfo(const llvm::Triple &Triple)
6041 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006042 // Default ABI is n64.
6043 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006044 }
Craig Topper3164f332014-03-11 03:39:26 +00006045 void getTargetDefines(const LangOptions &Opts,
6046 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006047 DefineStd(Builder, "MIPSEL", Opts);
6048 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006049 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006050 }
6051};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006052} // end anonymous namespace.
6053
Ivan Krasindd7403e2011-08-24 20:22:22 +00006054namespace {
6055class PNaClTargetInfo : public TargetInfo {
6056public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006057 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006058 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006059 this->UserLabelPrefix = "";
6060 this->LongAlign = 32;
6061 this->LongWidth = 32;
6062 this->PointerAlign = 32;
6063 this->PointerWidth = 32;
6064 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006065 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006066 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006067 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006068 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006069 this->SizeType = TargetInfo::UnsignedInt;
6070 this->PtrDiffType = TargetInfo::SignedInt;
6071 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006072 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006073 }
6074
Craig Topper3164f332014-03-11 03:39:26 +00006075 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006076 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006077 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006078 Builder.defineMacro("__le32__");
6079 Builder.defineMacro("__pnacl__");
6080 }
Craig Topper3164f332014-03-11 03:39:26 +00006081 void getTargetDefines(const LangOptions &Opts,
6082 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006083 getArchDefines(Opts, Builder);
6084 }
Craig Topper3164f332014-03-11 03:39:26 +00006085 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006086 return Feature == "pnacl";
6087 }
Craig Topper3164f332014-03-11 03:39:26 +00006088 void getTargetBuiltins(const Builtin::Info *&Records,
6089 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006090 }
Craig Topper3164f332014-03-11 03:39:26 +00006091 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006092 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006093 }
Craig Topper3164f332014-03-11 03:39:26 +00006094 void getGCCRegNames(const char * const *&Names,
6095 unsigned &NumNames) const override;
6096 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6097 unsigned &NumAliases) const override;
6098 bool validateAsmConstraint(const char *&Name,
6099 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006100 return false;
6101 }
6102
Craig Topper3164f332014-03-11 03:39:26 +00006103 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006104 return "";
6105 }
6106};
6107
6108void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6109 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006110 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006111 NumNames = 0;
6112}
6113
6114void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6115 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006116 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006117 NumAliases = 0;
6118}
6119} // end anonymous namespace.
6120
Guy Benyeib798fc92012-12-11 21:38:14 +00006121namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006122class Le64TargetInfo : public TargetInfo {
6123 static const Builtin::Info BuiltinInfo[];
6124
6125public:
6126 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6127 BigEndian = false;
6128 NoAsmVariants = true;
6129 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6130 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6131 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006132 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006133 }
6134
6135 void getTargetDefines(const LangOptions &Opts,
6136 MacroBuilder &Builder) const override {
6137 DefineStd(Builder, "unix", Opts);
6138 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6139 Builder.defineMacro("__ELF__");
6140 }
6141 void getTargetBuiltins(const Builtin::Info *&Records,
6142 unsigned &NumRecords) const override {
6143 Records = BuiltinInfo;
6144 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6145 }
6146 BuiltinVaListKind getBuiltinVaListKind() const override {
6147 return TargetInfo::PNaClABIBuiltinVaList;
6148 }
6149 const char *getClobbers() const override { return ""; }
6150 void getGCCRegNames(const char *const *&Names,
6151 unsigned &NumNames) const override {
6152 Names = nullptr;
6153 NumNames = 0;
6154 }
6155 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6156 unsigned &NumAliases) const override {
6157 Aliases = nullptr;
6158 NumAliases = 0;
6159 }
6160 bool validateAsmConstraint(const char *&Name,
6161 TargetInfo::ConstraintInfo &Info) const override {
6162 return false;
6163 }
6164
6165 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006166};
6167} // end anonymous namespace.
6168
6169const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6170#define BUILTIN(ID, TYPE, ATTRS) \
6171 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6172#include "clang/Basic/BuiltinsLe64.def"
6173};
6174
6175namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006176 static const unsigned SPIRAddrSpaceMap[] = {
6177 1, // opencl_global
6178 3, // opencl_local
6179 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006180 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006181 0, // cuda_device
6182 0, // cuda_constant
6183 0 // cuda_shared
6184 };
6185 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006186 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006187 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006188 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6189 "SPIR target must use unknown OS");
6190 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6191 "SPIR target must use unknown environment type");
6192 BigEndian = false;
6193 TLSSupported = false;
6194 LongWidth = LongAlign = 64;
6195 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006196 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006197 // Define available target features
6198 // These must be defined in sorted order!
6199 NoAsmVariants = true;
6200 }
Craig Topper3164f332014-03-11 03:39:26 +00006201 void getTargetDefines(const LangOptions &Opts,
6202 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006203 DefineStd(Builder, "SPIR", Opts);
6204 }
Craig Topper3164f332014-03-11 03:39:26 +00006205 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006206 return Feature == "spir";
6207 }
Craig Topper3164f332014-03-11 03:39:26 +00006208
6209 void getTargetBuiltins(const Builtin::Info *&Records,
6210 unsigned &NumRecords) const override {}
6211 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006212 return "";
6213 }
Craig Topper3164f332014-03-11 03:39:26 +00006214 void getGCCRegNames(const char * const *&Names,
6215 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006216 bool
6217 validateAsmConstraint(const char *&Name,
6218 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006219 return true;
6220 }
Craig Topper3164f332014-03-11 03:39:26 +00006221 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6222 unsigned &NumAliases) const override {}
6223 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006224 return TargetInfo::VoidPtrBuiltinVaList;
6225 }
6226 };
6227
6228
6229 class SPIR32TargetInfo : public SPIRTargetInfo {
6230 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006231 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006232 PointerWidth = PointerAlign = 32;
6233 SizeType = TargetInfo::UnsignedInt;
6234 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6235 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006236 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6237 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006238 }
Craig Topper3164f332014-03-11 03:39:26 +00006239 void getTargetDefines(const LangOptions &Opts,
6240 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006241 DefineStd(Builder, "SPIR32", Opts);
6242 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006243 };
6244
6245 class SPIR64TargetInfo : public SPIRTargetInfo {
6246 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006247 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006248 PointerWidth = PointerAlign = 64;
6249 SizeType = TargetInfo::UnsignedLong;
6250 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006251 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6252 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006253 }
Craig Topper3164f332014-03-11 03:39:26 +00006254 void getTargetDefines(const LangOptions &Opts,
6255 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006256 DefineStd(Builder, "SPIR64", Opts);
6257 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006258 };
6259}
6260
Robert Lytton0e076492013-08-13 09:43:10 +00006261namespace {
6262class XCoreTargetInfo : public TargetInfo {
6263 static const Builtin::Info BuiltinInfo[];
6264public:
6265 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6266 BigEndian = false;
6267 NoAsmVariants = true;
6268 LongLongAlign = 32;
6269 SuitableAlign = 32;
6270 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006271 SizeType = UnsignedInt;
6272 PtrDiffType = SignedInt;
6273 IntPtrType = SignedInt;
6274 WCharType = UnsignedChar;
6275 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006276 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006277 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00006278 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006279 }
Craig Topper3164f332014-03-11 03:39:26 +00006280 void getTargetDefines(const LangOptions &Opts,
6281 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006282 Builder.defineMacro("__XS1B__");
6283 }
Craig Topper3164f332014-03-11 03:39:26 +00006284 void getTargetBuiltins(const Builtin::Info *&Records,
6285 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006286 Records = BuiltinInfo;
6287 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6288 }
Craig Topper3164f332014-03-11 03:39:26 +00006289 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006290 return TargetInfo::VoidPtrBuiltinVaList;
6291 }
Craig Topper3164f332014-03-11 03:39:26 +00006292 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006293 return "";
6294 }
Craig Topper3164f332014-03-11 03:39:26 +00006295 void getGCCRegNames(const char * const *&Names,
6296 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006297 static const char * const GCCRegNames[] = {
6298 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6299 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6300 };
6301 Names = GCCRegNames;
6302 NumNames = llvm::array_lengthof(GCCRegNames);
6303 }
Craig Topper3164f332014-03-11 03:39:26 +00006304 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6305 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006306 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006307 NumAliases = 0;
6308 }
Craig Topper3164f332014-03-11 03:39:26 +00006309 bool validateAsmConstraint(const char *&Name,
6310 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006311 return false;
6312 }
Craig Topper3164f332014-03-11 03:39:26 +00006313 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006314 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6315 return (RegNo < 2)? RegNo : -1;
6316 }
Robert Lytton0e076492013-08-13 09:43:10 +00006317};
6318
6319const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6320#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6321#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6322 ALL_LANGUAGES },
6323#include "clang/Basic/BuiltinsXCore.def"
6324};
6325} // end anonymous namespace.
6326
Ivan Krasindd7403e2011-08-24 20:22:22 +00006327
Chris Lattner5ba61f02006-10-14 07:39:34 +00006328//===----------------------------------------------------------------------===//
6329// Driver code
6330//===----------------------------------------------------------------------===//
6331
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006333 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006334
Daniel Dunbar52322032009-08-18 05:47:58 +00006335 switch (Triple.getArch()) {
6336 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006337 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006338
Tim Northover2a0783d2014-05-30 14:14:07 +00006339 case llvm::Triple::xcore:
6340 return new XCoreTargetInfo(Triple);
6341
6342 case llvm::Triple::hexagon:
6343 return new HexagonTargetInfo(Triple);
6344
6345 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006346 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006347 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006348
6349 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006350 case llvm::Triple::FreeBSD:
6351 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006352 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006353 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006354 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006355 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006356 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006357 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006358 }
6359
Christian Pirker9b019ae2014-02-25 13:51:00 +00006360 case llvm::Triple::aarch64_be:
6361 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006362 case llvm::Triple::FreeBSD:
6363 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006364 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006365 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006366 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006367 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006368 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006369 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006370 }
6371
Daniel Dunbar52322032009-08-18 05:47:58 +00006372 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006373 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006374 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006375 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006376
Daniel Dunbar52322032009-08-18 05:47:58 +00006377 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006378 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006379 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006380 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006381 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006382 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006383 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006384 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006385 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006386 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006387 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006388 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006389 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006390 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006391 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006392 case llvm::Triple::Win32:
6393 switch (Triple.getEnvironment()) {
6394 default:
6395 return new ARMleTargetInfo(Triple);
6396 case llvm::Triple::Itanium:
6397 return new ItaniumWindowsARMleTargetInfo(Triple);
6398 case llvm::Triple::MSVC:
6399 return new MicrosoftARMleTargetInfo(Triple);
6400 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006401 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006402 return new ARMleTargetInfo(Triple);
6403 }
6404
6405 case llvm::Triple::armeb:
6406 case llvm::Triple::thumbeb:
6407 if (Triple.isOSDarwin())
6408 return new DarwinARMTargetInfo(Triple);
6409
6410 switch (os) {
6411 case llvm::Triple::Linux:
6412 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6413 case llvm::Triple::FreeBSD:
6414 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6415 case llvm::Triple::NetBSD:
6416 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6417 case llvm::Triple::OpenBSD:
6418 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6419 case llvm::Triple::Bitrig:
6420 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6421 case llvm::Triple::RTEMS:
6422 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6423 case llvm::Triple::NaCl:
6424 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6425 default:
6426 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006427 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006428
Daniel Dunbar52322032009-08-18 05:47:58 +00006429 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006430 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006431
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006432 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006433 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006434 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006435 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006436 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006437 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006438 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006439 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006440 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006441 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006442 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006443 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006444 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006445
6446 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006447 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006448 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006449 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006450 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006451 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006452 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006453 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006454 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006455 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006456 case llvm::Triple::NaCl:
6457 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006458 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006459 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006460 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006461
Akira Hatanakabef17452011-09-20 19:21:49 +00006462 case llvm::Triple::mips64:
6463 switch (os) {
6464 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006465 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006466 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006467 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006468 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006469 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006470 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006471 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006472 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006473 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006474 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006475 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006476 }
6477
6478 case llvm::Triple::mips64el:
6479 switch (os) {
6480 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006481 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006482 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006483 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006484 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006485 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006486 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006487 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006488 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006489 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006490 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006492 }
6493
Ivan Krasindd7403e2011-08-24 20:22:22 +00006494 case llvm::Triple::le32:
6495 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006496 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006497 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006498 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006499 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006500 }
6501
JF Bastien643817d2014-09-12 17:52:47 +00006502 case llvm::Triple::le64:
6503 return new Le64TargetInfo(Triple);
6504
Daniel Dunbar52322032009-08-18 05:47:58 +00006505 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006506 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006508 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006509 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006510 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006511 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006512 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006513 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006514 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006515 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006516 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006517 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006518 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006519 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006520 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006521 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006522
6523 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006524 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006525 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006526 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006527 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006528 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006529 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006530 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006531 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006532 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006533 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006534 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006535 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006537 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006538
Bill Schmidt778d3872013-07-26 01:36:11 +00006539 case llvm::Triple::ppc64le:
6540 switch (os) {
6541 case llvm::Triple::Linux:
6542 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6543 default:
6544 return new PPC64TargetInfo(Triple);
6545 }
6546
Peter Collingbournec947aae2012-05-20 23:28:41 +00006547 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006548 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006549 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006550 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006551
Eli Friedmand13b41e2012-10-12 23:32:00 +00006552 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006553 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006554
Daniel Dunbar52322032009-08-18 05:47:58 +00006555 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006556 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006557 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006558 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006559 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006560 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006561 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006562 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006563 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006564 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006565 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006566 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006567 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006568 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006569 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006570
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006571 case llvm::Triple::sparcv9:
6572 switch (os) {
6573 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006574 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006575 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006576 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006577 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006578 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006579 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006580 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006581 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006582 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006583 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006584 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006585 }
6586
Ulrich Weigand47445072013-05-06 16:26:41 +00006587 case llvm::Triple::systemz:
6588 switch (os) {
6589 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006590 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006591 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006592 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006593 }
6594
Eli Friedmana9c3d712009-08-19 20:47:07 +00006595 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006596 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006597
Daniel Dunbar52322032009-08-18 05:47:58 +00006598 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006599 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006600 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006601
Daniel Dunbar52322032009-08-18 05:47:58 +00006602 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006603 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006604 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006605 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006606 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006607 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006608 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006609 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006610 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006611 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006612 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006613 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006614 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006615 case llvm::Triple::KFreeBSD:
6616 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006617 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006618 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006619 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006620 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006621 case llvm::Triple::Win32: {
6622 switch (Triple.getEnvironment()) {
6623 default:
6624 return new X86_32TargetInfo(Triple);
6625 case llvm::Triple::Cygnus:
6626 return new CygwinX86_32TargetInfo(Triple);
6627 case llvm::Triple::GNU:
6628 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006629 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006630 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006631 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006632 }
6633 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006634 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006635 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006636 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006637 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006638 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006639 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006640 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006641 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006642 }
6643
6644 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006645 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006646 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006647
Daniel Dunbar52322032009-08-18 05:47:58 +00006648 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006649 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006651 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006652 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006653 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006654 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006655 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006656 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006657 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006658 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006659 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006660 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006661 case llvm::Triple::KFreeBSD:
6662 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006663 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006664 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006665 case llvm::Triple::Win32: {
6666 switch (Triple.getEnvironment()) {
6667 default:
6668 return new X86_64TargetInfo(Triple);
6669 case llvm::Triple::GNU:
6670 return new MinGWX86_64TargetInfo(Triple);
6671 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006672 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006673 }
6674 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006675 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006676 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006677 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006678 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006679 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006680
6681 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006682 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006683 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006684 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006686 }
6687 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006688 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006689 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006690 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006692 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006693 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006694}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006695
6696/// CreateTargetInfo - Return the target info object for the specified target
6697/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006698TargetInfo *
6699TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6700 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006701 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006702
6703 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006704 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006705 if (!Target) {
6706 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006707 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006708 }
Alp Toker80758082014-07-06 05:26:44 +00006709 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006710
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006711 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006712 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6713 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006714 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006715 }
6716
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006717 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006718 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6719 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006720 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006721 }
6722
Rafael Espindolaeb265472013-08-21 21:59:03 +00006723 // Set the fp math unit.
6724 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6725 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006726 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006727 }
6728
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006729 // Compute the default target features, we need the target to handle this
6730 // because features may have dependencies on one another.
6731 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006732 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006733
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006734 // Apply the user specified deltas.
6735 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6736 I < N; ++I) {
6737 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006738 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006739 bool Enabled = Name[0] == '+';
6740 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006741 }
6742
6743 // Add the features to the compile options.
6744 //
6745 // FIXME: If we are completely confident that we have the right set, we only
6746 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006747 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006748 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6749 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006750 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006751 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006752 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006753
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006754 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006755}