blob: b2178dc4a1fb2507a2840d0e6cc23bd86276f736 [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[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001380 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001381 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001382 BigEndian = false;
1383 TLSSupported = false;
1384 LongWidth = LongAlign = 64;
1385 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001386 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001387 // Define available target features
1388 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001389 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 }
Craig Topper3164f332014-03-11 03:39:26 +00001391 void getTargetDefines(const LangOptions &Opts,
1392 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001393 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001394 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 }
Craig Topper3164f332014-03-11 03:39:26 +00001396 void getTargetBuiltins(const Builtin::Info *&Records,
1397 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001398 Records = BuiltinInfo;
1399 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001400 }
Craig Topper3164f332014-03-11 03:39:26 +00001401 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001402 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001403 }
Craig Topper3164f332014-03-11 03:39:26 +00001404
1405 void getGCCRegNames(const char * const *&Names,
1406 unsigned &NumNames) const override;
1407 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1408 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001409 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001410 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001411 NumAliases = 0;
1412 }
Eric Christopher917e9522014-11-18 22:36:15 +00001413 bool
1414 validateAsmConstraint(const char *&Name,
1415 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001416 switch (*Name) {
1417 default: return false;
1418 case 'c':
1419 case 'h':
1420 case 'r':
1421 case 'l':
1422 case 'f':
1423 case 'd':
1424 Info.setAllowsRegister();
1425 return true;
1426 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001427 }
Craig Topper3164f332014-03-11 03:39:26 +00001428 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001429 // FIXME: Is this really right?
1430 return "";
1431 }
Craig Topper3164f332014-03-11 03:39:26 +00001432 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001433 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001434 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001435 }
Craig Topper3164f332014-03-11 03:39:26 +00001436 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001437 bool Valid = llvm::StringSwitch<bool>(Name)
1438 .Case("sm_20", true)
1439 .Case("sm_21", true)
1440 .Case("sm_30", true)
1441 .Case("sm_35", true)
1442 .Default(false);
1443
1444 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001445 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001446 };
1447
1448 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1449#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1450#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1451 ALL_LANGUAGES },
1452#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001453 };
1454
1455 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1456 "r0"
1457 };
1458
1459 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1460 unsigned &NumNames) const {
1461 Names = GCCRegNames;
1462 NumNames = llvm::array_lengthof(GCCRegNames);
1463 }
1464
1465 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1466 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001467 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001468 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001469 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1470 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001471 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001472 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001473 };
1474
1475 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1476 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001477 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001478 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001479 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1480 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001481 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001482 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001483 };
1484}
1485
1486namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001487
1488static const unsigned R600AddrSpaceMap[] = {
1489 1, // opencl_global
1490 3, // opencl_local
1491 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001492 // FIXME: generic has to be added to the target
1493 0, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001494 1, // cuda_device
1495 2, // cuda_constant
1496 3 // cuda_shared
1497};
1498
Tom Stellarda96344b2014-08-21 13:58:40 +00001499// If you edit the description strings, make sure you update
1500// getPointerWidthV().
1501
Tom Stellardc74b1e02013-03-04 17:40:53 +00001502static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001503 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1504 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001505
1506static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001507 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1508 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001509
1510static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001511 "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 +00001512 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1513 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001514
Eli Friedmand13b41e2012-10-12 23:32:00 +00001515class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001516 static const Builtin::Info BuiltinInfo[];
1517
Tom Stellardc74b1e02013-03-04 17:40:53 +00001518 /// \brief The GPU profiles supported by the R600 target.
1519 enum GPUKind {
1520 GK_NONE,
1521 GK_R600,
1522 GK_R600_DOUBLE_OPS,
1523 GK_R700,
1524 GK_R700_DOUBLE_OPS,
1525 GK_EVERGREEN,
1526 GK_EVERGREEN_DOUBLE_OPS,
1527 GK_NORTHERN_ISLANDS,
1528 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001529 GK_SOUTHERN_ISLANDS,
1530 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001531 } GPU;
1532
Eli Friedmand13b41e2012-10-12 23:32:00 +00001533public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001534 R600TargetInfo(const llvm::Triple &Triple)
1535 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001536 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001537 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001538 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001539 }
1540
Tom Stellarda96344b2014-08-21 13:58:40 +00001541 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1542 if (GPU <= GK_CAYMAN)
1543 return 32;
1544
1545 switch(AddrSpace) {
1546 default:
1547 return 64;
1548 case 0:
1549 case 3:
1550 case 5:
1551 return 32;
1552 }
1553 }
1554
Craig Topper3164f332014-03-11 03:39:26 +00001555 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001556 return "";
1557 }
1558
Craig Topper3164f332014-03-11 03:39:26 +00001559 void getGCCRegNames(const char * const *&Names,
1560 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001561 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001562 numNames = 0;
1563 }
1564
Craig Topper3164f332014-03-11 03:39:26 +00001565 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1566 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001567 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001568 NumAliases = 0;
1569 }
1570
Craig Topper3164f332014-03-11 03:39:26 +00001571 bool validateAsmConstraint(const char *&Name,
1572 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001573 return true;
1574 }
1575
Craig Topper3164f332014-03-11 03:39:26 +00001576 void getTargetBuiltins(const Builtin::Info *&Records,
1577 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001578 Records = BuiltinInfo;
1579 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001580 }
1581
Craig Topper3164f332014-03-11 03:39:26 +00001582 void getTargetDefines(const LangOptions &Opts,
1583 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001584 Builder.defineMacro("__R600__");
1585 }
1586
Craig Topper3164f332014-03-11 03:39:26 +00001587 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001588 return TargetInfo::CharPtrBuiltinVaList;
1589 }
1590
Craig Topper3164f332014-03-11 03:39:26 +00001591 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001592 GPU = llvm::StringSwitch<GPUKind>(Name)
1593 .Case("r600" , GK_R600)
1594 .Case("rv610", GK_R600)
1595 .Case("rv620", GK_R600)
1596 .Case("rv630", GK_R600)
1597 .Case("rv635", GK_R600)
1598 .Case("rs780", GK_R600)
1599 .Case("rs880", GK_R600)
1600 .Case("rv670", GK_R600_DOUBLE_OPS)
1601 .Case("rv710", GK_R700)
1602 .Case("rv730", GK_R700)
1603 .Case("rv740", GK_R700_DOUBLE_OPS)
1604 .Case("rv770", GK_R700_DOUBLE_OPS)
1605 .Case("palm", GK_EVERGREEN)
1606 .Case("cedar", GK_EVERGREEN)
1607 .Case("sumo", GK_EVERGREEN)
1608 .Case("sumo2", GK_EVERGREEN)
1609 .Case("redwood", GK_EVERGREEN)
1610 .Case("juniper", GK_EVERGREEN)
1611 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1612 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1613 .Case("barts", GK_NORTHERN_ISLANDS)
1614 .Case("turks", GK_NORTHERN_ISLANDS)
1615 .Case("caicos", GK_NORTHERN_ISLANDS)
1616 .Case("cayman", GK_CAYMAN)
1617 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001618 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001619 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1620 .Case("verde", GK_SOUTHERN_ISLANDS)
1621 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001622 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001623 .Case("bonaire", GK_SEA_ISLANDS)
1624 .Case("kabini", GK_SEA_ISLANDS)
1625 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001626 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001627 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001628 .Default(GK_NONE);
1629
1630 if (GPU == GK_NONE) {
1631 return false;
1632 }
1633
1634 // Set the correct data layout
1635 switch (GPU) {
1636 case GK_NONE:
1637 case GK_R600:
1638 case GK_R700:
1639 case GK_EVERGREEN:
1640 case GK_NORTHERN_ISLANDS:
1641 DescriptionString = DescriptionStringR600;
1642 break;
1643 case GK_R600_DOUBLE_OPS:
1644 case GK_R700_DOUBLE_OPS:
1645 case GK_EVERGREEN_DOUBLE_OPS:
1646 case GK_CAYMAN:
1647 DescriptionString = DescriptionStringR600DoubleOps;
1648 break;
1649 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001650 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001651 DescriptionString = DescriptionStringSI;
1652 break;
1653 }
1654
1655 return true;
1656 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001657};
1658
Matt Arsenault56f008d2014-06-24 20:45:01 +00001659const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1660#define BUILTIN(ID, TYPE, ATTRS) \
1661 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1662#include "clang/Basic/BuiltinsR600.def"
1663};
1664
Eli Friedmand13b41e2012-10-12 23:32:00 +00001665} // end anonymous namespace
1666
1667namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001668// Namespace for x86 abstract base class
1669const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001670#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001671#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001672 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001673#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001674};
Eli Friedmanb5366062008-05-20 14:21:01 +00001675
Nuno Lopescfca1f02009-12-23 17:49:57 +00001676static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001677 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1678 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001679 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001680 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1681 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1682 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001683 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001684 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1685 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001686};
1687
Eric Christophercdd36352011-06-21 00:05:20 +00001688const TargetInfo::AddlRegName AddlRegNames[] = {
1689 { { "al", "ah", "eax", "rax" }, 0 },
1690 { { "bl", "bh", "ebx", "rbx" }, 3 },
1691 { { "cl", "ch", "ecx", "rcx" }, 2 },
1692 { { "dl", "dh", "edx", "rdx" }, 1 },
1693 { { "esi", "rsi" }, 4 },
1694 { { "edi", "rdi" }, 5 },
1695 { { "esp", "rsp" }, 7 },
1696 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001697};
1698
1699// X86 target abstract base class; x86-32 and x86-64 are very close, so
1700// most of the implementation can be shared.
1701class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001702 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001703 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001704 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001705 enum MMX3DNowEnum {
1706 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1707 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001708 enum XOPEnum {
1709 NoXOP,
1710 SSE4A,
1711 FMA4,
1712 XOP
1713 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001714
Eric Christophere1ddaf92010-04-02 23:50:19 +00001715 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001716 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001717 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001718 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001719 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001720 bool HasBMI;
1721 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001722 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001723 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001724 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001725 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001726 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001727 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001728 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001729 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001730 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1731 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001732 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001733 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001734
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001735 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1736 ///
1737 /// Each enumeration represents a particular CPU supported by Clang. These
1738 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1739 enum CPUKind {
1740 CK_Generic,
1741
1742 /// \name i386
1743 /// i386-generation processors.
1744 //@{
1745 CK_i386,
1746 //@}
1747
1748 /// \name i486
1749 /// i486-generation processors.
1750 //@{
1751 CK_i486,
1752 CK_WinChipC6,
1753 CK_WinChip2,
1754 CK_C3,
1755 //@}
1756
1757 /// \name i586
1758 /// i586-generation processors, P5 microarchitecture based.
1759 //@{
1760 CK_i586,
1761 CK_Pentium,
1762 CK_PentiumMMX,
1763 //@}
1764
1765 /// \name i686
1766 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1767 //@{
1768 CK_i686,
1769 CK_PentiumPro,
1770 CK_Pentium2,
1771 CK_Pentium3,
1772 CK_Pentium3M,
1773 CK_PentiumM,
1774 CK_C3_2,
1775
1776 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1777 /// Clang however has some logic to suport this.
1778 // FIXME: Warn, deprecate, and potentially remove this.
1779 CK_Yonah,
1780 //@}
1781
1782 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001783 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001784 //@{
1785 CK_Pentium4,
1786 CK_Pentium4M,
1787 CK_Prescott,
1788 CK_Nocona,
1789 //@}
1790
1791 /// \name Core
1792 /// Core microarchitecture based processors.
1793 //@{
1794 CK_Core2,
1795
1796 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1797 /// codename which GCC no longer accepts as an option to -march, but Clang
1798 /// has some logic for recognizing it.
1799 // FIXME: Warn, deprecate, and potentially remove this.
1800 CK_Penryn,
1801 //@}
1802
1803 /// \name Atom
1804 /// Atom processors
1805 //@{
1806 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001807 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001808 //@}
1809
1810 /// \name Nehalem
1811 /// Nehalem microarchitecture based processors.
1812 //@{
1813 CK_Corei7,
1814 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001815 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001816 CK_CoreAVX2,
Robert Khasanov50e6f582014-09-19 09:53:48 +00001817 CK_Broadwell,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001818 //@}
1819
Craig Topper449314e2013-08-20 07:09:39 +00001820 /// \name Knights Landing
1821 /// Knights Landing processor.
1822 CK_KNL,
1823
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001824 /// \name Skylake Server
1825 /// Skylake server processor.
1826 CK_SKX,
1827
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001828 /// \name K6
1829 /// K6 architecture processors.
1830 //@{
1831 CK_K6,
1832 CK_K6_2,
1833 CK_K6_3,
1834 //@}
1835
1836 /// \name K7
1837 /// K7 architecture processors.
1838 //@{
1839 CK_Athlon,
1840 CK_AthlonThunderbird,
1841 CK_Athlon4,
1842 CK_AthlonXP,
1843 CK_AthlonMP,
1844 //@}
1845
1846 /// \name K8
1847 /// K8 architecture processors.
1848 //@{
1849 CK_Athlon64,
1850 CK_Athlon64SSE3,
1851 CK_AthlonFX,
1852 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001853 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001854 CK_Opteron,
1855 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001856 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001857 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001858
Benjamin Kramer569f2152012-01-10 11:50:18 +00001859 /// \name Bobcat
1860 /// Bobcat architecture processors.
1861 //@{
1862 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001863 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001864 //@}
1865
1866 /// \name Bulldozer
1867 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001868 //@{
1869 CK_BDVER1,
1870 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001871 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001872 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001873 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001874
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001875 /// This specification is deprecated and will be removed in the future.
1876 /// Users should prefer \see CK_K8.
1877 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001878 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001879 CK_x86_64,
1880 //@}
1881
1882 /// \name Geode
1883 /// Geode processors.
1884 //@{
1885 CK_Geode
1886 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001887 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001888
Rafael Espindolaeb265472013-08-21 21:59:03 +00001889 enum FPMathKind {
1890 FP_Default,
1891 FP_SSE,
1892 FP_387
1893 } FPMath;
1894
Eli Friedman3fd920a2008-08-20 02:34:37 +00001895public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001896 X86TargetInfo(const llvm::Triple &Triple)
1897 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001898 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001899 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1900 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1901 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1902 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1903 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1904 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001905 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001906 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001907 }
Craig Topper3164f332014-03-11 03:39:26 +00001908 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001909 // X87 evaluates with 80 bits "long double" precision.
1910 return SSELevel == NoSSE ? 2 : 0;
1911 }
Craig Topper3164f332014-03-11 03:39:26 +00001912 void getTargetBuiltins(const Builtin::Info *&Records,
1913 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001914 Records = BuiltinInfo;
1915 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001916 }
Craig Topper3164f332014-03-11 03:39:26 +00001917 void getGCCRegNames(const char * const *&Names,
1918 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001919 Names = GCCRegNames;
1920 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001921 }
Craig Topper3164f332014-03-11 03:39:26 +00001922 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1923 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001924 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001925 NumAliases = 0;
1926 }
Craig Topper3164f332014-03-11 03:39:26 +00001927 void getGCCAddlRegNames(const AddlRegName *&Names,
1928 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001929 Names = AddlRegNames;
1930 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001931 }
Craig Topper3164f332014-03-11 03:39:26 +00001932 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00001933 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001934
Akira Hatanaka974131e2014-09-18 18:17:18 +00001935 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1936
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001937 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1938
Akira Hatanaka974131e2014-09-18 18:17:18 +00001939 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1940
Craig Topper3164f332014-03-11 03:39:26 +00001941 std::string convertConstraint(const char *&Constraint) const override;
1942 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001943 return "~{dirflag},~{fpsr},~{flags}";
1944 }
Craig Topper3164f332014-03-11 03:39:26 +00001945 void getTargetDefines(const LangOptions &Opts,
1946 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001947 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1948 bool Enabled);
1949 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1950 bool Enabled);
1951 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1952 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001953 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1954 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001955 setFeatureEnabledImpl(Features, Name, Enabled);
1956 }
1957 // This exists purely to cut down on the number of virtual calls in
1958 // getDefaultFeatures which calls this repeatedly.
1959 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1960 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001961 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1962 bool hasFeature(StringRef Feature) const override;
1963 bool handleTargetFeatures(std::vector<std::string> &Features,
1964 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001965 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001966 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001967 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001968 else if (getTriple().getArch() == llvm::Triple::x86 &&
1969 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001970 return "no-mmx";
1971 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001972 }
Craig Topper3164f332014-03-11 03:39:26 +00001973 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001974 CPU = llvm::StringSwitch<CPUKind>(Name)
1975 .Case("i386", CK_i386)
1976 .Case("i486", CK_i486)
1977 .Case("winchip-c6", CK_WinChipC6)
1978 .Case("winchip2", CK_WinChip2)
1979 .Case("c3", CK_C3)
1980 .Case("i586", CK_i586)
1981 .Case("pentium", CK_Pentium)
1982 .Case("pentium-mmx", CK_PentiumMMX)
1983 .Case("i686", CK_i686)
1984 .Case("pentiumpro", CK_PentiumPro)
1985 .Case("pentium2", CK_Pentium2)
1986 .Case("pentium3", CK_Pentium3)
1987 .Case("pentium3m", CK_Pentium3M)
1988 .Case("pentium-m", CK_PentiumM)
1989 .Case("c3-2", CK_C3_2)
1990 .Case("yonah", CK_Yonah)
1991 .Case("pentium4", CK_Pentium4)
1992 .Case("pentium4m", CK_Pentium4M)
1993 .Case("prescott", CK_Prescott)
1994 .Case("nocona", CK_Nocona)
1995 .Case("core2", CK_Core2)
1996 .Case("penryn", CK_Penryn)
1997 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001998 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001999 .Case("corei7", CK_Corei7)
2000 .Case("corei7-avx", CK_Corei7AVX)
2001 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00002002 .Case("core-avx2", CK_CoreAVX2)
Robert Khasanov50e6f582014-09-19 09:53:48 +00002003 .Case("broadwell", CK_Broadwell)
Craig Topper449314e2013-08-20 07:09:39 +00002004 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002005 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00002006 .Case("k6", CK_K6)
2007 .Case("k6-2", CK_K6_2)
2008 .Case("k6-3", CK_K6_3)
2009 .Case("athlon", CK_Athlon)
2010 .Case("athlon-tbird", CK_AthlonThunderbird)
2011 .Case("athlon-4", CK_Athlon4)
2012 .Case("athlon-xp", CK_AthlonXP)
2013 .Case("athlon-mp", CK_AthlonMP)
2014 .Case("athlon64", CK_Athlon64)
2015 .Case("athlon64-sse3", CK_Athlon64SSE3)
2016 .Case("athlon-fx", CK_AthlonFX)
2017 .Case("k8", CK_K8)
2018 .Case("k8-sse3", CK_K8SSE3)
2019 .Case("opteron", CK_Opteron)
2020 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002021 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002022 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002023 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002024 .Case("bdver1", CK_BDVER1)
2025 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002026 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002027 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002028 .Case("x86-64", CK_x86_64)
2029 .Case("geode", CK_Geode)
2030 .Default(CK_Generic);
2031
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002032 // Perform any per-CPU checks necessary to determine if this CPU is
2033 // acceptable.
2034 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2035 // invalid without explaining *why*.
2036 switch (CPU) {
2037 case CK_Generic:
2038 // No processor selected!
2039 return false;
2040
2041 case CK_i386:
2042 case CK_i486:
2043 case CK_WinChipC6:
2044 case CK_WinChip2:
2045 case CK_C3:
2046 case CK_i586:
2047 case CK_Pentium:
2048 case CK_PentiumMMX:
2049 case CK_i686:
2050 case CK_PentiumPro:
2051 case CK_Pentium2:
2052 case CK_Pentium3:
2053 case CK_Pentium3M:
2054 case CK_PentiumM:
2055 case CK_Yonah:
2056 case CK_C3_2:
2057 case CK_Pentium4:
2058 case CK_Pentium4M:
2059 case CK_Prescott:
2060 case CK_K6:
2061 case CK_K6_2:
2062 case CK_K6_3:
2063 case CK_Athlon:
2064 case CK_AthlonThunderbird:
2065 case CK_Athlon4:
2066 case CK_AthlonXP:
2067 case CK_AthlonMP:
2068 case CK_Geode:
2069 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002070 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002071 return false;
2072
2073 // Fallthrough
2074 case CK_Nocona:
2075 case CK_Core2:
2076 case CK_Penryn:
2077 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002078 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002079 case CK_Corei7:
2080 case CK_Corei7AVX:
2081 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002082 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002083 case CK_Broadwell:
Craig Topper449314e2013-08-20 07:09:39 +00002084 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002085 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002086 case CK_Athlon64:
2087 case CK_Athlon64SSE3:
2088 case CK_AthlonFX:
2089 case CK_K8:
2090 case CK_K8SSE3:
2091 case CK_Opteron:
2092 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002093 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002094 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002095 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002096 case CK_BDVER1:
2097 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002098 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002099 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002100 case CK_x86_64:
2101 return true;
2102 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002103 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002104 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002105
Craig Topper3164f332014-03-11 03:39:26 +00002106 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002107
Craig Topper3164f332014-03-11 03:39:26 +00002108 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002109 // We accept all non-ARM calling conventions
2110 return (CC == CC_X86ThisCall ||
2111 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002112 CC == CC_X86StdCall ||
2113 CC == CC_X86VectorCall ||
2114 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002115 CC == CC_X86Pascal ||
2116 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002117 }
2118
Craig Topper3164f332014-03-11 03:39:26 +00002119 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002120 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002121 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002122};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002123
Rafael Espindolaeb265472013-08-21 21:59:03 +00002124bool X86TargetInfo::setFPMath(StringRef Name) {
2125 if (Name == "387") {
2126 FPMath = FP_387;
2127 return true;
2128 }
2129 if (Name == "sse") {
2130 FPMath = FP_SSE;
2131 return true;
2132 }
2133 return false;
2134}
2135
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002136void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002137 // FIXME: This *really* should not be here.
2138
2139 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002140 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002141 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002142
Chandler Carruth212334f2011-09-28 08:55:37 +00002143 switch (CPU) {
2144 case CK_Generic:
2145 case CK_i386:
2146 case CK_i486:
2147 case CK_i586:
2148 case CK_Pentium:
2149 case CK_i686:
2150 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002151 break;
2152 case CK_PentiumMMX:
2153 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002154 case CK_K6:
2155 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002156 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002157 break;
2158 case CK_Pentium3:
2159 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002160 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002161 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002162 break;
2163 case CK_PentiumM:
2164 case CK_Pentium4:
2165 case CK_Pentium4M:
2166 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002167 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002168 break;
2169 case CK_Yonah:
2170 case CK_Prescott:
2171 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002172 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002173 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002174 break;
2175 case CK_Core2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002176 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002178 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002179 break;
2180 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002181 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002182 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002183 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002184 case CK_SKX:
2185 setFeatureEnabledImpl(Features, "avx512f", true);
2186 setFeatureEnabledImpl(Features, "avx512cd", true);
2187 setFeatureEnabledImpl(Features, "avx512dq", true);
2188 setFeatureEnabledImpl(Features, "avx512bw", true);
2189 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002190 // FALLTHROUGH
2191 case CK_Broadwell:
2192 setFeatureEnabledImpl(Features, "rdseed", true);
2193 setFeatureEnabledImpl(Features, "adx", true);
2194 // FALLTHROUGH
2195 case CK_CoreAVX2:
2196 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002197 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002198 setFeatureEnabledImpl(Features, "bmi", true);
2199 setFeatureEnabledImpl(Features, "bmi2", true);
2200 setFeatureEnabledImpl(Features, "rtm", true);
2201 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002202 // FALLTHROUGH
2203 case CK_CoreAVXi:
2204 setFeatureEnabledImpl(Features, "rdrnd", true);
2205 setFeatureEnabledImpl(Features, "f16c", true);
2206 setFeatureEnabledImpl(Features, "fsgsbase", true);
2207 // FALLTHROUGH
2208 case CK_Corei7AVX:
2209 setFeatureEnabledImpl(Features, "avx", true);
2210 // FALLTHROUGH
2211 case CK_Silvermont:
2212 setFeatureEnabledImpl(Features, "aes", true);
2213 setFeatureEnabledImpl(Features, "pclmul", true);
2214 // FALLTHROUGH
2215 case CK_Corei7:
2216 setFeatureEnabledImpl(Features, "sse4.2", true);
2217 setFeatureEnabledImpl(Features, "cx16", true);
2218 break;
2219 case CK_KNL:
2220 setFeatureEnabledImpl(Features, "avx512f", true);
2221 setFeatureEnabledImpl(Features, "avx512cd", true);
2222 setFeatureEnabledImpl(Features, "avx512er", true);
2223 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002224 setFeatureEnabledImpl(Features, "rdseed", true);
2225 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002226 setFeatureEnabledImpl(Features, "lzcnt", true);
2227 setFeatureEnabledImpl(Features, "bmi", true);
2228 setFeatureEnabledImpl(Features, "bmi2", true);
2229 setFeatureEnabledImpl(Features, "rtm", true);
2230 setFeatureEnabledImpl(Features, "fma", true);
2231 setFeatureEnabledImpl(Features, "rdrnd", true);
2232 setFeatureEnabledImpl(Features, "f16c", true);
2233 setFeatureEnabledImpl(Features, "fsgsbase", true);
2234 setFeatureEnabledImpl(Features, "aes", true);
2235 setFeatureEnabledImpl(Features, "pclmul", true);
2236 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002237 break;
2238 case CK_K6_2:
2239 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002240 case CK_WinChip2:
2241 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002242 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002243 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002244 case CK_Athlon:
2245 case CK_AthlonThunderbird:
2246 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002247 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002248 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002249 case CK_Athlon4:
2250 case CK_AthlonXP:
2251 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002252 setFeatureEnabledImpl(Features, "sse", true);
2253 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002254 break;
2255 case CK_K8:
2256 case CK_Opteron:
2257 case CK_Athlon64:
2258 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002259 setFeatureEnabledImpl(Features, "sse2", true);
2260 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002261 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002262 case CK_AMDFAM10:
2263 setFeatureEnabledImpl(Features, "sse4a", true);
2264 setFeatureEnabledImpl(Features, "lzcnt", true);
2265 setFeatureEnabledImpl(Features, "popcnt", true);
2266 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002267 case CK_K8SSE3:
2268 case CK_OpteronSSE3:
2269 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002270 setFeatureEnabledImpl(Features, "sse3", true);
2271 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002272 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002273 case CK_BTVER2:
2274 setFeatureEnabledImpl(Features, "avx", true);
2275 setFeatureEnabledImpl(Features, "aes", true);
2276 setFeatureEnabledImpl(Features, "pclmul", true);
2277 setFeatureEnabledImpl(Features, "bmi", true);
2278 setFeatureEnabledImpl(Features, "f16c", true);
2279 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002280 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002281 setFeatureEnabledImpl(Features, "ssse3", true);
2282 setFeatureEnabledImpl(Features, "sse4a", true);
2283 setFeatureEnabledImpl(Features, "lzcnt", true);
2284 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002285 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002286 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002287 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002288 case CK_BDVER4:
2289 setFeatureEnabledImpl(Features, "avx2", true);
2290 setFeatureEnabledImpl(Features, "bmi2", true);
2291 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002292 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002293 setFeatureEnabledImpl(Features, "fsgsbase", true);
2294 // FALLTHROUGH
2295 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002296 setFeatureEnabledImpl(Features, "bmi", true);
2297 setFeatureEnabledImpl(Features, "fma", true);
2298 setFeatureEnabledImpl(Features, "f16c", true);
2299 setFeatureEnabledImpl(Features, "tbm", true);
2300 // FALLTHROUGH
2301 case CK_BDVER1:
2302 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002303 setFeatureEnabledImpl(Features, "xop", true);
2304 setFeatureEnabledImpl(Features, "lzcnt", true);
2305 setFeatureEnabledImpl(Features, "aes", true);
2306 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002307 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002308 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002309 break;
Eli Friedman33465822011-07-08 23:31:17 +00002310 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002311}
2312
Rafael Espindolae62e2792013-08-20 13:44:29 +00002313void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002314 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002315 if (Enabled) {
2316 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002317 case AVX512F:
2318 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002319 case AVX2:
2320 Features["avx2"] = true;
2321 case AVX:
2322 Features["avx"] = true;
2323 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002324 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002325 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002326 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 case SSSE3:
2328 Features["ssse3"] = true;
2329 case SSE3:
2330 Features["sse3"] = true;
2331 case SSE2:
2332 Features["sse2"] = true;
2333 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002334 Features["sse"] = true;
2335 case NoSSE:
2336 break;
2337 }
2338 return;
2339 }
2340
2341 switch (Level) {
2342 case NoSSE:
2343 case SSE1:
2344 Features["sse"] = false;
2345 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002346 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2347 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002348 case SSE3:
2349 Features["sse3"] = false;
2350 setXOPLevel(Features, NoXOP, false);
2351 case SSSE3:
2352 Features["ssse3"] = false;
2353 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002354 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002355 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002356 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002357 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002358 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002359 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002360 case AVX2:
2361 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002362 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002363 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2364 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2365 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002366 }
2367}
2368
2369void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002370 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002371 if (Enabled) {
2372 switch (Level) {
2373 case AMD3DNowAthlon:
2374 Features["3dnowa"] = true;
2375 case AMD3DNow:
2376 Features["3dnow"] = true;
2377 case MMX:
2378 Features["mmx"] = true;
2379 case NoMMX3DNow:
2380 break;
2381 }
2382 return;
2383 }
2384
2385 switch (Level) {
2386 case NoMMX3DNow:
2387 case MMX:
2388 Features["mmx"] = false;
2389 case AMD3DNow:
2390 Features["3dnow"] = false;
2391 case AMD3DNowAthlon:
2392 Features["3dnowa"] = false;
2393 }
2394}
2395
2396void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002397 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002398 if (Enabled) {
2399 switch (Level) {
2400 case XOP:
2401 Features["xop"] = true;
2402 case FMA4:
2403 Features["fma4"] = true;
2404 setSSELevel(Features, AVX, true);
2405 case SSE4A:
2406 Features["sse4a"] = true;
2407 setSSELevel(Features, SSE3, true);
2408 case NoXOP:
2409 break;
2410 }
2411 return;
2412 }
2413
2414 switch (Level) {
2415 case NoXOP:
2416 case SSE4A:
2417 Features["sse4a"] = false;
2418 case FMA4:
2419 Features["fma4"] = false;
2420 case XOP:
2421 Features["xop"] = false;
2422 }
2423}
2424
Craig Topper86d79ef2013-09-17 04:51:29 +00002425void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2426 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002427 // FIXME: This *really* should not be here. We need some way of translating
2428 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002429 if (Name == "sse4")
2430 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002431
Rafael Espindolae62e2792013-08-20 13:44:29 +00002432 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002433
Craig Topper29561122013-09-19 01:13:07 +00002434 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002435 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002436 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002438 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002439 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002440 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002441 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002442 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002443 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002444 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002445 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002446 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002447 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002448 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002449 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002450 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002451 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002452 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002453 if (Enabled)
2454 setSSELevel(Features, SSE2, Enabled);
2455 } else if (Name == "pclmul") {
2456 if (Enabled)
2457 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002458 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002459 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002460 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002461 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002462 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002463 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002464 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2465 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002466 if (Enabled)
2467 setSSELevel(Features, AVX512F, Enabled);
2468 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002469 if (Enabled)
2470 setSSELevel(Features, AVX, Enabled);
2471 } else if (Name == "fma4") {
2472 setXOPLevel(Features, FMA4, Enabled);
2473 } else if (Name == "xop") {
2474 setXOPLevel(Features, XOP, Enabled);
2475 } else if (Name == "sse4a") {
2476 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002477 } else if (Name == "f16c") {
2478 if (Enabled)
2479 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002480 } else if (Name == "sha") {
2481 if (Enabled)
2482 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002483 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002484}
2485
Eric Christopher3ff21b32013-10-16 21:26:26 +00002486/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002487/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002488bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002489 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002490 // Remember the maximum enabled sselevel.
2491 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2492 // Ignore disabled features.
2493 if (Features[i][0] == '-')
2494 continue;
2495
Benjamin Kramer27402c62012-03-05 15:10:44 +00002496 StringRef Feature = StringRef(Features[i]).substr(1);
2497
2498 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002499 HasAES = true;
2500 continue;
2501 }
2502
Craig Topper3f122a72012-05-31 05:18:48 +00002503 if (Feature == "pclmul") {
2504 HasPCLMUL = true;
2505 continue;
2506 }
2507
Benjamin Kramer27402c62012-03-05 15:10:44 +00002508 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002509 HasLZCNT = true;
2510 continue;
2511 }
2512
Rafael Espindola89049822013-08-23 20:21:37 +00002513 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002514 HasRDRND = true;
2515 continue;
2516 }
2517
Craig Topper8c7f2512014-11-03 06:51:41 +00002518 if (Feature == "fsgsbase") {
2519 HasFSGSBASE = true;
2520 continue;
2521 }
2522
Benjamin Kramer27402c62012-03-05 15:10:44 +00002523 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002524 HasBMI = true;
2525 continue;
2526 }
2527
Benjamin Kramer27402c62012-03-05 15:10:44 +00002528 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002529 HasBMI2 = true;
2530 continue;
2531 }
2532
Benjamin Kramer27402c62012-03-05 15:10:44 +00002533 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002534 HasPOPCNT = true;
2535 continue;
2536 }
2537
Michael Liao625a8752012-11-10 05:17:46 +00002538 if (Feature == "rtm") {
2539 HasRTM = true;
2540 continue;
2541 }
2542
Michael Liao74f4eaf2013-03-26 17:52:08 +00002543 if (Feature == "prfchw") {
2544 HasPRFCHW = true;
2545 continue;
2546 }
2547
Michael Liaoffaae352013-03-29 05:17:55 +00002548 if (Feature == "rdseed") {
2549 HasRDSEED = true;
2550 continue;
2551 }
2552
Robert Khasanov50e6f582014-09-19 09:53:48 +00002553 if (Feature == "adx") {
2554 HasADX = true;
2555 continue;
2556 }
2557
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002558 if (Feature == "tbm") {
2559 HasTBM = true;
2560 continue;
2561 }
2562
Craig Topperbba778b2012-06-03 21:46:30 +00002563 if (Feature == "fma") {
2564 HasFMA = true;
2565 continue;
2566 }
2567
Manman Rena45358c2012-10-11 00:59:55 +00002568 if (Feature == "f16c") {
2569 HasF16C = true;
2570 continue;
2571 }
2572
Craig Topper679b53a2013-08-21 05:29:10 +00002573 if (Feature == "avx512cd") {
2574 HasAVX512CD = true;
2575 continue;
2576 }
2577
2578 if (Feature == "avx512er") {
2579 HasAVX512ER = true;
2580 continue;
2581 }
2582
2583 if (Feature == "avx512pf") {
2584 HasAVX512PF = true;
2585 continue;
2586 }
2587
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002588 if (Feature == "avx512dq") {
2589 HasAVX512DQ = true;
2590 continue;
2591 }
2592
2593 if (Feature == "avx512bw") {
2594 HasAVX512BW = true;
2595 continue;
2596 }
2597
2598 if (Feature == "avx512vl") {
2599 HasAVX512VL = true;
2600 continue;
2601 }
2602
Ben Langmuir58078d02013-09-19 13:22:04 +00002603 if (Feature == "sha") {
2604 HasSHA = true;
2605 continue;
2606 }
2607
Nick Lewycky50e8f482013-10-05 20:14:27 +00002608 if (Feature == "cx16") {
2609 HasCX16 = true;
2610 continue;
2611 }
2612
Daniel Dunbar979586e2009-11-11 09:38:56 +00002613 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002614 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002615 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002616 .Case("avx2", AVX2)
2617 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002618 .Case("sse4.2", SSE42)
2619 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002620 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002621 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002622 .Case("sse2", SSE2)
2623 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002624 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002625 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002626
Eli Friedman33465822011-07-08 23:31:17 +00002627 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002628 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002629 .Case("3dnowa", AMD3DNowAthlon)
2630 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002631 .Case("mmx", MMX)
2632 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002633 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002634
2635 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2636 .Case("xop", XOP)
2637 .Case("fma4", FMA4)
2638 .Case("sse4a", SSE4A)
2639 .Default(NoXOP);
2640 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002641 }
Eli Friedman33465822011-07-08 23:31:17 +00002642
Craig Topper7481d8a2013-09-10 06:55:47 +00002643 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2644 // Can't do this earlier because we need to be able to explicitly enable
2645 // popcnt and still disable sse4.2.
2646 if (!HasPOPCNT && SSELevel >= SSE42 &&
2647 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2648 HasPOPCNT = true;
2649 Features.push_back("+popcnt");
2650 }
2651
Yunzhong Gao61089362013-10-16 19:07:02 +00002652 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2653 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2654 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2655 HasPRFCHW = true;
2656 Features.push_back("+prfchw");
2657 }
2658
Rafael Espindolaeb265472013-08-21 21:59:03 +00002659 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2660 // matches the selected sse level.
2661 if (FPMath == FP_SSE && SSELevel < SSE1) {
2662 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2663 return false;
2664 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2665 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2666 return false;
2667 }
2668
Eli Friedman33465822011-07-08 23:31:17 +00002669 // Don't tell the backend if we're turning off mmx; it will end up disabling
2670 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002671 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2672 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002673 std::vector<std::string>::iterator it;
2674 it = std::find(Features.begin(), Features.end(), "-mmx");
2675 if (it != Features.end())
2676 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002677 else if (SSELevel > NoSSE)
2678 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002679 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002680}
Chris Lattnerecd49032009-03-02 22:27:17 +00002681
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002682/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2683/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002684void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002685 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002686 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002687 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002688 Builder.defineMacro("__amd64__");
2689 Builder.defineMacro("__amd64");
2690 Builder.defineMacro("__x86_64");
2691 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002692 if (getTriple().getArchName() == "x86_64h") {
2693 Builder.defineMacro("__x86_64h");
2694 Builder.defineMacro("__x86_64h__");
2695 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002696 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002697 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002698 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002699
Chris Lattnerecd49032009-03-02 22:27:17 +00002700 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002701 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2702 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002703 switch (CPU) {
2704 case CK_Generic:
2705 break;
2706 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002707 // The rest are coming from the i386 define above.
2708 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002709 break;
2710 case CK_i486:
2711 case CK_WinChipC6:
2712 case CK_WinChip2:
2713 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002714 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002715 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002716 case CK_PentiumMMX:
2717 Builder.defineMacro("__pentium_mmx__");
2718 Builder.defineMacro("__tune_pentium_mmx__");
2719 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002720 case CK_i586:
2721 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002722 defineCPUMacros(Builder, "i586");
2723 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002724 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002725 case CK_Pentium3:
2726 case CK_Pentium3M:
2727 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002728 Builder.defineMacro("__tune_pentium3__");
2729 // Fallthrough
2730 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002731 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002732 Builder.defineMacro("__tune_pentium2__");
2733 // Fallthrough
2734 case CK_PentiumPro:
2735 Builder.defineMacro("__tune_i686__");
2736 Builder.defineMacro("__tune_pentiumpro__");
2737 // Fallthrough
2738 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002739 Builder.defineMacro("__i686");
2740 Builder.defineMacro("__i686__");
2741 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2742 Builder.defineMacro("__pentiumpro");
2743 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002744 break;
2745 case CK_Pentium4:
2746 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002747 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002748 break;
2749 case CK_Yonah:
2750 case CK_Prescott:
2751 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002752 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002753 break;
2754 case CK_Core2:
2755 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002756 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002757 break;
2758 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002759 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002760 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002761 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002762 defineCPUMacros(Builder, "slm");
2763 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002764 case CK_Corei7:
2765 case CK_Corei7AVX:
2766 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002767 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002768 case CK_Broadwell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002769 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002770 break;
Craig Topper449314e2013-08-20 07:09:39 +00002771 case CK_KNL:
2772 defineCPUMacros(Builder, "knl");
2773 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002774 case CK_SKX:
2775 defineCPUMacros(Builder, "skx");
2776 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002777 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002778 Builder.defineMacro("__k6_2__");
2779 Builder.defineMacro("__tune_k6_2__");
2780 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002781 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002782 if (CPU != CK_K6_2) { // In case of fallthrough
2783 // FIXME: GCC may be enabling these in cases where some other k6
2784 // architecture is specified but -m3dnow is explicitly provided. The
2785 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002786 Builder.defineMacro("__k6_3__");
2787 Builder.defineMacro("__tune_k6_3__");
2788 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002789 // Fallthrough
2790 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002791 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002792 break;
2793 case CK_Athlon:
2794 case CK_AthlonThunderbird:
2795 case CK_Athlon4:
2796 case CK_AthlonXP:
2797 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002798 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002799 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002800 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002801 Builder.defineMacro("__tune_athlon_sse__");
2802 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002803 break;
2804 case CK_K8:
2805 case CK_K8SSE3:
2806 case CK_x86_64:
2807 case CK_Opteron:
2808 case CK_OpteronSSE3:
2809 case CK_Athlon64:
2810 case CK_Athlon64SSE3:
2811 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002812 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002813 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002814 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002815 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002816 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002817 case CK_BTVER1:
2818 defineCPUMacros(Builder, "btver1");
2819 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002820 case CK_BTVER2:
2821 defineCPUMacros(Builder, "btver2");
2822 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002823 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002824 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002825 break;
2826 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002827 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002828 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002829 case CK_BDVER3:
2830 defineCPUMacros(Builder, "bdver3");
2831 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002832 case CK_BDVER4:
2833 defineCPUMacros(Builder, "bdver4");
2834 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002835 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002836 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002837 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002838 }
Chris Lattner96e43572009-03-02 22:40:39 +00002839
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002840 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002841 Builder.defineMacro("__REGISTER_PREFIX__", "");
2842
Chris Lattner6df41af2009-04-19 17:32:33 +00002843 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2844 // functions in glibc header files that use FP Stack inline asm which the
2845 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002846 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002847
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002848 if (HasAES)
2849 Builder.defineMacro("__AES__");
2850
Craig Topper3f122a72012-05-31 05:18:48 +00002851 if (HasPCLMUL)
2852 Builder.defineMacro("__PCLMUL__");
2853
Craig Topper22967d42011-12-25 05:06:45 +00002854 if (HasLZCNT)
2855 Builder.defineMacro("__LZCNT__");
2856
Benjamin Kramer1e250392012-07-07 09:39:18 +00002857 if (HasRDRND)
2858 Builder.defineMacro("__RDRND__");
2859
Craig Topper8c7f2512014-11-03 06:51:41 +00002860 if (HasFSGSBASE)
2861 Builder.defineMacro("__FSGSBASE__");
2862
Craig Topper22967d42011-12-25 05:06:45 +00002863 if (HasBMI)
2864 Builder.defineMacro("__BMI__");
2865
2866 if (HasBMI2)
2867 Builder.defineMacro("__BMI2__");
2868
Craig Topper1de83482011-12-29 16:10:46 +00002869 if (HasPOPCNT)
2870 Builder.defineMacro("__POPCNT__");
2871
Michael Liao625a8752012-11-10 05:17:46 +00002872 if (HasRTM)
2873 Builder.defineMacro("__RTM__");
2874
Michael Liao74f4eaf2013-03-26 17:52:08 +00002875 if (HasPRFCHW)
2876 Builder.defineMacro("__PRFCHW__");
2877
Michael Liaoffaae352013-03-29 05:17:55 +00002878 if (HasRDSEED)
2879 Builder.defineMacro("__RDSEED__");
2880
Robert Khasanov50e6f582014-09-19 09:53:48 +00002881 if (HasADX)
2882 Builder.defineMacro("__ADX__");
2883
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002884 if (HasTBM)
2885 Builder.defineMacro("__TBM__");
2886
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 switch (XOPLevel) {
2888 case XOP:
2889 Builder.defineMacro("__XOP__");
2890 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002891 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002892 case SSE4A:
2893 Builder.defineMacro("__SSE4A__");
2894 case NoXOP:
2895 break;
2896 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002897
Craig Topperbba778b2012-06-03 21:46:30 +00002898 if (HasFMA)
2899 Builder.defineMacro("__FMA__");
2900
Manman Rena45358c2012-10-11 00:59:55 +00002901 if (HasF16C)
2902 Builder.defineMacro("__F16C__");
2903
Craig Topper679b53a2013-08-21 05:29:10 +00002904 if (HasAVX512CD)
2905 Builder.defineMacro("__AVX512CD__");
2906 if (HasAVX512ER)
2907 Builder.defineMacro("__AVX512ER__");
2908 if (HasAVX512PF)
2909 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002910 if (HasAVX512DQ)
2911 Builder.defineMacro("__AVX512DQ__");
2912 if (HasAVX512BW)
2913 Builder.defineMacro("__AVX512BW__");
2914 if (HasAVX512VL)
2915 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002916
Ben Langmuir58078d02013-09-19 13:22:04 +00002917 if (HasSHA)
2918 Builder.defineMacro("__SHA__");
2919
Nick Lewycky50e8f482013-10-05 20:14:27 +00002920 if (HasCX16)
2921 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2922
Chris Lattner96e43572009-03-02 22:40:39 +00002923 // Each case falls through to the previous one here.
2924 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002925 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002926 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002927 case AVX2:
2928 Builder.defineMacro("__AVX2__");
2929 case AVX:
2930 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002931 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002932 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002933 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002934 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002935 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002936 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002937 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002938 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002939 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002940 Builder.defineMacro("__SSE2__");
2941 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002942 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002943 Builder.defineMacro("__SSE__");
2944 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002945 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002946 break;
2947 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002948
Derek Schuffc7dd7222012-10-11 15:52:22 +00002949 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002950 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002951 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002952 case AVX2:
2953 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002954 case SSE42:
2955 case SSE41:
2956 case SSSE3:
2957 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002958 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002959 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002960 break;
2961 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002962 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002963 break;
2964 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002965 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002966 }
2967 }
2968
Anders Carlssone437c682010-01-27 03:47:49 +00002969 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002970 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002971 case AMD3DNowAthlon:
2972 Builder.defineMacro("__3dNOW_A__");
2973 case AMD3DNow:
2974 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002975 case MMX:
2976 Builder.defineMacro("__MMX__");
2977 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002978 break;
2979 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002980
2981 if (CPU >= CK_i486) {
2982 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2983 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2984 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2985 }
2986 if (CPU >= CK_i586)
2987 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002988}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002989
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002990bool X86TargetInfo::hasFeature(StringRef Feature) const {
2991 return llvm::StringSwitch<bool>(Feature)
2992 .Case("aes", HasAES)
2993 .Case("avx", SSELevel >= AVX)
2994 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002995 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002996 .Case("avx512cd", HasAVX512CD)
2997 .Case("avx512er", HasAVX512ER)
2998 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002999 .Case("avx512dq", HasAVX512DQ)
3000 .Case("avx512bw", HasAVX512BW)
3001 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003002 .Case("bmi", HasBMI)
3003 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003004 .Case("cx16", HasCX16)
3005 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003006 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003007 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003008 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003009 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003010 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3011 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3012 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003013 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003014 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003015 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003016 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003017 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003018 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003019 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003020 .Case("sse", SSELevel >= SSE1)
3021 .Case("sse2", SSELevel >= SSE2)
3022 .Case("sse3", SSELevel >= SSE3)
3023 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003024 .Case("sse4.1", SSELevel >= SSE41)
3025 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003026 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003027 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003028 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003029 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3030 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003031 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003032 .Default(false);
3033}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003034
Eli Friedman3fd920a2008-08-20 02:34:37 +00003035bool
Anders Carlsson58436352009-02-28 17:11:49 +00003036X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003037 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003038 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003039 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003040 case 'Y': // first letter of a pair:
3041 switch (*(Name+1)) {
3042 default: return false;
3043 case '0': // First SSE register.
3044 case 't': // Any SSE register, when SSE2 is enabled.
3045 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3046 case 'm': // any MMX register, when inter-unit moves enabled.
3047 break; // falls through to setAllowsRegister.
3048 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003049 case 'f': // any x87 floating point stack register.
3050 // Constraint 'f' cannot be used for output operands.
3051 if (Info.ConstraintStr[0] == '=')
3052 return false;
3053
3054 Info.setAllowsRegister();
3055 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003056 case 'a': // eax.
3057 case 'b': // ebx.
3058 case 'c': // ecx.
3059 case 'd': // edx.
3060 case 'S': // esi.
3061 case 'D': // edi.
3062 case 'A': // edx:eax.
3063 case 't': // top of floating point stack.
3064 case 'u': // second from top of floating point stack.
3065 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003066 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003067 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003068 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003069 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3070 case 'l': // "Index" registers: any general register that can be used as an
3071 // index in a base+index memory access.
3072 Info.setAllowsRegister();
3073 return true;
3074 case 'C': // SSE floating point constant.
3075 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003076 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003077 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003078 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003079 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003080 return true;
3081 }
3082}
3083
Akira Hatanaka974131e2014-09-18 18:17:18 +00003084bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3085 unsigned Size) const {
3086 // Strip off constraint modifiers.
3087 while (Constraint[0] == '=' ||
3088 Constraint[0] == '+' ||
3089 Constraint[0] == '&')
3090 Constraint = Constraint.substr(1);
3091
3092 return validateOperandSize(Constraint, Size);
3093}
3094
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003095bool X86TargetInfo::validateInputSize(StringRef Constraint,
3096 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003097 return validateOperandSize(Constraint, Size);
3098}
3099
3100bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3101 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003102 switch (Constraint[0]) {
3103 default: break;
3104 case 'y':
3105 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003106 case 'f':
3107 case 't':
3108 case 'u':
3109 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003110 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003111 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003112 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003113 }
3114
3115 return true;
3116}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003117
Eli Friedman3fd920a2008-08-20 02:34:37 +00003118std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003119X86TargetInfo::convertConstraint(const char *&Constraint) const {
3120 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003121 case 'a': return std::string("{ax}");
3122 case 'b': return std::string("{bx}");
3123 case 'c': return std::string("{cx}");
3124 case 'd': return std::string("{dx}");
3125 case 'S': return std::string("{si}");
3126 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003127 case 'p': // address
3128 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003129 case 't': // top of floating point stack.
3130 return std::string("{st}");
3131 case 'u': // second from top of floating point stack.
3132 return std::string("{st(1)}"); // second from top of floating point stack.
3133 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003134 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003135 }
3136}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003137} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003138
3139namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003140// X86-32 generic target
3141class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003142public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003143 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003144 DoubleAlign = LongLongAlign = 32;
3145 LongDoubleWidth = 96;
3146 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003147 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003148 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003149 SizeType = UnsignedInt;
3150 PtrDiffType = SignedInt;
3151 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003152 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003153
3154 // Use fpret for all types.
3155 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3156 (1 << TargetInfo::Double) |
3157 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003158
3159 // x86-32 has atomics up to 8 bytes
3160 // FIXME: Check that we actually have cmpxchg8b before setting
3161 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3162 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003163 }
Craig Topper3164f332014-03-11 03:39:26 +00003164 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003165 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003166 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003167
Craig Topper3164f332014-03-11 03:39:26 +00003168 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003169 if (RegNo == 0) return 0;
3170 if (RegNo == 1) return 2;
3171 return -1;
3172 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003173 bool validateOperandSize(StringRef Constraint,
3174 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003175 switch (Constraint[0]) {
3176 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003177 case 'R':
3178 case 'q':
3179 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003180 case 'a':
3181 case 'b':
3182 case 'c':
3183 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003184 case 'S':
3185 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003186 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003187 case 'A':
3188 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003189 }
3190
Akira Hatanaka974131e2014-09-18 18:17:18 +00003191 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003192 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003193};
3194} // end anonymous namespace
3195
3196namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003197class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3198public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003199 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3200 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003201
Craig Topper3164f332014-03-11 03:39:26 +00003202 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003203 unsigned Major, Minor, Micro;
3204 getTriple().getOSVersion(Major, Minor, Micro);
3205 // New NetBSD uses the default rounding mode.
3206 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3207 return X86_32TargetInfo::getFloatEvalMethod();
3208 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003209 return 1;
3210 }
3211};
3212} // end anonymous namespace
3213
3214namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003215class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003217 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3218 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003219 SizeType = UnsignedLong;
3220 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003221 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003222 }
3223};
3224} // end anonymous namespace
3225
3226namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003227class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3228public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003229 BitrigI386TargetInfo(const llvm::Triple &Triple)
3230 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003231 SizeType = UnsignedLong;
3232 IntPtrType = SignedLong;
3233 PtrDiffType = SignedLong;
3234 }
3235};
3236} // end anonymous namespace
3237
3238namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003239class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003241 DarwinI386TargetInfo(const llvm::Triple &Triple)
3242 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003243 LongDoubleWidth = 128;
3244 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003245 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003246 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003247 SizeType = UnsignedLong;
3248 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003249 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003250 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003251 }
3252
Eli Friedman3fd920a2008-08-20 02:34:37 +00003253};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003254} // end anonymous namespace
3255
3256namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003257// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003258class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003260 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3261 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003262 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003263 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003264 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003265 }
Craig Topper3164f332014-03-11 03:39:26 +00003266 void getTargetDefines(const LangOptions &Opts,
3267 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003268 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3269 }
3270};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003271
3272// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003273class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003274public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003275 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003276 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003277 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003278 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3279 }
Craig Topper3164f332014-03-11 03:39:26 +00003280 void getTargetDefines(const LangOptions &Opts,
3281 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003282 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3283 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3284 // The value of the following reflects processor type.
3285 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3286 // We lost the original triple, so we use the default.
3287 Builder.defineMacro("_M_IX86", "600");
3288 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003289};
3290} // end anonymous namespace
3291
Reid Kleckner47606832014-04-21 20:58:00 +00003292static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3293 Builder.defineMacro("__MSVCRT__");
3294 Builder.defineMacro("__MINGW32__");
3295
3296 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3297 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3298 // macro anyway for pre-processor compatibility.
3299 if (Opts.MicrosoftExt)
3300 Builder.defineMacro("__declspec", "__declspec");
3301 else
3302 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3303
3304 if (!Opts.MicrosoftExt) {
3305 // Provide macros for all the calling convention keywords. Provide both
3306 // single and double underscore prefixed variants. These are available on
3307 // x64 as well as x86, even though they have no effect.
3308 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3309 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003310 std::string GCCSpelling = "__attribute__((__";
3311 GCCSpelling += CC;
3312 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003313 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3314 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3315 }
3316 }
3317}
3318
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003319namespace {
3320// x86-32 MinGW target
3321class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3322public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003323 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3324 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003325 void getTargetDefines(const LangOptions &Opts,
3326 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003327 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003328 DefineStd(Builder, "WIN32", Opts);
3329 DefineStd(Builder, "WINNT", Opts);
3330 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003331 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003332 }
3333};
3334} // end anonymous namespace
3335
3336namespace {
3337// x86-32 Cygwin target
3338class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3339public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003340 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3341 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003342 TLSSupported = false;
3343 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003344 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003345 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003346 }
Craig Topper3164f332014-03-11 03:39:26 +00003347 void getTargetDefines(const LangOptions &Opts,
3348 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003349 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003350 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003351 Builder.defineMacro("__CYGWIN__");
3352 Builder.defineMacro("__CYGWIN32__");
3353 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003354 if (Opts.CPlusPlus)
3355 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003356 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003357};
3358} // end anonymous namespace
3359
3360namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003361// x86-32 Haiku target
3362class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3363public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003364 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003365 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003366 IntPtrType = SignedLong;
3367 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003368 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003369 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003370 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003371 }
Craig Topper3164f332014-03-11 03:39:26 +00003372 void getTargetDefines(const LangOptions &Opts,
3373 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003374 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3375 Builder.defineMacro("__INTEL__");
3376 Builder.defineMacro("__HAIKU__");
3377 }
3378};
3379} // end anonymous namespace
3380
Douglas Gregor9fabd852011-07-01 22:41:14 +00003381// RTEMS Target
3382template<typename Target>
3383class RTEMSTargetInfo : public OSTargetInfo<Target> {
3384protected:
Craig Topper3164f332014-03-11 03:39:26 +00003385 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3386 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003387 // RTEMS defines; list based off of gcc output
3388
Douglas Gregor9fabd852011-07-01 22:41:14 +00003389 Builder.defineMacro("__rtems__");
3390 Builder.defineMacro("__ELF__");
3391 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003392
Douglas Gregor9fabd852011-07-01 22:41:14 +00003393public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003394 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3395 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003396
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003397 switch (Triple.getArch()) {
3398 default:
3399 case llvm::Triple::x86:
3400 // this->MCountName = ".mcount";
3401 break;
3402 case llvm::Triple::mips:
3403 case llvm::Triple::mipsel:
3404 case llvm::Triple::ppc:
3405 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003406 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003407 // this->MCountName = "_mcount";
3408 break;
3409 case llvm::Triple::arm:
3410 // this->MCountName = "__mcount";
3411 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003412 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003413 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003414};
3415
3416namespace {
3417// x86-32 RTEMS target
3418class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003420 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003421 SizeType = UnsignedLong;
3422 IntPtrType = SignedLong;
3423 PtrDiffType = SignedLong;
3424 this->UserLabelPrefix = "";
3425 }
Craig Topper3164f332014-03-11 03:39:26 +00003426 void getTargetDefines(const LangOptions &Opts,
3427 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003428 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3429 Builder.defineMacro("__INTEL__");
3430 Builder.defineMacro("__rtems__");
3431 }
3432};
3433} // end anonymous namespace
3434
Chris Lattnerb986aba2010-04-11 19:29:39 +00003435namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003436// x86-64 generic target
3437class X86_64TargetInfo : public X86TargetInfo {
3438public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003439 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003440 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003441 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003442 LongDoubleWidth = 128;
3443 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003444 LargeArrayMinWidth = 128;
3445 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003446 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003447 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3448 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3449 IntPtrType = IsX32 ? SignedInt : SignedLong;
3450 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003451 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003452 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003453
Eric Christopher917e9522014-11-18 22:36:15 +00003454 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003455 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003456 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3457 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003458
3459 // Use fpret only for long double.
3460 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003461
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003462 // Use fp2ret for _Complex long double.
3463 ComplexLongDoubleUsesFP2Ret = true;
3464
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003465 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003466 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003467 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003468 }
Craig Topper3164f332014-03-11 03:39:26 +00003469 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003470 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003471 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003472
Craig Topper3164f332014-03-11 03:39:26 +00003473 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003474 if (RegNo == 0) return 0;
3475 if (RegNo == 1) return 1;
3476 return -1;
3477 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003478
Craig Topper3164f332014-03-11 03:39:26 +00003479 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003480 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003481 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003482 CC == CC_IntelOclBicc ||
3483 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003484 }
3485
Craig Topper3164f332014-03-11 03:39:26 +00003486 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003487 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003488 }
3489
Pavel Chupinfd223e12014-08-04 12:39:43 +00003490 // for x32 we need it here explicitly
3491 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003492};
3493} // end anonymous namespace
3494
3495namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003496// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003497class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003498public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003499 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3500 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003501 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003502 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003503 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003504 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003505 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003506 SizeType = UnsignedLongLong;
3507 PtrDiffType = SignedLongLong;
3508 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003509 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003510 }
Craig Topper3164f332014-03-11 03:39:26 +00003511 void getTargetDefines(const LangOptions &Opts,
3512 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003513 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003514 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003515 }
Craig Topper3164f332014-03-11 03:39:26 +00003516 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003517 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003518 }
Craig Topper3164f332014-03-11 03:39:26 +00003519 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003520 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003521 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003522 CC == CC_IntelOclBicc ||
3523 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3524 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003525};
3526} // end anonymous namespace
3527
3528namespace {
3529// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003530class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003531public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003532 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003533 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003534 LongDoubleWidth = LongDoubleAlign = 64;
3535 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003536 }
Craig Topper3164f332014-03-11 03:39:26 +00003537 void getTargetDefines(const LangOptions &Opts,
3538 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003539 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3540 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003541 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003542 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003543 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003544};
3545} // end anonymous namespace
3546
3547namespace {
3548// x86-64 MinGW target
3549class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3550public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003551 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3552 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003553 void getTargetDefines(const LangOptions &Opts,
3554 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003555 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003556 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003557 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003558 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003559
3560 // GCC defines this macro when it is using __gxx_personality_seh0.
3561 if (!Opts.SjLjExceptions)
3562 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003563 }
3564};
3565} // end anonymous namespace
3566
3567namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003568class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3569public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003570 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3571 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003572 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003573 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003574 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3575 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003576 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003577 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003578 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003579 }
3580};
3581} // end anonymous namespace
3582
3583namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003584class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3585public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003586 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3587 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003588 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003589 Int64Type = SignedLongLong;
3590 }
3591};
3592} // end anonymous namespace
3593
3594namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003595class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3596public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003597 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3598 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3599 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003600 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003601 }
3602};
Tim Northover9bb857a2013-01-31 12:13:10 +00003603}
3604
Eli Friedman9fa28852012-08-08 23:57:20 +00003605
3606namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003607class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003608 // Possible FPU choices.
3609 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003610 VFP2FPU = (1 << 0),
3611 VFP3FPU = (1 << 1),
3612 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003613 NeonFPU = (1 << 3),
3614 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003615 };
3616
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003617 // Possible HWDiv features.
3618 enum HWDivMode {
3619 HWDivThumb = (1 << 0),
3620 HWDivARM = (1 << 1)
3621 };
3622
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003623 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003624 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003625 }
3626
3627 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3628 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003629
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003630 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003631
Rafael Espindolaeb265472013-08-21 21:59:03 +00003632 enum {
3633 FP_Default,
3634 FP_VFP,
3635 FP_Neon
3636 } FPMath;
3637
Bernard Ogdenda13af32013-10-24 18:32:51 +00003638 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003639
Logan Chien57086ce2012-10-10 06:56:20 +00003640 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003641 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003642 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003643
3644 // Initialized via features.
3645 unsigned SoftFloat : 1;
3646 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003647
Bernard Ogden18b57012013-10-29 09:47:51 +00003648 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003649 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003650
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003651 // ACLE 6.5.1 Hardware floating point
3652 enum {
3653 HW_FP_HP = (1 << 1), /// half (16-bit)
3654 HW_FP_SP = (1 << 2), /// single (32-bit)
3655 HW_FP_DP = (1 << 3), /// double (64-bit)
3656 };
3657 uint32_t HW_FP;
3658
Chris Lattner5cc15e02010-03-03 19:03:45 +00003659 static const Builtin::Info BuiltinInfo[];
3660
Rafael Espindola101d5b92013-05-13 20:09:47 +00003661 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003662 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003663 if (T.getArch() == llvm::Triple::arm ||
3664 T.getArch() == llvm::Triple::armeb) {
3665 StringRef VersionStr;
3666 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003667 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003668 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003669 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003670 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003671 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003672 unsigned Version;
3673 if (VersionStr.getAsInteger(10, Version))
3674 return false;
3675 return Version >= 6;
3676 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003677 assert(T.getArch() == llvm::Triple::thumb ||
3678 T.getArch() == llvm::Triple::thumbeb);
3679 StringRef VersionStr;
3680 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003681 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003682 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003683 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003684 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003685 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003686 unsigned Version;
3687 if (VersionStr.getAsInteger(10, Version))
3688 return false;
3689 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003690 }
3691
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003692 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003693 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003694
3695 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003696 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003697
Tim Northover00853e52014-08-05 11:07:26 +00003698 // size_t is unsigned long on MachO-derived environments and NetBSD.
3699 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003700 SizeType = UnsignedLong;
3701 else
3702 SizeType = UnsignedInt;
3703
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003704 switch (T.getOS()) {
3705 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003706 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003707 break;
3708 case llvm::Triple::Win32:
3709 WCharType = UnsignedShort;
3710 break;
3711 case llvm::Triple::Linux:
3712 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003713 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3714 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003715 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003716 }
3717
3718 UseBitFieldTypeAlignment = true;
3719
3720 ZeroLengthBitfieldBoundary = 0;
3721
Tim Northover147cd2f2014-10-14 22:12:21 +00003722 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3723 // so set preferred for small types to 32.
3724 if (T.isOSBinFormatMachO()) {
3725 DescriptionString =
3726 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3727 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3728 } else if (T.isOSWindows()) {
3729 // FIXME: this is invalid for WindowsCE
3730 assert(!BigEndian && "Windows on ARM does not support big endian");
3731 DescriptionString = "e"
3732 "-m:e"
3733 "-p:32:32"
3734 "-i64:64"
3735 "-v128:64:128"
3736 "-a:0:32"
3737 "-n32"
3738 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003739 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003740 DescriptionString =
3741 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3742 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003743 }
3744
3745 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003746 }
3747
3748 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003749 const llvm::Triple &T = getTriple();
3750
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003751 IsAAPCS = false;
3752
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003753 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003754
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003755 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003756 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003757 SizeType = UnsignedInt;
3758 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003759 SizeType = UnsignedLong;
3760
3761 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3762 WCharType = SignedInt;
3763
3764 // Do not respect the alignment of bit-field types when laying out
3765 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3766 UseBitFieldTypeAlignment = false;
3767
3768 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3769 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3770 /// gcc.
3771 ZeroLengthBitfieldBoundary = 32;
3772
Tim Northover147cd2f2014-10-14 22:12:21 +00003773 if (T.isOSBinFormatMachO())
3774 DescriptionString =
3775 BigEndian
3776 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3777 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3778 else
3779 DescriptionString =
3780 BigEndian
3781 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3782 : "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 +00003783
3784 // FIXME: Override "preferred align" for double and long long.
3785 }
3786
Chris Lattner17df24e2008-04-21 18:56:49 +00003787public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003788 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003789 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003790 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003791 BigEndian = IsBigEndian;
3792
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003793 switch (getTriple().getOS()) {
3794 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003795 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003796 break;
3797 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003798 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003799 break;
3800 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003801
Chris Lattner1a8f3942010-04-23 16:29:58 +00003802 // {} in inline assembly are neon specifiers, not assembly variant
3803 // specifiers.
3804 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003805
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003806 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003807 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003808
3809 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003810
3811 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003812 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003813
3814 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003815 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003816 if (shouldUseInlineAtomic(getTriple()))
3817 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003818
3819 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003820 // the alignment of the zero-length bitfield is greater than the member
3821 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003822 // zero length bitfield.
3823 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003824 }
Alp Toker4925ba72014-06-07 23:30:42 +00003825 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003826 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003827 ABI = Name;
3828
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003829 // The defaults (above) are for AAPCS, check if we need to change them.
3830 //
3831 // FIXME: We need support for -meabi... we could just mangle it into the
3832 // name.
3833 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003834 setABIAPCS();
3835 return true;
3836 }
3837 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3838 setABIAAPCS();
3839 return true;
3840 }
3841 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003842 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003843
Craig Topper3164f332014-03-11 03:39:26 +00003844 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003845 if (IsAAPCS)
3846 Features["aapcs"] = true;
3847 else
3848 Features["apcs"] = true;
3849
Silviu Barangae5690462013-10-21 10:59:33 +00003850 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003851 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3852 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00003853 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00003854 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003855 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003856 }
3857 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003858 Features["vfp4"] = true;
3859 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003860 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3861 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003862 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003863 Features["vfp4"] = true;
3864 Features["neon"] = true;
3865 Features["hwdiv"] = true;
3866 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003867 } else if (CPU == "cyclone") {
3868 Features["v8fp"] = true;
3869 Features["neon"] = true;
3870 Features["hwdiv"] = true;
3871 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003872 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3873 Features["fp-armv8"] = true;
3874 Features["neon"] = true;
3875 Features["hwdiv"] = true;
3876 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003877 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003878 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003879 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003880 // Enable the hwdiv extension for all v8a AArch32 cores by
3881 // default.
3882 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003883 ArchName == "armebv8a" || ArchName == "armebv8" ||
3884 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3885 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003886 Features["hwdiv"] = true;
3887 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003888 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003889 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003890 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003891 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003892
Craig Topper3164f332014-03-11 03:39:26 +00003893 bool handleTargetFeatures(std::vector<std::string> &Features,
3894 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003895 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003896 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003897 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003898 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003899 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003900
3901 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003902 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003903 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003904 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003905 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003906 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003907 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003908 HW_FP = HW_FP_SP | HW_FP_DP;
3909 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003910 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003911 HW_FP = HW_FP_SP | HW_FP_DP;
3912 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003913 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003914 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3915 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003916 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003917 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3918 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003919 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003920 HW_FP = HW_FP_SP | HW_FP_DP;
3921 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003922 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003923 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003924 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003925 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003926 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003927 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003928 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003929 } else if (Feature == "+fp-only-sp") {
3930 HW_FP &= ~HW_FP_DP;
3931 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003932 }
3933
Rafael Espindolaeb265472013-08-21 21:59:03 +00003934 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3935 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3936 return false;
3937 }
3938
3939 if (FPMath == FP_Neon)
3940 Features.push_back("+neonfp");
3941 else if (FPMath == FP_VFP)
3942 Features.push_back("-neonfp");
3943
Daniel Dunbar893d4752009-12-19 04:15:38 +00003944 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003945 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3946 for (const auto &FEFeature : FrontEndFeatures) {
3947 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3948 if (Feature != Features.end())
3949 Features.erase(Feature);
3950 }
3951
Rafael Espindolaeb265472013-08-21 21:59:03 +00003952 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003953 }
3954
Craig Topper3164f332014-03-11 03:39:26 +00003955 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003956 return llvm::StringSwitch<bool>(Feature)
3957 .Case("arm", true)
3958 .Case("softfloat", SoftFloat)
3959 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003960 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003961 .Case("hwdiv", HWDiv & HWDivThumb)
3962 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003963 .Default(false);
3964 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003965 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003966 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00003967 return llvm::StringSwitch<const char *>(Name)
3968 .Cases("arm8", "arm810", "4")
3969 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
3970 "4")
3971 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3972 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3973 .Case("ep9312", "4T")
3974 .Cases("arm10tdmi", "arm1020t", "5T")
3975 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3976 .Case("arm926ej-s", "5TEJ")
3977 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3978 .Cases("xscale", "iwmmxt", "5TE")
3979 .Case("arm1136j-s", "6J")
3980 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
3981 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
3982 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
3983 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3984 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
3985 "7A")
3986 .Cases("cortex-r4", "cortex-r5", "7R")
3987 .Case("swift", "7S")
3988 .Case("cyclone", "8A")
3989 .Case("cortex-m3", "7M")
3990 .Cases("cortex-m4", "cortex-m7", "7EM")
3991 .Case("cortex-m0", "6M")
3992 .Cases("cortex-a53", "cortex-a57", "8A")
3993 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003994 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003995 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00003996 return llvm::StringSwitch<const char *>(Name)
3997 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
3998 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
3999 "A")
4000 .Cases("cortex-a53", "cortex-a57", "A")
4001 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4002 .Cases("cortex-r4", "cortex-r5", "R")
4003 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004004 }
Craig Topper3164f332014-03-11 03:39:26 +00004005 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004006 if (!getCPUDefineSuffix(Name))
4007 return false;
4008
Tim Northovere8c37212014-07-09 09:24:43 +00004009 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4010 StringRef Profile = getCPUProfile(Name);
4011 if (Profile == "M" && MaxAtomicInlineWidth) {
4012 MaxAtomicPromoteWidth = 32;
4013 MaxAtomicInlineWidth = 32;
4014 }
4015
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004016 CPU = Name;
4017 return true;
4018 }
Craig Topper3164f332014-03-11 03:39:26 +00004019 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004020 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4021 unsigned CPUArchVer) const {
4022 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4023 (CPUArch.find('M') != StringRef::npos);
4024 }
4025 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4026 unsigned CPUArchVer) const {
4027 // We check both CPUArchVer and ArchName because when only triple is
4028 // specified, the default CPU is arm1136j-s.
4029 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4030 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4031 }
Craig Topper3164f332014-03-11 03:39:26 +00004032 void getTargetDefines(const LangOptions &Opts,
4033 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004034 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004035 Builder.defineMacro("__arm");
4036 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004037
Chris Lattnerecd49032009-03-02 22:27:17 +00004038 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004039 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004040
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004041 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004042 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004043 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004044 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004045 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004046
4047 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004048 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004049 StringRef ArchName = getTriple().getArchName();
4050
4051 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4052 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004053 if (CPUArch[0] >= '8') {
4054 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4055 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004056 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004057
4058 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4059 // is not defined for the M-profile.
4060 // NOTE that the deffault profile is assumed to be 'A'
4061 if (CPUProfile.empty() || CPUProfile != "M")
4062 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4063
4064 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4065 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4066 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4067 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4068 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4069 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4070 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4071
4072 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4073 // instruction set such as ARM or Thumb.
4074 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4075
4076 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4077
4078 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004079 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004080 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004081
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004082 // ACLE 6.5.1 Hardware Floating Point
4083 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004084 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004085
Yi Konga44c4d72014-06-27 21:25:42 +00004086 // ACLE predefines.
4087 Builder.defineMacro("__ARM_ACLE", "200");
4088
Mike Stump9d54bd72009-04-08 02:07:04 +00004089 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004090
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004091 // FIXME: It's more complicated than this and we don't really support
4092 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004093 // Windows on ARM does not "support" interworking
4094 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004095 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004096
David Tweed8f676532012-10-25 13:33:01 +00004097 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004098 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004099 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4100 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004101 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004102 Builder.defineMacro("__ARM_PCS", "1");
4103
David Tweed8f676532012-10-25 13:33:01 +00004104 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004105 Builder.defineMacro("__ARM_PCS_VFP", "1");
4106 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004107
Daniel Dunbar893d4752009-12-19 04:15:38 +00004108 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004109 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004110
4111 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004112 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004113
4114 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004115 Builder.defineMacro("__THUMBEL__");
4116 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004117 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004118 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004119 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004120 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4121 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004122
4123 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004124 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004125
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004126 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004127 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004128 if (FPU & VFP2FPU)
4129 Builder.defineMacro("__ARM_VFPV2__");
4130 if (FPU & VFP3FPU)
4131 Builder.defineMacro("__ARM_VFPV3__");
4132 if (FPU & VFP4FPU)
4133 Builder.defineMacro("__ARM_VFPV4__");
4134 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004135
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004136 // This only gets set when Neon instructions are actually available, unlike
4137 // the VFP define, hence the soft float and arch check. This is subtly
4138 // different from gcc, we follow the intent which was that it should be set
4139 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004140 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4141 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004142 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004143 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004144
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004145 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4146 Opts.ShortWChar ? "2" : "4");
4147
4148 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4149 Opts.ShortEnums ? "1" : "4");
4150
Bernard Ogden18b57012013-10-29 09:47:51 +00004151 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004152 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004153
Tim Northover02e38602014-02-03 17:28:04 +00004154 if (Crypto)
4155 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4156
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004157 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004158 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4159 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4160 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4161 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4162 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004163
4164 bool is5EOrAbove = (CPUArchVer >= 6 ||
4165 (CPUArchVer == 5 &&
4166 CPUArch.find('E') != StringRef::npos));
4167 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4168 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4169 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004170 }
Craig Topper3164f332014-03-11 03:39:26 +00004171 void getTargetBuiltins(const Builtin::Info *&Records,
4172 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004173 Records = BuiltinInfo;
4174 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004175 }
Craig Topper3164f332014-03-11 03:39:26 +00004176 bool isCLZForZeroUndef() const override { return false; }
4177 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004178 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004179 }
Craig Topper3164f332014-03-11 03:39:26 +00004180 void getGCCRegNames(const char * const *&Names,
4181 unsigned &NumNames) const override;
4182 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4183 unsigned &NumAliases) const override;
4184 bool validateAsmConstraint(const char *&Name,
4185 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004186 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004187 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004188 case 'l': // r0-r7
4189 case 'h': // r8-r15
4190 case 'w': // VFP Floating point register single precision
4191 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004192 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004193 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004194 case 'Q': // A memory address that is a single base register.
4195 Info.setAllowsMemory();
4196 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004197 case 'U': // a memory reference...
4198 switch (Name[1]) {
4199 case 'q': // ...ARMV4 ldrsb
4200 case 'v': // ...VFP load/store (reg+constant offset)
4201 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004202 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004203 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004204 case 'n': // valid address for Neon doubleword vector load/store
4205 case 'm': // valid address for Neon element and structure load/store
4206 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004207 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004208 Info.setAllowsMemory();
4209 Name++;
4210 return true;
4211 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004212 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004213 return false;
4214 }
Craig Topper3164f332014-03-11 03:39:26 +00004215 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004216 std::string R;
4217 switch (*Constraint) {
4218 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004219 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004220 Constraint++;
4221 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004222 case 'p': // 'p' should be translated to 'r' by default.
4223 R = std::string("r");
4224 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004225 default:
4226 return std::string(1, *Constraint);
4227 }
4228 return R;
4229 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004230 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004231 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004232 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004233 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004234 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004235
Bill Wendling9d1ee112012-10-25 23:28:48 +00004236 // Strip off constraint modifiers.
4237 while (Constraint[0] == '=' ||
4238 Constraint[0] == '+' ||
4239 Constraint[0] == '&')
4240 Constraint = Constraint.substr(1);
4241
4242 switch (Constraint[0]) {
4243 default: break;
4244 case 'r': {
4245 switch (Modifier) {
4246 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004247 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004248 case 'q':
4249 // A register of size 32 cannot fit a vector type.
4250 return false;
4251 }
4252 }
4253 }
4254
4255 return true;
4256 }
Craig Topper3164f332014-03-11 03:39:26 +00004257 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004258 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004259 return "";
4260 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004261
Craig Topper3164f332014-03-11 03:39:26 +00004262 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004263 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4264 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004265
Craig Topper3164f332014-03-11 03:39:26 +00004266 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004267 if (RegNo == 0) return 0;
4268 if (RegNo == 1) return 1;
4269 return -1;
4270 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004271};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004272
Rafael Espindolaeb265472013-08-21 21:59:03 +00004273bool ARMTargetInfo::setFPMath(StringRef Name) {
4274 if (Name == "neon") {
4275 FPMath = FP_Neon;
4276 return true;
4277 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4278 Name == "vfp4") {
4279 FPMath = FP_VFP;
4280 return true;
4281 }
4282 return false;
4283}
4284
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004285const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004286 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004287 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004288 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4289
4290 // Float registers
4291 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4292 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4293 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004294 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004295
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004296 // Double registers
4297 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4298 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004299 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4300 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004301
4302 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004303 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4304 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004305};
4306
4307void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004308 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004309 Names = GCCRegNames;
4310 NumNames = llvm::array_lengthof(GCCRegNames);
4311}
4312
4313const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004314 { { "a1" }, "r0" },
4315 { { "a2" }, "r1" },
4316 { { "a3" }, "r2" },
4317 { { "a4" }, "r3" },
4318 { { "v1" }, "r4" },
4319 { { "v2" }, "r5" },
4320 { { "v3" }, "r6" },
4321 { { "v4" }, "r7" },
4322 { { "v5" }, "r8" },
4323 { { "v6", "rfp" }, "r9" },
4324 { { "sl" }, "r10" },
4325 { { "fp" }, "r11" },
4326 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004327 { { "r13" }, "sp" },
4328 { { "r14" }, "lr" },
4329 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004330 // The S, D and Q registers overlap, but aren't really aliases; we
4331 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004332};
4333
4334void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4335 unsigned &NumAliases) const {
4336 Aliases = GCCRegAliases;
4337 NumAliases = llvm::array_lengthof(GCCRegAliases);
4338}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004339
4340const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004341#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004342#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004343 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004344#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004345
4346#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004347#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004348#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4349 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004350#include "clang/Basic/BuiltinsARM.def"
4351};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004352
4353class ARMleTargetInfo : public ARMTargetInfo {
4354public:
4355 ARMleTargetInfo(const llvm::Triple &Triple)
4356 : ARMTargetInfo(Triple, false) { }
4357 virtual void getTargetDefines(const LangOptions &Opts,
4358 MacroBuilder &Builder) const {
4359 Builder.defineMacro("__ARMEL__");
4360 ARMTargetInfo::getTargetDefines(Opts, Builder);
4361 }
4362};
4363
4364class ARMbeTargetInfo : public ARMTargetInfo {
4365public:
4366 ARMbeTargetInfo(const llvm::Triple &Triple)
4367 : ARMTargetInfo(Triple, true) { }
4368 virtual void getTargetDefines(const LangOptions &Opts,
4369 MacroBuilder &Builder) const {
4370 Builder.defineMacro("__ARMEB__");
4371 Builder.defineMacro("__ARM_BIG_ENDIAN");
4372 ARMTargetInfo::getTargetDefines(Opts, Builder);
4373 }
4374};
Chris Lattner17df24e2008-04-21 18:56:49 +00004375} // end anonymous namespace.
4376
Eli Friedmanf05b7722008-08-20 07:44:10 +00004377namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004378class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4379 const llvm::Triple Triple;
4380public:
4381 WindowsARMTargetInfo(const llvm::Triple &Triple)
4382 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4383 TLSSupported = false;
4384 WCharType = UnsignedShort;
4385 SizeType = UnsignedInt;
4386 UserLabelPrefix = "";
4387 }
4388 void getVisualStudioDefines(const LangOptions &Opts,
4389 MacroBuilder &Builder) const {
4390 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4391
4392 // FIXME: this is invalid for WindowsCE
4393 Builder.defineMacro("_M_ARM_NT", "1");
4394 Builder.defineMacro("_M_ARMT", "_M_ARM");
4395 Builder.defineMacro("_M_THUMB", "_M_ARM");
4396
4397 assert((Triple.getArch() == llvm::Triple::arm ||
4398 Triple.getArch() == llvm::Triple::thumb) &&
4399 "invalid architecture for Windows ARM target info");
4400 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4401 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4402
4403 // TODO map the complete set of values
4404 // 31: VFPv3 40: VFPv4
4405 Builder.defineMacro("_M_ARM_FP", "31");
4406 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004407 BuiltinVaListKind getBuiltinVaListKind() const override {
4408 return TargetInfo::CharPtrBuiltinVaList;
4409 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004410};
4411
4412// Windows ARM + Itanium C++ ABI Target
4413class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4414public:
4415 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4416 : WindowsARMTargetInfo(Triple) {
4417 TheCXXABI.set(TargetCXXABI::GenericARM);
4418 }
4419
4420 void getTargetDefines(const LangOptions &Opts,
4421 MacroBuilder &Builder) const override {
4422 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4423
4424 if (Opts.MSVCCompat)
4425 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4426 }
4427};
4428
4429// Windows ARM, MS (C++) ABI
4430class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4431public:
4432 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4433 : WindowsARMTargetInfo(Triple) {
4434 TheCXXABI.set(TargetCXXABI::Microsoft);
4435 }
4436
4437 void getTargetDefines(const LangOptions &Opts,
4438 MacroBuilder &Builder) const override {
4439 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4440 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4441 }
4442};
4443}
4444
4445
4446namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004447class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004448 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004449protected:
Craig Topper3164f332014-03-11 03:39:26 +00004450 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4451 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004452 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004453 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004454
Torok Edwinb2b37c62009-06-30 17:10:35 +00004455public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004456 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004457 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004458 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004459 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004460 // FIXME: This should be based off of the target features in
4461 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004462 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004463
4464 // Darwin on iOS uses a variant of the ARM C++ ABI.
4465 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004466 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004467};
4468} // end anonymous namespace.
4469
Tony Linthicum76329bf2011-12-12 21:14:55 +00004470
4471namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004472class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004473 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004474 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4475 static const char *const GCCRegNames[];
4476
James Molloy75f5f9e2014-04-16 15:33:48 +00004477 enum FPUModeEnum {
4478 FPUMode,
4479 NeonMode
4480 };
4481
4482 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004483 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004484 unsigned Crypto;
4485
Tim Northovera2ee4332014-03-29 15:09:45 +00004486 static const Builtin::Info BuiltinInfo[];
4487
4488 std::string ABI;
4489
4490public:
Tim Northover573cbee2014-05-24 12:52:07 +00004491 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004492 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004493
4494 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4495 WCharType = SignedInt;
4496
4497 // NetBSD apparently prefers consistency across ARM targets to consistency
4498 // across 64-bit targets.
4499 Int64Type = SignedLongLong;
4500 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004501 } else {
4502 WCharType = UnsignedInt;
4503 Int64Type = SignedLong;
4504 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004505 }
4506
Tim Northovera2ee4332014-03-29 15:09:45 +00004507 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004508 MaxVectorAlign = 128;
4509 RegParmMax = 8;
4510 MaxAtomicInlineWidth = 128;
4511 MaxAtomicPromoteWidth = 128;
4512
4513 LongDoubleWidth = LongDoubleAlign = 128;
4514 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4515
Tim Northovera2ee4332014-03-29 15:09:45 +00004516 // {} in inline assembly are neon specifiers, not assembly variant
4517 // specifiers.
4518 NoAsmVariants = true;
4519
Tim Northover573cbee2014-05-24 12:52:07 +00004520 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004521 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4522 }
4523
Alp Toker4925ba72014-06-07 23:30:42 +00004524 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004525 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004526 if (Name != "aapcs" && Name != "darwinpcs")
4527 return false;
4528
4529 ABI = Name;
4530 return true;
4531 }
4532
David Blaikie1cbb9712014-11-14 19:09:44 +00004533 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004534 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004535 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004536 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004537 .Case("cyclone", true)
4538 .Default(false);
4539 return CPUKnown;
4540 }
4541
4542 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004543 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004544 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004545 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004546
4547 // Target properties.
4548 Builder.defineMacro("_LP64");
4549 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004550
4551 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4552 Builder.defineMacro("__ARM_ACLE", "200");
4553 Builder.defineMacro("__ARM_ARCH", "8");
4554 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4555
4556 Builder.defineMacro("__ARM_64BIT_STATE");
4557 Builder.defineMacro("__ARM_PCS_AAPCS64");
4558 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4559
4560 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4561 Builder.defineMacro("__ARM_FEATURE_CLZ");
4562 Builder.defineMacro("__ARM_FEATURE_FMA");
4563 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004564 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4565 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4566 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4567 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004568
4569 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4570
4571 // 0xe implies support for half, single and double precision operations.
4572 Builder.defineMacro("__ARM_FP", "0xe");
4573
4574 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4575 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4576 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4577
4578 if (Opts.FastMath || Opts.FiniteMathOnly)
4579 Builder.defineMacro("__ARM_FP_FAST");
4580
Richard Smithab506ad2014-10-20 23:26:58 +00004581 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004582 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4583
4584 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4585
4586 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4587 Opts.ShortEnums ? "1" : "4");
4588
James Molloy75f5f9e2014-04-16 15:33:48 +00004589 if (FPU == NeonMode) {
4590 Builder.defineMacro("__ARM_NEON");
4591 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004592 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004593 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004594
Bradley Smith418c5932014-05-02 15:17:51 +00004595 if (CRC)
4596 Builder.defineMacro("__ARM_FEATURE_CRC32");
4597
James Molloy75f5f9e2014-04-16 15:33:48 +00004598 if (Crypto)
4599 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004600 }
4601
4602 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004603 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004604 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004605 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004606 }
4607
David Blaikie1cbb9712014-11-14 19:09:44 +00004608 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004609 return Feature == "aarch64" ||
4610 Feature == "arm64" ||
4611 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004612 }
4613
James Molloy5e73df52014-04-16 15:06:20 +00004614 bool handleTargetFeatures(std::vector<std::string> &Features,
4615 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004616 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004617 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004618 Crypto = 0;
4619 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4620 if (Features[i] == "+neon")
4621 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004622 if (Features[i] == "+crc")
4623 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004624 if (Features[i] == "+crypto")
4625 Crypto = 1;
4626 }
4627
James Molloy5e73df52014-04-16 15:06:20 +00004628 setDescriptionString();
4629
4630 return true;
4631 }
4632
David Blaikie1cbb9712014-11-14 19:09:44 +00004633 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004634
David Blaikie1cbb9712014-11-14 19:09:44 +00004635 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004636 return TargetInfo::AArch64ABIBuiltinVaList;
4637 }
4638
4639 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004640 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004641 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004642 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004643
Eric Christopher917e9522014-11-18 22:36:15 +00004644 virtual bool
4645 validateAsmConstraint(const char *&Name,
4646 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004647 switch (*Name) {
4648 default:
4649 return false;
4650 case 'w': // Floating point and SIMD registers (V0-V31)
4651 Info.setAllowsRegister();
4652 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004653 case 'I': // Constant that can be used with an ADD instruction
4654 case 'J': // Constant that can be used with a SUB instruction
4655 case 'K': // Constant that can be used with a 32-bit logical instruction
4656 case 'L': // Constant that can be used with a 64-bit logical instruction
4657 case 'M': // Constant that can be used as a 32-bit MOV immediate
4658 case 'N': // Constant that can be used as a 64-bit MOV immediate
4659 case 'Y': // Floating point constant zero
4660 case 'Z': // Integer constant zero
4661 return true;
4662 case 'Q': // A memory reference with base register and no offset
4663 Info.setAllowsMemory();
4664 return true;
4665 case 'S': // A symbolic address
4666 Info.setAllowsRegister();
4667 return true;
4668 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004669 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4670 // Utf: A memory address suitable for ldp/stp in TF mode.
4671 // Usa: An absolute symbolic address.
4672 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4673 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004674 case 'z': // Zero register, wzr or xzr
4675 Info.setAllowsRegister();
4676 return true;
4677 case 'x': // Floating point and SIMD registers (V0-V15)
4678 Info.setAllowsRegister();
4679 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004680 }
4681 return false;
4682 }
4683
Akira Hatanaka987f1862014-08-22 06:05:21 +00004684 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004685 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004686 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004687 // Strip off constraint modifiers.
4688 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4689 Constraint = Constraint.substr(1);
4690
4691 switch (Constraint[0]) {
4692 default:
4693 return true;
4694 case 'z':
4695 case 'r': {
4696 switch (Modifier) {
4697 case 'x':
4698 case 'w':
4699 // For now assume that the person knows what they're
4700 // doing with the modifier.
4701 return true;
4702 default:
4703 // By default an 'r' constraint will be in the 'x'
4704 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004705 if (Size == 64)
4706 return true;
4707
4708 SuggestedModifier = "w";
4709 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004710 }
4711 }
4712 }
4713 }
4714
David Blaikie1cbb9712014-11-14 19:09:44 +00004715 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004716
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004717 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004718 if (RegNo == 0)
4719 return 0;
4720 if (RegNo == 1)
4721 return 1;
4722 return -1;
4723 }
4724};
4725
Tim Northover573cbee2014-05-24 12:52:07 +00004726const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004727 // 32-bit Integer registers
4728 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4729 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4730 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4731
4732 // 64-bit Integer registers
4733 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4734 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4735 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4736
4737 // 32-bit floating point regsisters
4738 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4739 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4740 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4741
4742 // 64-bit floating point regsisters
4743 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4744 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4745 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4746
4747 // Vector registers
4748 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4749 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4750 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4751};
4752
Tim Northover573cbee2014-05-24 12:52:07 +00004753void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004754 unsigned &NumNames) const {
4755 Names = GCCRegNames;
4756 NumNames = llvm::array_lengthof(GCCRegNames);
4757}
4758
Tim Northover573cbee2014-05-24 12:52:07 +00004759const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004760 { { "w31" }, "wsp" },
4761 { { "x29" }, "fp" },
4762 { { "x30" }, "lr" },
4763 { { "x31" }, "sp" },
4764 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4765 // don't want to substitute one of these for a different-sized one.
4766};
4767
Tim Northover573cbee2014-05-24 12:52:07 +00004768void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004769 unsigned &NumAliases) const {
4770 Aliases = GCCRegAliases;
4771 NumAliases = llvm::array_lengthof(GCCRegAliases);
4772}
4773
Tim Northover573cbee2014-05-24 12:52:07 +00004774const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004775#define BUILTIN(ID, TYPE, ATTRS) \
4776 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4777#include "clang/Basic/BuiltinsNEON.def"
4778
4779#define BUILTIN(ID, TYPE, ATTRS) \
4780 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004781#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004782};
James Molloy5e73df52014-04-16 15:06:20 +00004783
Tim Northover573cbee2014-05-24 12:52:07 +00004784class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004785 void setDescriptionString() override {
4786 if (getTriple().isOSBinFormatMachO())
4787 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4788 else
4789 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4790 }
4791
4792public:
Tim Northover573cbee2014-05-24 12:52:07 +00004793 AArch64leTargetInfo(const llvm::Triple &Triple)
4794 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004795 BigEndian = false;
4796 }
4797 void getTargetDefines(const LangOptions &Opts,
4798 MacroBuilder &Builder) const override {
4799 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004800 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004801 }
4802};
4803
Tim Northover573cbee2014-05-24 12:52:07 +00004804class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004805 void setDescriptionString() override {
4806 assert(!getTriple().isOSBinFormatMachO());
4807 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4808 }
4809
4810public:
Tim Northover573cbee2014-05-24 12:52:07 +00004811 AArch64beTargetInfo(const llvm::Triple &Triple)
4812 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004813 void getTargetDefines(const LangOptions &Opts,
4814 MacroBuilder &Builder) const override {
4815 Builder.defineMacro("__AARCH64EB__");
4816 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4817 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004818 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004819 }
4820};
Tim Northovera2ee4332014-03-29 15:09:45 +00004821} // end anonymous namespace.
4822
4823namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004824class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004825protected:
4826 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4827 MacroBuilder &Builder) const override {
4828 Builder.defineMacro("__AARCH64_SIMD__");
4829 Builder.defineMacro("__ARM64_ARCH_8__");
4830 Builder.defineMacro("__ARM_NEON__");
4831 Builder.defineMacro("__LITTLE_ENDIAN__");
4832 Builder.defineMacro("__REGISTER_PREFIX__", "");
4833 Builder.defineMacro("__arm64", "1");
4834 Builder.defineMacro("__arm64__", "1");
4835
4836 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4837 }
4838
Tim Northovera2ee4332014-03-29 15:09:45 +00004839public:
Tim Northover573cbee2014-05-24 12:52:07 +00004840 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4841 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004842 Int64Type = SignedLongLong;
4843 WCharType = SignedInt;
4844 UseSignedCharForObjCBool = false;
4845
4846 LongDoubleWidth = LongDoubleAlign = 64;
4847 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4848
4849 TheCXXABI.set(TargetCXXABI::iOS64);
4850 }
4851
David Blaikie1cbb9712014-11-14 19:09:44 +00004852 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004853 return TargetInfo::CharPtrBuiltinVaList;
4854 }
4855};
4856} // end anonymous namespace
4857
4858namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004859// Hexagon abstract base class
4860class HexagonTargetInfo : public TargetInfo {
4861 static const Builtin::Info BuiltinInfo[];
4862 static const char * const GCCRegNames[];
4863 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4864 std::string CPU;
4865public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004866 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004867 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004868 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004869
4870 // {} in inline assembly are packet specifiers, not assembly variant
4871 // specifiers.
4872 NoAsmVariants = true;
4873 }
4874
Craig Topper3164f332014-03-11 03:39:26 +00004875 void getTargetBuiltins(const Builtin::Info *&Records,
4876 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004877 Records = BuiltinInfo;
4878 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4879 }
4880
Craig Topper3164f332014-03-11 03:39:26 +00004881 bool validateAsmConstraint(const char *&Name,
4882 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004883 return true;
4884 }
4885
Craig Topper3164f332014-03-11 03:39:26 +00004886 void getTargetDefines(const LangOptions &Opts,
4887 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004888
Craig Topper3164f332014-03-11 03:39:26 +00004889 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004890 return Feature == "hexagon";
4891 }
Craig Topper3164f332014-03-11 03:39:26 +00004892
4893 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004894 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004895 }
Craig Topper3164f332014-03-11 03:39:26 +00004896 void getGCCRegNames(const char * const *&Names,
4897 unsigned &NumNames) const override;
4898 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4899 unsigned &NumAliases) const override;
4900 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004901 return "";
4902 }
Sebastian Pop86500282012-01-13 20:37:10 +00004903
4904 static const char *getHexagonCPUSuffix(StringRef Name) {
4905 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004906 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004907 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004908 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004909 }
4910
Craig Topper3164f332014-03-11 03:39:26 +00004911 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004912 if (!getHexagonCPUSuffix(Name))
4913 return false;
4914
Tony Linthicum76329bf2011-12-12 21:14:55 +00004915 CPU = Name;
4916 return true;
4917 }
4918};
4919
4920void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4921 MacroBuilder &Builder) const {
4922 Builder.defineMacro("qdsp6");
4923 Builder.defineMacro("__qdsp6", "1");
4924 Builder.defineMacro("__qdsp6__", "1");
4925
4926 Builder.defineMacro("hexagon");
4927 Builder.defineMacro("__hexagon", "1");
4928 Builder.defineMacro("__hexagon__", "1");
4929
4930 if(CPU == "hexagonv1") {
4931 Builder.defineMacro("__HEXAGON_V1__");
4932 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4933 if(Opts.HexagonQdsp6Compat) {
4934 Builder.defineMacro("__QDSP6_V1__");
4935 Builder.defineMacro("__QDSP6_ARCH__", "1");
4936 }
4937 }
4938 else if(CPU == "hexagonv2") {
4939 Builder.defineMacro("__HEXAGON_V2__");
4940 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4941 if(Opts.HexagonQdsp6Compat) {
4942 Builder.defineMacro("__QDSP6_V2__");
4943 Builder.defineMacro("__QDSP6_ARCH__", "2");
4944 }
4945 }
4946 else if(CPU == "hexagonv3") {
4947 Builder.defineMacro("__HEXAGON_V3__");
4948 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4949 if(Opts.HexagonQdsp6Compat) {
4950 Builder.defineMacro("__QDSP6_V3__");
4951 Builder.defineMacro("__QDSP6_ARCH__", "3");
4952 }
4953 }
4954 else if(CPU == "hexagonv4") {
4955 Builder.defineMacro("__HEXAGON_V4__");
4956 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4957 if(Opts.HexagonQdsp6Compat) {
4958 Builder.defineMacro("__QDSP6_V4__");
4959 Builder.defineMacro("__QDSP6_ARCH__", "4");
4960 }
4961 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004962 else if(CPU == "hexagonv5") {
4963 Builder.defineMacro("__HEXAGON_V5__");
4964 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4965 if(Opts.HexagonQdsp6Compat) {
4966 Builder.defineMacro("__QDSP6_V5__");
4967 Builder.defineMacro("__QDSP6_ARCH__", "5");
4968 }
4969 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004970}
4971
4972const char * const HexagonTargetInfo::GCCRegNames[] = {
4973 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4974 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4975 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4976 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4977 "p0", "p1", "p2", "p3",
4978 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4979};
4980
4981void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4982 unsigned &NumNames) const {
4983 Names = GCCRegNames;
4984 NumNames = llvm::array_lengthof(GCCRegNames);
4985}
4986
4987
4988const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4989 { { "sp" }, "r29" },
4990 { { "fp" }, "r30" },
4991 { { "lr" }, "r31" },
4992 };
4993
4994void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4995 unsigned &NumAliases) const {
4996 Aliases = GCCRegAliases;
4997 NumAliases = llvm::array_lengthof(GCCRegAliases);
4998}
4999
5000
5001const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5002#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5003#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5004 ALL_LANGUAGES },
5005#include "clang/Basic/BuiltinsHexagon.def"
5006};
5007}
5008
5009
Chris Lattner5ba61f02006-10-14 07:39:34 +00005010namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005011// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5012class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005013 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5014 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005015 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005016public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005017 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005018
Craig Topper3164f332014-03-11 03:39:26 +00005019 bool handleTargetFeatures(std::vector<std::string> &Features,
5020 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005021 SoftFloat = false;
5022 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5023 if (Features[i] == "+soft-float")
5024 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005025 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005026 }
Craig Topper3164f332014-03-11 03:39:26 +00005027 void getTargetDefines(const LangOptions &Opts,
5028 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005029 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005030 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005031
5032 if (SoftFloat)
5033 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005034 }
Craig Topper3164f332014-03-11 03:39:26 +00005035
5036 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005037 return llvm::StringSwitch<bool>(Feature)
5038 .Case("softfloat", SoftFloat)
5039 .Case("sparc", true)
5040 .Default(false);
5041 }
Craig Topper3164f332014-03-11 03:39:26 +00005042
5043 void getTargetBuiltins(const Builtin::Info *&Records,
5044 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005045 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005046 }
Craig Topper3164f332014-03-11 03:39:26 +00005047 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005048 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005049 }
Craig Topper3164f332014-03-11 03:39:26 +00005050 void getGCCRegNames(const char * const *&Names,
5051 unsigned &NumNames) const override;
5052 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5053 unsigned &NumAliases) const override;
5054 bool validateAsmConstraint(const char *&Name,
5055 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005056 // FIXME: Implement!
5057 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005058 }
Craig Topper3164f332014-03-11 03:39:26 +00005059 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005060 // FIXME: Implement!
5061 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005062 }
5063};
5064
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005065const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005066 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5067 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5068 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5069 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5070};
5071
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005072void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5073 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005074 Names = GCCRegNames;
5075 NumNames = llvm::array_lengthof(GCCRegNames);
5076}
5077
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005078const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005079 { { "g0" }, "r0" },
5080 { { "g1" }, "r1" },
5081 { { "g2" }, "r2" },
5082 { { "g3" }, "r3" },
5083 { { "g4" }, "r4" },
5084 { { "g5" }, "r5" },
5085 { { "g6" }, "r6" },
5086 { { "g7" }, "r7" },
5087 { { "o0" }, "r8" },
5088 { { "o1" }, "r9" },
5089 { { "o2" }, "r10" },
5090 { { "o3" }, "r11" },
5091 { { "o4" }, "r12" },
5092 { { "o5" }, "r13" },
5093 { { "o6", "sp" }, "r14" },
5094 { { "o7" }, "r15" },
5095 { { "l0" }, "r16" },
5096 { { "l1" }, "r17" },
5097 { { "l2" }, "r18" },
5098 { { "l3" }, "r19" },
5099 { { "l4" }, "r20" },
5100 { { "l5" }, "r21" },
5101 { { "l6" }, "r22" },
5102 { { "l7" }, "r23" },
5103 { { "i0" }, "r24" },
5104 { { "i1" }, "r25" },
5105 { { "i2" }, "r26" },
5106 { { "i3" }, "r27" },
5107 { { "i4" }, "r28" },
5108 { { "i5" }, "r29" },
5109 { { "i6", "fp" }, "r30" },
5110 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005111};
5112
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005113void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5114 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005115 Aliases = GCCRegAliases;
5116 NumAliases = llvm::array_lengthof(GCCRegAliases);
5117}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005118
5119// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5120class SparcV8TargetInfo : public SparcTargetInfo {
5121public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005122 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005123 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005124 }
5125
Craig Topper3164f332014-03-11 03:39:26 +00005126 void getTargetDefines(const LangOptions &Opts,
5127 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005128 SparcTargetInfo::getTargetDefines(Opts, Builder);
5129 Builder.defineMacro("__sparcv8");
5130 }
5131};
5132
5133// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5134class SparcV9TargetInfo : public SparcTargetInfo {
5135public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005136 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005137 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005138 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005139 // This is an LP64 platform.
5140 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005141
5142 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005143 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005144 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005145 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005146 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005147 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005148
5149 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5150 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5151 LongDoubleWidth = 128;
5152 LongDoubleAlign = 128;
5153 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005154 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005155 }
5156
Craig Topper3164f332014-03-11 03:39:26 +00005157 void getTargetDefines(const LangOptions &Opts,
5158 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005159 SparcTargetInfo::getTargetDefines(Opts, Builder);
5160 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005161 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005162 // Solaris doesn't need these variants, but the BSDs do.
5163 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005164 Builder.defineMacro("__sparc64__");
5165 Builder.defineMacro("__sparc_v9__");
5166 Builder.defineMacro("__sparcv9__");
5167 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005168 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005169
Craig Topper3164f332014-03-11 03:39:26 +00005170 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005171 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5172 .Case("v9", true)
5173 .Case("ultrasparc", true)
5174 .Case("ultrasparc3", true)
5175 .Case("niagara", true)
5176 .Case("niagara2", true)
5177 .Case("niagara3", true)
5178 .Case("niagara4", true)
5179 .Default(false);
5180
5181 // No need to store the CPU yet. There aren't any CPU-specific
5182 // macros to define.
5183 return CPUKnown;
5184 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005185};
5186
Gabor Greif49991682008-02-21 16:29:08 +00005187} // end anonymous namespace.
5188
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005189namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005190class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005191public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005192 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5193 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005194 SizeType = UnsignedInt;
5195 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005196 }
5197};
5198} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005199
Chris Lattnerb781dc792008-05-08 05:58:21 +00005200namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005201class SystemZTargetInfo : public TargetInfo {
5202 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005203
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005204public:
5205 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5206 TLSSupported = true;
5207 IntWidth = IntAlign = 32;
5208 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5209 PointerWidth = PointerAlign = 64;
5210 LongDoubleWidth = 128;
5211 LongDoubleAlign = 64;
5212 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5213 MinGlobalAlign = 16;
5214 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5215 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5216 }
5217 void getTargetDefines(const LangOptions &Opts,
5218 MacroBuilder &Builder) const override {
5219 Builder.defineMacro("__s390__");
5220 Builder.defineMacro("__s390x__");
5221 Builder.defineMacro("__zarch__");
5222 Builder.defineMacro("__LONG_DOUBLE_128__");
5223 }
5224 void getTargetBuiltins(const Builtin::Info *&Records,
5225 unsigned &NumRecords) const override {
5226 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005227 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005228 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005229 }
5230
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005231 void getGCCRegNames(const char *const *&Names,
5232 unsigned &NumNames) const override;
5233 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5234 unsigned &NumAliases) const override {
5235 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005236 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005237 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005238 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005239 bool validateAsmConstraint(const char *&Name,
5240 TargetInfo::ConstraintInfo &info) const override;
5241 const char *getClobbers() const override {
5242 // FIXME: Is this really right?
5243 return "";
5244 }
5245 BuiltinVaListKind getBuiltinVaListKind() const override {
5246 return TargetInfo::SystemZBuiltinVaList;
5247 }
5248 bool setCPU(const std::string &Name) override {
5249 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5250 .Case("z10", true)
5251 .Case("z196", true)
5252 .Case("zEC12", true)
5253 .Default(false);
5254
5255 // No need to store the CPU yet. There aren't any CPU-specific
5256 // macros to define.
5257 return CPUKnown;
5258 }
5259};
5260
5261const char *const SystemZTargetInfo::GCCRegNames[] = {
5262 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5263 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5264 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5265 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5266};
5267
5268void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5269 unsigned &NumNames) const {
5270 Names = GCCRegNames;
5271 NumNames = llvm::array_lengthof(GCCRegNames);
5272}
5273
5274bool SystemZTargetInfo::
5275validateAsmConstraint(const char *&Name,
5276 TargetInfo::ConstraintInfo &Info) const {
5277 switch (*Name) {
5278 default:
5279 return false;
5280
5281 case 'a': // Address register
5282 case 'd': // Data register (equivalent to 'r')
5283 case 'f': // Floating-point register
5284 Info.setAllowsRegister();
5285 return true;
5286
5287 case 'I': // Unsigned 8-bit constant
5288 case 'J': // Unsigned 12-bit constant
5289 case 'K': // Signed 16-bit constant
5290 case 'L': // Signed 20-bit displacement (on all targets we support)
5291 case 'M': // 0x7fffffff
5292 return true;
5293
5294 case 'Q': // Memory with base and unsigned 12-bit displacement
5295 case 'R': // Likewise, plus an index
5296 case 'S': // Memory with base and signed 20-bit displacement
5297 case 'T': // Likewise, plus an index
5298 Info.setAllowsMemory();
5299 return true;
5300 }
5301}
Ulrich Weigand47445072013-05-06 16:26:41 +00005302}
5303
5304namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005305 class MSP430TargetInfo : public TargetInfo {
5306 static const char * const GCCRegNames[];
5307 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005308 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005309 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005310 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005311 IntWidth = 16; IntAlign = 16;
5312 LongWidth = 32; LongLongWidth = 64;
5313 LongAlign = LongLongAlign = 16;
5314 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005315 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005316 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005317 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005318 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005319 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005320 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005321 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005322 }
5323 void getTargetDefines(const LangOptions &Opts,
5324 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005325 Builder.defineMacro("MSP430");
5326 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005327 // FIXME: defines for different 'flavours' of MCU
5328 }
Craig Topper3164f332014-03-11 03:39:26 +00005329 void getTargetBuiltins(const Builtin::Info *&Records,
5330 unsigned &NumRecords) const override {
5331 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005332 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005333 NumRecords = 0;
5334 }
Craig Topper3164f332014-03-11 03:39:26 +00005335 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005336 return Feature == "msp430";
5337 }
Craig Topper3164f332014-03-11 03:39:26 +00005338 void getGCCRegNames(const char * const *&Names,
5339 unsigned &NumNames) const override;
5340 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5341 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005342 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005343 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005344 NumAliases = 0;
5345 }
Eric Christopher917e9522014-11-18 22:36:15 +00005346 bool
5347 validateAsmConstraint(const char *&Name,
5348 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005349 // No target constraints for now.
5350 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005351 }
Craig Topper3164f332014-03-11 03:39:26 +00005352 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005353 // FIXME: Is this really right?
5354 return "";
5355 }
Craig Topper3164f332014-03-11 03:39:26 +00005356 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005357 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005358 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005359 }
5360 };
5361
5362 const char * const MSP430TargetInfo::GCCRegNames[] = {
5363 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5364 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5365 };
5366
5367 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5368 unsigned &NumNames) const {
5369 Names = GCCRegNames;
5370 NumNames = llvm::array_lengthof(GCCRegNames);
5371 }
5372}
5373
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005374namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005375
Mike Stump11289f42009-09-09 15:08:12 +00005376 // LLVM and Clang cannot be used directly to output native binaries for
5377 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005378 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005379 //
5380 // TCE uses the llvm bitcode as input and uses it for generating customized
5381 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005382 // publicly available in http://tce.cs.tut.fi
5383
Eli Friedman1f191002011-10-07 19:51:42 +00005384 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5385 3, // opencl_global
5386 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005387 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005388 // FIXME: generic has to be added to the target
5389 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005390 0, // cuda_device
5391 0, // cuda_constant
5392 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005393 };
5394
Eli Friedmana9c3d712009-08-19 20:47:07 +00005395 class TCETargetInfo : public TargetInfo{
5396 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005397 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005398 TLSSupported = false;
5399 IntWidth = 32;
5400 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005401 PointerWidth = 32;
5402 IntAlign = 32;
5403 LongAlign = LongLongAlign = 32;
5404 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005405 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005406 SizeType = UnsignedInt;
5407 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005408 IntPtrType = SignedInt;
5409 PtrDiffType = SignedInt;
5410 FloatWidth = 32;
5411 FloatAlign = 32;
5412 DoubleWidth = 32;
5413 DoubleAlign = 32;
5414 LongDoubleWidth = 32;
5415 LongDoubleAlign = 32;
5416 FloatFormat = &llvm::APFloat::IEEEsingle;
5417 DoubleFormat = &llvm::APFloat::IEEEsingle;
5418 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005419 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5420 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005421 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005422 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005423 }
5424
Craig Topper3164f332014-03-11 03:39:26 +00005425 void getTargetDefines(const LangOptions &Opts,
5426 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005427 DefineStd(Builder, "tce", Opts);
5428 Builder.defineMacro("__TCE__");
5429 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005430 }
Craig Topper3164f332014-03-11 03:39:26 +00005431 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005432 return Feature == "tce";
5433 }
Craig Topper3164f332014-03-11 03:39:26 +00005434
5435 void getTargetBuiltins(const Builtin::Info *&Records,
5436 unsigned &NumRecords) const override {}
5437 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005438 return "";
5439 }
Craig Topper3164f332014-03-11 03:39:26 +00005440 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005441 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005442 }
Craig Topper3164f332014-03-11 03:39:26 +00005443 void getGCCRegNames(const char * const *&Names,
5444 unsigned &NumNames) const override {}
5445 bool validateAsmConstraint(const char *&Name,
5446 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005447 return true;
5448 }
Craig Topper3164f332014-03-11 03:39:26 +00005449 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5450 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005451 };
5452}
5453
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005454namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005455class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005456 virtual void setDescriptionString() = 0;
5457
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005458 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005459 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005460 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005461 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005462 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005463 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005464 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005465 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005466 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005467 enum DspRevEnum {
5468 NoDSP, DSP1, DSP2
5469 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005470 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005471
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005472protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005473 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005474 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005475
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005477 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5478 const std::string &CPUStr)
5479 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005480 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005481 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005482
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005483 bool isNaN2008Default() const {
5484 return CPU == "mips32r6" || CPU == "mips64r6";
5485 }
5486
5487 bool isFP64Default() const {
5488 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5489 }
5490
Alp Toker4925ba72014-06-07 23:30:42 +00005491 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005492 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005493 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5494 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005495 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005496 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005497 .Case("mips1", IsMips32)
5498 .Case("mips2", IsMips32)
5499 .Case("mips3", true)
5500 .Case("mips4", true)
5501 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005502 .Case("mips32", IsMips32)
5503 .Case("mips32r2", IsMips32)
5504 .Case("mips32r6", IsMips32)
5505 .Case("mips64", true)
5506 .Case("mips64r2", true)
5507 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005508 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005509 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005510 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005511 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005512 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005513 // The backend enables certain ABI's by default according to the
5514 // architecture.
5515 // Disable both possible defaults so that we don't end up with multiple
5516 // ABI's selected and trigger an assertion.
5517 Features["o32"] = false;
5518 Features["n64"] = false;
5519
Eric Christopher0b26a612010-03-02 02:41:08 +00005520 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005521 if (CPU == "octeon")
5522 Features["mips64r2"] = Features["cnmips"] = true;
5523 else
5524 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005525 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005526
Craig Topper3164f332014-03-11 03:39:26 +00005527 void getTargetDefines(const LangOptions &Opts,
5528 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005529 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005530 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005531 if (Opts.GNUMode)
5532 Builder.defineMacro("mips");
5533
Simon Atanasyan683535b2012-08-29 19:14:58 +00005534 Builder.defineMacro("__REGISTER_PREFIX__", "");
5535
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005536 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005537 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005538 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005539 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005540 case SoftFloat:
5541 Builder.defineMacro("__mips_soft_float", Twine(1));
5542 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005543 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005544
Simon Atanasyan16071912013-04-14 14:07:30 +00005545 if (IsSingleFloat)
5546 Builder.defineMacro("__mips_single_float", Twine(1));
5547
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005548 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5549 Builder.defineMacro("_MIPS_FPSET",
5550 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5551
Simon Atanasyan72244b62012-07-05 16:06:06 +00005552 if (IsMips16)
5553 Builder.defineMacro("__mips16", Twine(1));
5554
Simon Atanasyan60777612013-04-14 14:07:51 +00005555 if (IsMicromips)
5556 Builder.defineMacro("__mips_micromips", Twine(1));
5557
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005558 if (IsNan2008)
5559 Builder.defineMacro("__mips_nan2008", Twine(1));
5560
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005561 switch (DspRev) {
5562 default:
5563 break;
5564 case DSP1:
5565 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5566 Builder.defineMacro("__mips_dsp", Twine(1));
5567 break;
5568 case DSP2:
5569 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5570 Builder.defineMacro("__mips_dspr2", Twine(1));
5571 Builder.defineMacro("__mips_dsp", Twine(1));
5572 break;
5573 }
5574
Jack Carter44ff1e52013-08-12 17:20:29 +00005575 if (HasMSA)
5576 Builder.defineMacro("__mips_msa", Twine(1));
5577
Simon Atanasyan26f19672012-04-05 19:28:31 +00005578 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5579 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5580 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005581
5582 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5583 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005584 }
5585
Craig Topper3164f332014-03-11 03:39:26 +00005586 void getTargetBuiltins(const Builtin::Info *&Records,
5587 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005588 Records = BuiltinInfo;
5589 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005590 }
Craig Topper3164f332014-03-11 03:39:26 +00005591 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005592 return llvm::StringSwitch<bool>(Feature)
5593 .Case("mips", true)
5594 .Case("fp64", HasFP64)
5595 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005596 }
Craig Topper3164f332014-03-11 03:39:26 +00005597 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005598 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005599 }
Craig Topper3164f332014-03-11 03:39:26 +00005600 void getGCCRegNames(const char * const *&Names,
5601 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005602 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005603 // CPU register names
5604 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005605 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5606 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5607 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005608 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5609 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005610 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5611 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5612 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5613 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005614 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005615 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005616 "$fcc5","$fcc6","$fcc7",
5617 // MSA register names
5618 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5619 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5620 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5621 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5622 // MSA control register names
5623 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5624 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005625 };
5626 Names = GCCRegNames;
5627 NumNames = llvm::array_lengthof(GCCRegNames);
5628 }
Craig Topper3164f332014-03-11 03:39:26 +00005629 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5630 unsigned &NumAliases) const override = 0;
5631 bool validateAsmConstraint(const char *&Name,
5632 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005633 switch (*Name) {
5634 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005635 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005636 case 'r': // CPU registers.
5637 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005638 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005639 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005640 case 'c': // $25 for indirect jumps
5641 case 'l': // lo register
5642 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005643 Info.setAllowsRegister();
5644 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005645 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005646 Info.setAllowsMemory();
5647 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005648 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005649 }
5650
Craig Topper3164f332014-03-11 03:39:26 +00005651 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005652 // FIXME: Implement!
5653 return "";
5654 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005655
Craig Topper3164f332014-03-11 03:39:26 +00005656 bool handleTargetFeatures(std::vector<std::string> &Features,
5657 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005658 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005659 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005660 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005661 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005662 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005663 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005664 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005665
5666 for (std::vector<std::string>::iterator it = Features.begin(),
5667 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005668 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005669 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005670 else if (*it == "+soft-float")
5671 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005672 else if (*it == "+mips16")
5673 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005674 else if (*it == "+micromips")
5675 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005676 else if (*it == "+dsp")
5677 DspRev = std::max(DspRev, DSP1);
5678 else if (*it == "+dspr2")
5679 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005680 else if (*it == "+msa")
5681 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005682 else if (*it == "+fp64")
5683 HasFP64 = true;
5684 else if (*it == "-fp64")
5685 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005686 else if (*it == "+nan2008")
5687 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005688 else if (*it == "-nan2008")
5689 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005690 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005691
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005692 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005693 std::vector<std::string>::iterator it =
5694 std::find(Features.begin(), Features.end(), "+soft-float");
5695 if (it != Features.end())
5696 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005697
Akira Hatanaka9064e362013-10-29 18:30:33 +00005698 setDescriptionString();
5699
Rafael Espindolaeb265472013-08-21 21:59:03 +00005700 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005701 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005702
Craig Topper3164f332014-03-11 03:39:26 +00005703 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005704 if (RegNo == 0) return 4;
5705 if (RegNo == 1) return 5;
5706 return -1;
5707 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005708
5709 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005710};
5711
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005712const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5713#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5714#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5715 ALL_LANGUAGES },
5716#include "clang/Basic/BuiltinsMips.def"
5717};
5718
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005719class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005720public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005721 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005722 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005723 SizeType = UnsignedInt;
5724 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005725 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005726 }
Craig Topper3164f332014-03-11 03:39:26 +00005727 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005728 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005729 ABI = Name;
5730 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005731 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005732 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005733 }
Craig Topper3164f332014-03-11 03:39:26 +00005734 void getTargetDefines(const LangOptions &Opts,
5735 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005736 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005737
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005738 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005739 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5740
5741 const std::string& CPUStr = getCPU();
5742 if (CPUStr == "mips32")
5743 Builder.defineMacro("__mips_isa_rev", "1");
5744 else if (CPUStr == "mips32r2")
5745 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005746
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005747 if (ABI == "o32") {
5748 Builder.defineMacro("__mips_o32");
5749 Builder.defineMacro("_ABIO32", "1");
5750 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5751 }
5752 else if (ABI == "eabi")
5753 Builder.defineMacro("__mips_eabi");
5754 else
David Blaikie83d382b2011-09-23 05:06:16 +00005755 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005756 }
Craig Topper3164f332014-03-11 03:39:26 +00005757 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5758 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005759 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5760 { { "at" }, "$1" },
5761 { { "v0" }, "$2" },
5762 { { "v1" }, "$3" },
5763 { { "a0" }, "$4" },
5764 { { "a1" }, "$5" },
5765 { { "a2" }, "$6" },
5766 { { "a3" }, "$7" },
5767 { { "t0" }, "$8" },
5768 { { "t1" }, "$9" },
5769 { { "t2" }, "$10" },
5770 { { "t3" }, "$11" },
5771 { { "t4" }, "$12" },
5772 { { "t5" }, "$13" },
5773 { { "t6" }, "$14" },
5774 { { "t7" }, "$15" },
5775 { { "s0" }, "$16" },
5776 { { "s1" }, "$17" },
5777 { { "s2" }, "$18" },
5778 { { "s3" }, "$19" },
5779 { { "s4" }, "$20" },
5780 { { "s5" }, "$21" },
5781 { { "s6" }, "$22" },
5782 { { "s7" }, "$23" },
5783 { { "t8" }, "$24" },
5784 { { "t9" }, "$25" },
5785 { { "k0" }, "$26" },
5786 { { "k1" }, "$27" },
5787 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005788 { { "sp","$sp" }, "$29" },
5789 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005790 { { "ra" }, "$31" }
5791 };
5792 Aliases = GCCRegAliases;
5793 NumAliases = llvm::array_lengthof(GCCRegAliases);
5794 }
5795};
5796
5797class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005798 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005799 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005800 }
5801
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005802public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005803 Mips32EBTargetInfo(const llvm::Triple &Triple)
5804 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005805 }
Craig Topper3164f332014-03-11 03:39:26 +00005806 void getTargetDefines(const LangOptions &Opts,
5807 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005808 DefineStd(Builder, "MIPSEB", Opts);
5809 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005810 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005811 }
5812};
5813
5814class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005815 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005816 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005817 }
5818
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005819public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005820 Mips32ELTargetInfo(const llvm::Triple &Triple)
5821 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005822 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005823 }
Craig Topper3164f332014-03-11 03:39:26 +00005824 void getTargetDefines(const LangOptions &Opts,
5825 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005826 DefineStd(Builder, "MIPSEL", Opts);
5827 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005828 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005829 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005830};
Akira Hatanakabef17452011-09-20 19:21:49 +00005831
5832class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005833public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005834 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005835 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005836 LongDoubleWidth = LongDoubleAlign = 128;
5837 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005838 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5839 LongDoubleWidth = LongDoubleAlign = 64;
5840 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5841 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005842 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005843 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005844 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005845 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005846
5847 void setN64ABITypes() {
5848 LongWidth = LongAlign = 64;
5849 PointerWidth = PointerAlign = 64;
5850 SizeType = UnsignedLong;
5851 PtrDiffType = SignedLong;
5852 }
5853
5854 void setN32ABITypes() {
5855 LongWidth = LongAlign = 32;
5856 PointerWidth = PointerAlign = 32;
5857 SizeType = UnsignedInt;
5858 PtrDiffType = SignedInt;
5859 }
5860
Craig Topper3164f332014-03-11 03:39:26 +00005861 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005862 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005863 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005864 ABI = Name;
5865 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005866 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005867 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005868 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005869 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005870 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005871 }
5872 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005873 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005874
Craig Topper3164f332014-03-11 03:39:26 +00005875 void getTargetDefines(const LangOptions &Opts,
5876 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005877 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005878
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005879 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005880 Builder.defineMacro("__mips64");
5881 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005882 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5883
5884 const std::string& CPUStr = getCPU();
5885 if (CPUStr == "mips64")
5886 Builder.defineMacro("__mips_isa_rev", "1");
5887 else if (CPUStr == "mips64r2")
5888 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005889
Akira Hatanakabef17452011-09-20 19:21:49 +00005890 if (ABI == "n32") {
5891 Builder.defineMacro("__mips_n32");
5892 Builder.defineMacro("_ABIN32", "2");
5893 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5894 }
5895 else if (ABI == "n64") {
5896 Builder.defineMacro("__mips_n64");
5897 Builder.defineMacro("_ABI64", "3");
5898 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5899 }
5900 else
David Blaikie83d382b2011-09-23 05:06:16 +00005901 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005902 }
Craig Topper3164f332014-03-11 03:39:26 +00005903 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5904 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005905 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5906 { { "at" }, "$1" },
5907 { { "v0" }, "$2" },
5908 { { "v1" }, "$3" },
5909 { { "a0" }, "$4" },
5910 { { "a1" }, "$5" },
5911 { { "a2" }, "$6" },
5912 { { "a3" }, "$7" },
5913 { { "a4" }, "$8" },
5914 { { "a5" }, "$9" },
5915 { { "a6" }, "$10" },
5916 { { "a7" }, "$11" },
5917 { { "t0" }, "$12" },
5918 { { "t1" }, "$13" },
5919 { { "t2" }, "$14" },
5920 { { "t3" }, "$15" },
5921 { { "s0" }, "$16" },
5922 { { "s1" }, "$17" },
5923 { { "s2" }, "$18" },
5924 { { "s3" }, "$19" },
5925 { { "s4" }, "$20" },
5926 { { "s5" }, "$21" },
5927 { { "s6" }, "$22" },
5928 { { "s7" }, "$23" },
5929 { { "t8" }, "$24" },
5930 { { "t9" }, "$25" },
5931 { { "k0" }, "$26" },
5932 { { "k1" }, "$27" },
5933 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005934 { { "sp","$sp" }, "$29" },
5935 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005936 { { "ra" }, "$31" }
5937 };
5938 Aliases = GCCRegAliases;
5939 NumAliases = llvm::array_lengthof(GCCRegAliases);
5940 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005941
5942 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005943};
5944
5945class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005946 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005947 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005948 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 +00005949 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005950 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005951
Akira Hatanakabef17452011-09-20 19:21:49 +00005952 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005953
Akira Hatanakabef17452011-09-20 19:21:49 +00005954public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005955 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005956 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005957 void getTargetDefines(const LangOptions &Opts,
5958 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005959 DefineStd(Builder, "MIPSEB", Opts);
5960 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005961 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005962 }
5963};
5964
5965class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005966 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005967 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005968 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 +00005969 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005970 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005971 }
5972public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005973 Mips64ELTargetInfo(const llvm::Triple &Triple)
5974 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005975 // Default ABI is n64.
5976 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005977 }
Craig Topper3164f332014-03-11 03:39:26 +00005978 void getTargetDefines(const LangOptions &Opts,
5979 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005980 DefineStd(Builder, "MIPSEL", Opts);
5981 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005982 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005983 }
5984};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005985} // end anonymous namespace.
5986
Ivan Krasindd7403e2011-08-24 20:22:22 +00005987namespace {
5988class PNaClTargetInfo : public TargetInfo {
5989public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005990 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005991 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005992 this->UserLabelPrefix = "";
5993 this->LongAlign = 32;
5994 this->LongWidth = 32;
5995 this->PointerAlign = 32;
5996 this->PointerWidth = 32;
5997 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005998 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005999 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006000 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006001 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006002 this->SizeType = TargetInfo::UnsignedInt;
6003 this->PtrDiffType = TargetInfo::SignedInt;
6004 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006005 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006006 }
6007
Craig Topper3164f332014-03-11 03:39:26 +00006008 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006009 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006010 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006011 Builder.defineMacro("__le32__");
6012 Builder.defineMacro("__pnacl__");
6013 }
Craig Topper3164f332014-03-11 03:39:26 +00006014 void getTargetDefines(const LangOptions &Opts,
6015 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006016 getArchDefines(Opts, Builder);
6017 }
Craig Topper3164f332014-03-11 03:39:26 +00006018 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006019 return Feature == "pnacl";
6020 }
Craig Topper3164f332014-03-11 03:39:26 +00006021 void getTargetBuiltins(const Builtin::Info *&Records,
6022 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006023 }
Craig Topper3164f332014-03-11 03:39:26 +00006024 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006025 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006026 }
Craig Topper3164f332014-03-11 03:39:26 +00006027 void getGCCRegNames(const char * const *&Names,
6028 unsigned &NumNames) const override;
6029 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6030 unsigned &NumAliases) const override;
6031 bool validateAsmConstraint(const char *&Name,
6032 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006033 return false;
6034 }
6035
Craig Topper3164f332014-03-11 03:39:26 +00006036 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006037 return "";
6038 }
6039};
6040
6041void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6042 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006043 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006044 NumNames = 0;
6045}
6046
6047void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6048 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006049 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006050 NumAliases = 0;
6051}
6052} // end anonymous namespace.
6053
Guy Benyeib798fc92012-12-11 21:38:14 +00006054namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006055class Le64TargetInfo : public TargetInfo {
6056 static const Builtin::Info BuiltinInfo[];
6057
6058public:
6059 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6060 BigEndian = false;
6061 NoAsmVariants = true;
6062 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6063 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6064 DescriptionString =
6065 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6066 }
6067
6068 void getTargetDefines(const LangOptions &Opts,
6069 MacroBuilder &Builder) const override {
6070 DefineStd(Builder, "unix", Opts);
6071 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6072 Builder.defineMacro("__ELF__");
6073 }
6074 void getTargetBuiltins(const Builtin::Info *&Records,
6075 unsigned &NumRecords) const override {
6076 Records = BuiltinInfo;
6077 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6078 }
6079 BuiltinVaListKind getBuiltinVaListKind() const override {
6080 return TargetInfo::PNaClABIBuiltinVaList;
6081 }
6082 const char *getClobbers() const override { return ""; }
6083 void getGCCRegNames(const char *const *&Names,
6084 unsigned &NumNames) const override {
6085 Names = nullptr;
6086 NumNames = 0;
6087 }
6088 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6089 unsigned &NumAliases) const override {
6090 Aliases = nullptr;
6091 NumAliases = 0;
6092 }
6093 bool validateAsmConstraint(const char *&Name,
6094 TargetInfo::ConstraintInfo &Info) const override {
6095 return false;
6096 }
6097
6098 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006099};
6100} // end anonymous namespace.
6101
6102const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6103#define BUILTIN(ID, TYPE, ATTRS) \
6104 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6105#include "clang/Basic/BuiltinsLe64.def"
6106};
6107
6108namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006109 static const unsigned SPIRAddrSpaceMap[] = {
6110 1, // opencl_global
6111 3, // opencl_local
6112 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006113 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006114 0, // cuda_device
6115 0, // cuda_constant
6116 0 // cuda_shared
6117 };
6118 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006119 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006120 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006121 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6122 "SPIR target must use unknown OS");
6123 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6124 "SPIR target must use unknown environment type");
6125 BigEndian = false;
6126 TLSSupported = false;
6127 LongWidth = LongAlign = 64;
6128 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006129 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006130 // Define available target features
6131 // These must be defined in sorted order!
6132 NoAsmVariants = true;
6133 }
Craig Topper3164f332014-03-11 03:39:26 +00006134 void getTargetDefines(const LangOptions &Opts,
6135 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006136 DefineStd(Builder, "SPIR", Opts);
6137 }
Craig Topper3164f332014-03-11 03:39:26 +00006138 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006139 return Feature == "spir";
6140 }
Craig Topper3164f332014-03-11 03:39:26 +00006141
6142 void getTargetBuiltins(const Builtin::Info *&Records,
6143 unsigned &NumRecords) const override {}
6144 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006145 return "";
6146 }
Craig Topper3164f332014-03-11 03:39:26 +00006147 void getGCCRegNames(const char * const *&Names,
6148 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006149 bool
6150 validateAsmConstraint(const char *&Name,
6151 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006152 return true;
6153 }
Craig Topper3164f332014-03-11 03:39:26 +00006154 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6155 unsigned &NumAliases) const override {}
6156 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006157 return TargetInfo::VoidPtrBuiltinVaList;
6158 }
6159 };
6160
6161
6162 class SPIR32TargetInfo : public SPIRTargetInfo {
6163 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006164 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006165 PointerWidth = PointerAlign = 32;
6166 SizeType = TargetInfo::UnsignedInt;
6167 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6168 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006169 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6170 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006171 }
Craig Topper3164f332014-03-11 03:39:26 +00006172 void getTargetDefines(const LangOptions &Opts,
6173 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006174 DefineStd(Builder, "SPIR32", Opts);
6175 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006176 };
6177
6178 class SPIR64TargetInfo : public SPIRTargetInfo {
6179 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006180 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006181 PointerWidth = PointerAlign = 64;
6182 SizeType = TargetInfo::UnsignedLong;
6183 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006184 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6185 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006186 }
Craig Topper3164f332014-03-11 03:39:26 +00006187 void getTargetDefines(const LangOptions &Opts,
6188 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006189 DefineStd(Builder, "SPIR64", Opts);
6190 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006191 };
6192}
6193
Robert Lytton0e076492013-08-13 09:43:10 +00006194namespace {
6195class XCoreTargetInfo : public TargetInfo {
6196 static const Builtin::Info BuiltinInfo[];
6197public:
6198 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6199 BigEndian = false;
6200 NoAsmVariants = true;
6201 LongLongAlign = 32;
6202 SuitableAlign = 32;
6203 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006204 SizeType = UnsignedInt;
6205 PtrDiffType = SignedInt;
6206 IntPtrType = SignedInt;
6207 WCharType = UnsignedChar;
6208 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006209 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006210 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 +00006211 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006212 }
Craig Topper3164f332014-03-11 03:39:26 +00006213 void getTargetDefines(const LangOptions &Opts,
6214 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006215 Builder.defineMacro("__XS1B__");
6216 }
Craig Topper3164f332014-03-11 03:39:26 +00006217 void getTargetBuiltins(const Builtin::Info *&Records,
6218 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006219 Records = BuiltinInfo;
6220 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6221 }
Craig Topper3164f332014-03-11 03:39:26 +00006222 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006223 return TargetInfo::VoidPtrBuiltinVaList;
6224 }
Craig Topper3164f332014-03-11 03:39:26 +00006225 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006226 return "";
6227 }
Craig Topper3164f332014-03-11 03:39:26 +00006228 void getGCCRegNames(const char * const *&Names,
6229 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006230 static const char * const GCCRegNames[] = {
6231 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6232 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6233 };
6234 Names = GCCRegNames;
6235 NumNames = llvm::array_lengthof(GCCRegNames);
6236 }
Craig Topper3164f332014-03-11 03:39:26 +00006237 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6238 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006239 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006240 NumAliases = 0;
6241 }
Craig Topper3164f332014-03-11 03:39:26 +00006242 bool validateAsmConstraint(const char *&Name,
6243 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006244 return false;
6245 }
Craig Topper3164f332014-03-11 03:39:26 +00006246 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006247 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6248 return (RegNo < 2)? RegNo : -1;
6249 }
Robert Lytton0e076492013-08-13 09:43:10 +00006250};
6251
6252const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6253#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6254#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6255 ALL_LANGUAGES },
6256#include "clang/Basic/BuiltinsXCore.def"
6257};
6258} // end anonymous namespace.
6259
Ivan Krasindd7403e2011-08-24 20:22:22 +00006260
Chris Lattner5ba61f02006-10-14 07:39:34 +00006261//===----------------------------------------------------------------------===//
6262// Driver code
6263//===----------------------------------------------------------------------===//
6264
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006265static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006266 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006267
Daniel Dunbar52322032009-08-18 05:47:58 +00006268 switch (Triple.getArch()) {
6269 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006270 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006271
Tim Northover2a0783d2014-05-30 14:14:07 +00006272 case llvm::Triple::xcore:
6273 return new XCoreTargetInfo(Triple);
6274
6275 case llvm::Triple::hexagon:
6276 return new HexagonTargetInfo(Triple);
6277
6278 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006279 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006280 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006281
6282 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006283 case llvm::Triple::FreeBSD:
6284 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006285 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006286 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006287 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006288 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006289 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006290 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006291 }
6292
Christian Pirker9b019ae2014-02-25 13:51:00 +00006293 case llvm::Triple::aarch64_be:
6294 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006295 case llvm::Triple::FreeBSD:
6296 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006297 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006298 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006299 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006300 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006301 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006302 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006303 }
6304
Daniel Dunbar52322032009-08-18 05:47:58 +00006305 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006306 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006307 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006308 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006309
Daniel Dunbar52322032009-08-18 05:47:58 +00006310 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006311 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006312 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006313 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006314 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006315 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006316 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006317 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006318 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006319 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006320 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006321 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006322 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006323 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006324 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006325 case llvm::Triple::Win32:
6326 switch (Triple.getEnvironment()) {
6327 default:
6328 return new ARMleTargetInfo(Triple);
6329 case llvm::Triple::Itanium:
6330 return new ItaniumWindowsARMleTargetInfo(Triple);
6331 case llvm::Triple::MSVC:
6332 return new MicrosoftARMleTargetInfo(Triple);
6333 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006334 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006335 return new ARMleTargetInfo(Triple);
6336 }
6337
6338 case llvm::Triple::armeb:
6339 case llvm::Triple::thumbeb:
6340 if (Triple.isOSDarwin())
6341 return new DarwinARMTargetInfo(Triple);
6342
6343 switch (os) {
6344 case llvm::Triple::Linux:
6345 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6346 case llvm::Triple::FreeBSD:
6347 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6348 case llvm::Triple::NetBSD:
6349 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6350 case llvm::Triple::OpenBSD:
6351 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6352 case llvm::Triple::Bitrig:
6353 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6354 case llvm::Triple::RTEMS:
6355 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6356 case llvm::Triple::NaCl:
6357 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6358 default:
6359 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006360 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006361
Daniel Dunbar52322032009-08-18 05:47:58 +00006362 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006363 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006364
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006365 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006366 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006367 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006368 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006369 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006370 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006371 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006373 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006374 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006375 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006376 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006377 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006378
6379 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006380 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006381 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006383 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006385 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006386 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006387 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006389 case llvm::Triple::NaCl:
6390 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006391 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006392 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006393 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006394
Akira Hatanakabef17452011-09-20 19:21:49 +00006395 case llvm::Triple::mips64:
6396 switch (os) {
6397 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006398 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006399 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006400 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006401 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006402 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006403 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006404 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006405 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006406 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006407 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006408 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006409 }
6410
6411 case llvm::Triple::mips64el:
6412 switch (os) {
6413 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006414 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006415 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006416 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006417 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006418 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006419 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006420 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006421 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006422 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006423 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006424 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006425 }
6426
Ivan Krasindd7403e2011-08-24 20:22:22 +00006427 case llvm::Triple::le32:
6428 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006429 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006430 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006431 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006432 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006433 }
6434
JF Bastien643817d2014-09-12 17:52:47 +00006435 case llvm::Triple::le64:
6436 return new Le64TargetInfo(Triple);
6437
Daniel Dunbar52322032009-08-18 05:47:58 +00006438 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006439 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006440 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006441 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006442 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006443 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006444 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006445 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006446 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006447 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006448 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006449 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006450 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006451 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006452 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006453 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006454 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006455
6456 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006457 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006459 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006460 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006461 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006462 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006463 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006464 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006465 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006466 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006467 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006468 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006469 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006470 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006471
Bill Schmidt778d3872013-07-26 01:36:11 +00006472 case llvm::Triple::ppc64le:
6473 switch (os) {
6474 case llvm::Triple::Linux:
6475 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6476 default:
6477 return new PPC64TargetInfo(Triple);
6478 }
6479
Peter Collingbournec947aae2012-05-20 23:28:41 +00006480 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006481 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006482 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006483 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006484
Eli Friedmand13b41e2012-10-12 23:32:00 +00006485 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006486 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006487
Daniel Dunbar52322032009-08-18 05:47:58 +00006488 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006489 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006490 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006492 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006493 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006494 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006495 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006496 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006497 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006498 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006499 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006500 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006501 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006502 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006503
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006504 case llvm::Triple::sparcv9:
6505 switch (os) {
6506 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006508 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006509 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006510 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006511 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006512 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006513 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006514 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006515 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006516 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006517 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006518 }
6519
Ulrich Weigand47445072013-05-06 16:26:41 +00006520 case llvm::Triple::systemz:
6521 switch (os) {
6522 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006523 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006524 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006525 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006526 }
6527
Eli Friedmana9c3d712009-08-19 20:47:07 +00006528 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006529 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006530
Daniel Dunbar52322032009-08-18 05:47:58 +00006531 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006532 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006533 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006534
Daniel Dunbar52322032009-08-18 05:47:58 +00006535 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006536 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006537 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006538 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006539 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006540 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006541 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006542 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006543 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006544 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006545 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006546 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006547 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006548 case llvm::Triple::KFreeBSD:
6549 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006550 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006551 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006552 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006553 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006554 case llvm::Triple::Win32: {
6555 switch (Triple.getEnvironment()) {
6556 default:
6557 return new X86_32TargetInfo(Triple);
6558 case llvm::Triple::Cygnus:
6559 return new CygwinX86_32TargetInfo(Triple);
6560 case llvm::Triple::GNU:
6561 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006562 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006563 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006564 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006565 }
6566 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006567 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006568 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006569 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006570 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006571 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006572 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006573 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006574 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006575 }
6576
6577 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006578 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006579 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006580
Daniel Dunbar52322032009-08-18 05:47:58 +00006581 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006582 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006583 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006584 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006585 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006586 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006587 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006588 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006589 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006590 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006591 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006592 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006593 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006594 case llvm::Triple::KFreeBSD:
6595 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006596 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006597 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006598 case llvm::Triple::Win32: {
6599 switch (Triple.getEnvironment()) {
6600 default:
6601 return new X86_64TargetInfo(Triple);
6602 case llvm::Triple::GNU:
6603 return new MinGWX86_64TargetInfo(Triple);
6604 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006605 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006606 }
6607 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006608 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006609 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006610 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006611 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006612 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006613
6614 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006615 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006616 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006617 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006618 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006619 }
6620 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006621 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006622 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006623 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006624 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006625 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006626 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006627}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006628
6629/// CreateTargetInfo - Return the target info object for the specified target
6630/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006631TargetInfo *
6632TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6633 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006634 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006635
6636 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006637 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006638 if (!Target) {
6639 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006640 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006641 }
Alp Toker80758082014-07-06 05:26:44 +00006642 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006643
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006644 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006645 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6646 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006647 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006648 }
6649
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006650 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006651 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6652 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006653 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006654 }
6655
Rafael Espindolaeb265472013-08-21 21:59:03 +00006656 // Set the fp math unit.
6657 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6658 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006659 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006660 }
6661
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006662 // Compute the default target features, we need the target to handle this
6663 // because features may have dependencies on one another.
6664 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006665 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006666
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006667 // Apply the user specified deltas.
6668 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6669 I < N; ++I) {
6670 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006671 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006672 bool Enabled = Name[0] == '+';
6673 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006674 }
6675
6676 // Add the features to the compile options.
6677 //
6678 // FIXME: If we are completely confident that we have the right set, we only
6679 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006680 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006681 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6682 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006683 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006684 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006685 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006686
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006687 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006688}