blob: a9cbfb8538bda059071f780b83627b44c54d7031 [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:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000320 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000321 this->UserLabelPrefix = "";
322 }
323};
324
Chris Lattner3e2ee142010-07-07 16:01:42 +0000325// Minix Target
326template<typename Target>
327class MinixTargetInfo : public OSTargetInfo<Target> {
328protected:
Craig Topper3164f332014-03-11 03:39:26 +0000329 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
330 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000331 // Minix defines
332
333 Builder.defineMacro("__minix", "3");
334 Builder.defineMacro("_EM_WSIZE", "4");
335 Builder.defineMacro("_EM_PSIZE", "4");
336 Builder.defineMacro("_EM_SSIZE", "2");
337 Builder.defineMacro("_EM_LSIZE", "4");
338 Builder.defineMacro("_EM_FSIZE", "4");
339 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000340 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000341 DefineStd(Builder, "unix", Opts);
342 }
343public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000344 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
345 this->UserLabelPrefix = "";
346 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000347};
348
Torok Edwinb2b37c62009-06-30 17:10:35 +0000349// Linux target
350template<typename Target>
351class LinuxTargetInfo : public OSTargetInfo<Target> {
352protected:
Craig Topper3164f332014-03-11 03:39:26 +0000353 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
354 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000355 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000356 DefineStd(Builder, "unix", Opts);
357 DefineStd(Builder, "linux", Opts);
358 Builder.defineMacro("__gnu_linux__");
359 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000360 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000361 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000362 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000363 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000364 if (Opts.CPlusPlus)
365 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000366 }
367public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000368 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000369 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000370 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000371
372 switch (Triple.getArch()) {
373 default:
374 break;
375 case llvm::Triple::ppc:
376 case llvm::Triple::ppc64:
377 case llvm::Triple::ppc64le:
378 this->MCountName = "_mcount";
379 break;
380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000382
Craig Topper3164f332014-03-11 03:39:26 +0000383 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000384 return ".text.startup";
385 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000386};
387
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000388// NetBSD Target
389template<typename Target>
390class NetBSDTargetInfo : public OSTargetInfo<Target> {
391protected:
Craig Topper3164f332014-03-11 03:39:26 +0000392 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
393 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000394 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 Builder.defineMacro("__NetBSD__");
396 Builder.defineMacro("__unix__");
397 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000398 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000399 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000400
401 switch (Triple.getArch()) {
402 default:
403 break;
404 case llvm::Triple::arm:
405 case llvm::Triple::armeb:
406 case llvm::Triple::thumb:
407 case llvm::Triple::thumbeb:
408 Builder.defineMacro("__ARM_DWARF_EH__");
409 break;
410 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000411 }
412public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000413 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
414 this->UserLabelPrefix = "";
415 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000416};
417
Torok Edwinb2b37c62009-06-30 17:10:35 +0000418// OpenBSD Target
419template<typename Target>
420class OpenBSDTargetInfo : public OSTargetInfo<Target> {
421protected:
Craig Topper3164f332014-03-11 03:39:26 +0000422 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
423 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000424 // OpenBSD defines; list based off of gcc output
425
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000426 Builder.defineMacro("__OpenBSD__");
427 DefineStd(Builder, "unix", Opts);
428 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000429 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000430 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431 }
432public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000433 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
434 this->UserLabelPrefix = "";
435 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000436
Eli Friedman3715d1f2011-12-15 02:15:56 +0000437 switch (Triple.getArch()) {
438 default:
439 case llvm::Triple::x86:
440 case llvm::Triple::x86_64:
441 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000442 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000443 this->MCountName = "__mcount";
444 break;
445 case llvm::Triple::mips64:
446 case llvm::Triple::mips64el:
447 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000448 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000449 this->MCountName = "_mcount";
450 break;
451 }
452 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000453};
454
Eli Friedman9fa28852012-08-08 23:57:20 +0000455// Bitrig Target
456template<typename Target>
457class BitrigTargetInfo : public OSTargetInfo<Target> {
458protected:
Craig Topper3164f332014-03-11 03:39:26 +0000459 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
460 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000461 // Bitrig defines; list based off of gcc output
462
463 Builder.defineMacro("__Bitrig__");
464 DefineStd(Builder, "unix", Opts);
465 Builder.defineMacro("__ELF__");
466 if (Opts.POSIXThreads)
467 Builder.defineMacro("_REENTRANT");
468 }
469public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000470 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
471 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000472 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000473 }
474};
475
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000476// PSP Target
477template<typename Target>
478class PSPTargetInfo : public OSTargetInfo<Target> {
479protected:
Craig Topper3164f332014-03-11 03:39:26 +0000480 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
481 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000482 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000483 Builder.defineMacro("PSP");
484 Builder.defineMacro("_PSP");
485 Builder.defineMacro("__psp__");
486 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000487 }
488public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000489 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000490 this->UserLabelPrefix = "";
491 }
492};
493
John Thompsone467e192009-11-19 17:18:50 +0000494// PS3 PPU Target
495template<typename Target>
496class PS3PPUTargetInfo : public OSTargetInfo<Target> {
497protected:
Craig Topper3164f332014-03-11 03:39:26 +0000498 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
499 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000500 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000501 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000502 Builder.defineMacro("__PPU__");
503 Builder.defineMacro("__CELLOS_LV2__");
504 Builder.defineMacro("__ELF__");
505 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000506 Builder.defineMacro("_ARCH_PPC64");
507 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000508 }
509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000510 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000511 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000512 this->LongWidth = this->LongAlign = 32;
513 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000514 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000515 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000516 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000517 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000518 }
519};
520
Torok Edwinb2b37c62009-06-30 17:10:35 +0000521// Solaris target
522template<typename Target>
523class SolarisTargetInfo : public OSTargetInfo<Target> {
524protected:
Craig Topper3164f332014-03-11 03:39:26 +0000525 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
526 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000527 DefineStd(Builder, "sun", Opts);
528 DefineStd(Builder, "unix", Opts);
529 Builder.defineMacro("__ELF__");
530 Builder.defineMacro("__svr4__");
531 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000532 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
533 // newer, but to 500 for everything else. feature_test.h has a check to
534 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000535 // with a new version.
536 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000537 Builder.defineMacro("_XOPEN_SOURCE", "600");
538 else
539 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000540 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000541 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000542 Builder.defineMacro("_LARGEFILE_SOURCE");
543 Builder.defineMacro("_LARGEFILE64_SOURCE");
544 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000548 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000549 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000550 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000551 // FIXME: WIntType should be SignedLong
552 }
553};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000554
555// Windows target
556template<typename Target>
557class WindowsTargetInfo : public OSTargetInfo<Target> {
558protected:
Craig Topper3164f332014-03-11 03:39:26 +0000559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
560 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000561 Builder.defineMacro("_WIN32");
562 }
563 void getVisualStudioDefines(const LangOptions &Opts,
564 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000565 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000566 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000567 Builder.defineMacro("_CPPRTTI");
568
569 if (Opts.Exceptions)
570 Builder.defineMacro("_CPPUNWIND");
571 }
572
573 if (!Opts.CharIsSigned)
574 Builder.defineMacro("_CHAR_UNSIGNED");
575
576 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
577 // but it works for now.
578 if (Opts.POSIXThreads)
579 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000580
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000581 if (Opts.MSCompatibilityVersion) {
582 Builder.defineMacro("_MSC_VER",
583 Twine(Opts.MSCompatibilityVersion / 100000));
584 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000585 // FIXME We cannot encode the revision information into 32-bits
586 Builder.defineMacro("_MSC_BUILD", Twine(1));
587 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000588
589 if (Opts.MicrosoftExt) {
590 Builder.defineMacro("_MSC_EXTENSIONS");
591
592 if (Opts.CPlusPlus11) {
593 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
594 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
595 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
596 }
597 }
598
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000599 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000600 }
601
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000602public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000603 WindowsTargetInfo(const llvm::Triple &Triple)
604 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000605};
606
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000607template <typename Target>
608class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000609protected:
Craig Topper3164f332014-03-11 03:39:26 +0000610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
611 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000612 if (Opts.POSIXThreads)
613 Builder.defineMacro("_REENTRANT");
614 if (Opts.CPlusPlus)
615 Builder.defineMacro("_GNU_SOURCE");
616
617 DefineStd(Builder, "unix", Opts);
618 Builder.defineMacro("__ELF__");
619 Builder.defineMacro("__native_client__");
620 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000621
622public:
623 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000624 this->UserLabelPrefix = "";
625 this->LongAlign = 32;
626 this->LongWidth = 32;
627 this->PointerAlign = 32;
628 this->PointerWidth = 32;
629 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000630 this->Int64Type = TargetInfo::SignedLongLong;
631 this->DoubleAlign = 64;
632 this->LongDoubleWidth = 64;
633 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000634 this->LongLongWidth = 64;
635 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000636 this->SizeType = TargetInfo::UnsignedInt;
637 this->PtrDiffType = TargetInfo::SignedInt;
638 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000639 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000640 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000641 if (Triple.getArch() == llvm::Triple::arm) {
Tim Northoverb98dc4b2014-10-14 20:57:29 +0000642 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000643 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000644 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000645 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000646 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000647 } else if (Triple.getArch() == llvm::Triple::mipsel) {
648 // Handled on mips' setDescriptionString.
649 } else {
650 assert(Triple.getArch() == llvm::Triple::le32);
651 this->DescriptionString = "e-p:32:32-i64:64";
652 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000653 }
Craig Topper3164f332014-03-11 03:39:26 +0000654 typename Target::CallingConvCheckResult checkCallingConvention(
655 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000656 return CC == CC_PnaclCall ? Target::CCCR_OK :
657 Target::checkCallingConvention(CC);
658 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000659};
Mike Stump11289f42009-09-09 15:08:12 +0000660} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000661
Chris Lattner09d98f52008-10-05 21:50:58 +0000662//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000663// Specific target implementations.
664//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000665
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000666namespace {
667// PPC abstract base class
668class PPCTargetInfo : public TargetInfo {
669 static const Builtin::Info BuiltinInfo[];
670 static const char * const GCCRegNames[];
671 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000672 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000673
674 // Target cpu features.
675 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000676 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000677
Ulrich Weigand8afad612014-07-28 13:17:52 +0000678protected:
679 std::string ABI;
680
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000681public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000682 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000683 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000684 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000685 LongDoubleWidth = LongDoubleAlign = 128;
686 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
687 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000688
Hal Finkel6b984f02012-07-03 16:51:04 +0000689 /// \brief Flags for architecture specific defines.
690 typedef enum {
691 ArchDefineNone = 0,
692 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
693 ArchDefinePpcgr = 1 << 1,
694 ArchDefinePpcsq = 1 << 2,
695 ArchDefine440 = 1 << 3,
696 ArchDefine603 = 1 << 4,
697 ArchDefine604 = 1 << 5,
698 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000699 ArchDefinePwr5 = 1 << 7,
700 ArchDefinePwr5x = 1 << 8,
701 ArchDefinePwr6 = 1 << 9,
702 ArchDefinePwr6x = 1 << 10,
703 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000704 ArchDefinePwr8 = 1 << 12,
705 ArchDefineA2 = 1 << 13,
706 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000707 } ArchDefineTypes;
708
Bill Schmidt38378a02013-02-01 20:23:10 +0000709 // Note: GCC recognizes the following additional cpus:
710 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
711 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
712 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000713 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000714 bool CPUKnown = llvm::StringSwitch<bool>(Name)
715 .Case("generic", true)
716 .Case("440", true)
717 .Case("450", true)
718 .Case("601", true)
719 .Case("602", true)
720 .Case("603", true)
721 .Case("603e", true)
722 .Case("603ev", true)
723 .Case("604", true)
724 .Case("604e", true)
725 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000726 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000727 .Case("g3", true)
728 .Case("7400", true)
729 .Case("g4", true)
730 .Case("7450", true)
731 .Case("g4+", true)
732 .Case("750", true)
733 .Case("970", true)
734 .Case("g5", true)
735 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000736 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000737 .Case("e500mc", true)
738 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000739 .Case("power3", true)
740 .Case("pwr3", true)
741 .Case("power4", true)
742 .Case("pwr4", true)
743 .Case("power5", true)
744 .Case("pwr5", true)
745 .Case("power5x", true)
746 .Case("pwr5x", true)
747 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000748 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000749 .Case("power6x", true)
750 .Case("pwr6x", true)
751 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000752 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000753 .Case("power8", true)
754 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000755 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000756 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000757 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000758 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000759 .Case("powerpc64le", true)
760 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000761 .Default(false);
762
763 if (CPUKnown)
764 CPU = Name;
765
766 return CPUKnown;
767 }
768
Ulrich Weigand8afad612014-07-28 13:17:52 +0000769
770 StringRef getABI() const override { return ABI; }
771
Craig Topper3164f332014-03-11 03:39:26 +0000772 void getTargetBuiltins(const Builtin::Info *&Records,
773 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000774 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000775 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000776 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000777
Craig Topper3164f332014-03-11 03:39:26 +0000778 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000779
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getTargetDefines(const LangOptions &Opts,
781 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000782
Craig Topper3164f332014-03-11 03:39:26 +0000783 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000784
Craig Topper3164f332014-03-11 03:39:26 +0000785 bool handleTargetFeatures(std::vector<std::string> &Features,
786 DiagnosticsEngine &Diags) override;
787 bool hasFeature(StringRef Feature) const override;
788
789 void getGCCRegNames(const char * const *&Names,
790 unsigned &NumNames) const override;
791 void getGCCRegAliases(const GCCRegAlias *&Aliases,
792 unsigned &NumAliases) const override;
793 bool validateAsmConstraint(const char *&Name,
794 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000795 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000796 default: return false;
797 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000798 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000799 case 'b': // Base register
800 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000801 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000802 break;
803 // FIXME: The following are added to allow parsing.
804 // I just took a guess at what the actions should be.
805 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000806 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000807 case 'v': // Altivec vector register
808 Info.setAllowsRegister();
809 break;
810 case 'w':
811 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000812 case 'd':// VSX vector register to hold vector double data
813 case 'f':// VSX vector register to hold vector float data
814 case 's':// VSX vector register to hold scalar float data
815 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000816 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000817 break;
818 default:
819 return false;
820 }
821 Info.setAllowsRegister();
822 Name++; // Skip over 'w'.
823 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000824 case 'h': // `MQ', `CTR', or `LINK' register
825 case 'q': // `MQ' register
826 case 'c': // `CTR' register
827 case 'l': // `LINK' register
828 case 'x': // `CR' register (condition register) number 0
829 case 'y': // `CR' register (condition register)
830 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000831 Info.setAllowsRegister();
832 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000833 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000834 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000835 // (use `L' instead for SImode constants)
836 case 'K': // Unsigned 16-bit constant
837 case 'L': // Signed 16-bit constant shifted left 16 bits
838 case 'M': // Constant larger than 31
839 case 'N': // Exact power of 2
840 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000841 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000843 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000844 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000845 break;
846 case 'm': // Memory operand. Note that on PowerPC targets, m can
847 // include addresses that update the base register. It
848 // is therefore only safe to use `m' in an asm statement
849 // if that asm statement accesses the operand exactly once.
850 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000851 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000852 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000853 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000855 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
856 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000857 // register to be updated.
858 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000859 if (Name[1] != 's')
860 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000861 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000862 // include any automodification of the base register. Unlike
863 // `m', this constraint can be used in asm statements that
864 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000865 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000866 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000867 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000868 break;
869 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000870 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000871 case 'Z': // Memory operand that is an indexed or indirect from a
872 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000873 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000874 Info.setAllowsMemory();
875 Info.setAllowsRegister();
876 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000878 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000879 // register (`p' is preferable for asm statements)
880 case 'S': // Constant suitable as a 64-bit mask operand
881 case 'T': // Constant suitable as a 32-bit mask operand
882 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000883 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000884 // instructions
885 case 'W': // Vector constant that does not require memory
886 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000887 break;
888 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000889 }
John Thompson07a61a42010-06-24 22:44:13 +0000890 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000891 }
Craig Topper3164f332014-03-11 03:39:26 +0000892 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000893 std::string R;
894 switch (*Constraint) {
895 case 'e':
896 case 'w':
897 // Two-character constraint; add "^" hint for later parsing.
898 R = std::string("^") + std::string(Constraint, 2);
899 Constraint++;
900 break;
901 default:
902 return TargetInfo::convertConstraint(Constraint);
903 }
904 return R;
905 }
Craig Topper3164f332014-03-11 03:39:26 +0000906 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000907 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000908 }
Craig Topper3164f332014-03-11 03:39:26 +0000909 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000910 if (RegNo == 0) return 3;
911 if (RegNo == 1) return 4;
912 return -1;
913 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000914};
Anders Carlssonf511f642007-11-27 04:11:28 +0000915
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000916const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000917#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000918#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000919 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000920#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000921};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000922
Eric Christopher3ff21b32013-10-16 21:26:26 +0000923 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000924/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000925bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000926 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000927 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
928 // Ignore disabled features.
929 if (Features[i][0] == '-')
930 continue;
931
932 StringRef Feature = StringRef(Features[i]).substr(1);
933
934 if (Feature == "vsx") {
935 HasVSX = true;
936 continue;
937 }
938
Bill Schmidt59eb7672014-10-10 15:09:43 +0000939 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000940 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000941 continue;
942 }
943
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000944 // TODO: Finish this list and add an assert that we've handled them
945 // all.
946 }
947
948 return true;
949}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000950
Chris Lattnerecd49032009-03-02 22:27:17 +0000951/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
952/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000953void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000954 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000955 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000956 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000957 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000958 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000959 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000960 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000961 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000962 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000963 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000964 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000965 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000966 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000967
Chris Lattnerecd49032009-03-02 22:27:17 +0000968 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000969 if (getTriple().getArch() == llvm::Triple::ppc64le) {
970 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000971 } else {
972 if (getTriple().getOS() != llvm::Triple::NetBSD &&
973 getTriple().getOS() != llvm::Triple::OpenBSD)
974 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000975 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000976
Ulrich Weigand8afad612014-07-28 13:17:52 +0000977 // ABI options.
978 if (ABI == "elfv1")
979 Builder.defineMacro("_CALL_ELF", "1");
980 if (ABI == "elfv2")
981 Builder.defineMacro("_CALL_ELF", "2");
982
Chris Lattnerecd49032009-03-02 22:27:17 +0000983 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000984 Builder.defineMacro("__NATURAL_ALIGNMENT__");
985 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000986
Chris Lattnerecd49032009-03-02 22:27:17 +0000987 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000988 if (LongDoubleWidth == 128)
989 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990
John Thompsone467e192009-11-19 17:18:50 +0000991 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000992 Builder.defineMacro("__VEC__", "10206");
993 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000994 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000995
996 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000997 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
998 .Case("440", ArchDefineName)
999 .Case("450", ArchDefineName | ArchDefine440)
1000 .Case("601", ArchDefineName)
1001 .Case("602", ArchDefineName | ArchDefinePpcgr)
1002 .Case("603", ArchDefineName | ArchDefinePpcgr)
1003 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1004 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1005 .Case("604", ArchDefineName | ArchDefinePpcgr)
1006 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1007 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001008 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001009 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1010 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1011 .Case("750", ArchDefineName | ArchDefinePpcgr)
1012 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1013 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001014 .Case("a2", ArchDefineA2)
1015 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001016 .Case("pwr3", ArchDefinePpcgr)
1017 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1018 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1019 | ArchDefinePpcsq)
1020 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1021 | ArchDefinePpcgr | ArchDefinePpcsq)
1022 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1023 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1024 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1025 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1026 | ArchDefinePpcsq)
1027 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1028 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001029 | ArchDefinePpcgr | ArchDefinePpcsq)
1030 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1031 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1032 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001033 .Case("power3", ArchDefinePpcgr)
1034 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1035 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1036 | ArchDefinePpcsq)
1037 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1038 | ArchDefinePpcgr | ArchDefinePpcsq)
1039 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1040 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1041 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1042 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1043 | ArchDefinePpcsq)
1044 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1045 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001046 | ArchDefinePpcgr | ArchDefinePpcsq)
1047 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1048 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1049 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001050 .Default(ArchDefineNone);
1051
1052 if (defs & ArchDefineName)
1053 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1054 if (defs & ArchDefinePpcgr)
1055 Builder.defineMacro("_ARCH_PPCGR");
1056 if (defs & ArchDefinePpcsq)
1057 Builder.defineMacro("_ARCH_PPCSQ");
1058 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001059 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001060 if (defs & ArchDefine603)
1061 Builder.defineMacro("_ARCH_603");
1062 if (defs & ArchDefine604)
1063 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001064 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001065 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001066 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001067 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 if (defs & ArchDefinePwr5x)
1069 Builder.defineMacro("_ARCH_PWR5X");
1070 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001071 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001072 if (defs & ArchDefinePwr6x)
1073 Builder.defineMacro("_ARCH_PWR6X");
1074 if (defs & ArchDefinePwr7)
1075 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001076 if (defs & ArchDefinePwr8)
1077 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001078 if (defs & ArchDefineA2)
1079 Builder.defineMacro("_ARCH_A2");
1080 if (defs & ArchDefineA2q) {
1081 Builder.defineMacro("_ARCH_A2Q");
1082 Builder.defineMacro("_ARCH_QP");
1083 }
1084
1085 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1086 Builder.defineMacro("__bg__");
1087 Builder.defineMacro("__THW_BLUEGENE__");
1088 Builder.defineMacro("__bgq__");
1089 Builder.defineMacro("__TOS_BGQ__");
1090 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001091
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001092 if (HasVSX)
1093 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001094 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001095 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001096
Bill Schmidt38378a02013-02-01 20:23:10 +00001097 // FIXME: The following are not yet generated here by Clang, but are
1098 // generated by GCC:
1099 //
1100 // _SOFT_FLOAT_
1101 // __RECIP_PRECISION__
1102 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001103 // __RECIP__
1104 // __RECIPF__
1105 // __RSQRTE__
1106 // __RSQRTEF__
1107 // _SOFT_DOUBLE_
1108 // __NO_LWSYNC__
1109 // __HAVE_BSWAP__
1110 // __LONGDOUBLE128
1111 // __CMODEL_MEDIUM__
1112 // __CMODEL_LARGE__
1113 // _CALL_SYSV
1114 // _CALL_DARWIN
1115 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001116}
1117
1118void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1119 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1120 .Case("7400", true)
1121 .Case("g4", true)
1122 .Case("7450", true)
1123 .Case("g4+", true)
1124 .Case("970", true)
1125 .Case("g5", true)
1126 .Case("pwr6", true)
1127 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001128 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001129 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001130 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001131 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001132
1133 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001134
1135 if (!ABI.empty())
1136 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001137}
1138
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001139bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001140 return llvm::StringSwitch<bool>(Feature)
1141 .Case("powerpc", true)
1142 .Case("vsx", HasVSX)
1143 .Case("power8-vector", HasP8Vector)
1144 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001145}
Chris Lattner17df24e2008-04-21 18:56:49 +00001146
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001147
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001148const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001149 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1150 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1151 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1152 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1153 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1154 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1155 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1156 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001157 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001158 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001159 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001160 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1161 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1162 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1163 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001164 "vrsave", "vscr",
1165 "spe_acc", "spefscr",
1166 "sfp"
1167};
Chris Lattner10a5b382007-01-29 05:24:35 +00001168
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001169void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001170 unsigned &NumNames) const {
1171 Names = GCCRegNames;
1172 NumNames = llvm::array_lengthof(GCCRegNames);
1173}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001174
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001175const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1176 // While some of these aliases do map to different registers
1177 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001178 { { "0" }, "r0" },
1179 { { "1"}, "r1" },
1180 { { "2" }, "r2" },
1181 { { "3" }, "r3" },
1182 { { "4" }, "r4" },
1183 { { "5" }, "r5" },
1184 { { "6" }, "r6" },
1185 { { "7" }, "r7" },
1186 { { "8" }, "r8" },
1187 { { "9" }, "r9" },
1188 { { "10" }, "r10" },
1189 { { "11" }, "r11" },
1190 { { "12" }, "r12" },
1191 { { "13" }, "r13" },
1192 { { "14" }, "r14" },
1193 { { "15" }, "r15" },
1194 { { "16" }, "r16" },
1195 { { "17" }, "r17" },
1196 { { "18" }, "r18" },
1197 { { "19" }, "r19" },
1198 { { "20" }, "r20" },
1199 { { "21" }, "r21" },
1200 { { "22" }, "r22" },
1201 { { "23" }, "r23" },
1202 { { "24" }, "r24" },
1203 { { "25" }, "r25" },
1204 { { "26" }, "r26" },
1205 { { "27" }, "r27" },
1206 { { "28" }, "r28" },
1207 { { "29" }, "r29" },
1208 { { "30" }, "r30" },
1209 { { "31" }, "r31" },
1210 { { "fr0" }, "f0" },
1211 { { "fr1" }, "f1" },
1212 { { "fr2" }, "f2" },
1213 { { "fr3" }, "f3" },
1214 { { "fr4" }, "f4" },
1215 { { "fr5" }, "f5" },
1216 { { "fr6" }, "f6" },
1217 { { "fr7" }, "f7" },
1218 { { "fr8" }, "f8" },
1219 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001220 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001221 { { "fr11" }, "f11" },
1222 { { "fr12" }, "f12" },
1223 { { "fr13" }, "f13" },
1224 { { "fr14" }, "f14" },
1225 { { "fr15" }, "f15" },
1226 { { "fr16" }, "f16" },
1227 { { "fr17" }, "f17" },
1228 { { "fr18" }, "f18" },
1229 { { "fr19" }, "f19" },
1230 { { "fr20" }, "f20" },
1231 { { "fr21" }, "f21" },
1232 { { "fr22" }, "f22" },
1233 { { "fr23" }, "f23" },
1234 { { "fr24" }, "f24" },
1235 { { "fr25" }, "f25" },
1236 { { "fr26" }, "f26" },
1237 { { "fr27" }, "f27" },
1238 { { "fr28" }, "f28" },
1239 { { "fr29" }, "f29" },
1240 { { "fr30" }, "f30" },
1241 { { "fr31" }, "f31" },
1242 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001243};
1244
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001245void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001246 unsigned &NumAliases) const {
1247 Aliases = GCCRegAliases;
1248 NumAliases = llvm::array_lengthof(GCCRegAliases);
1249}
1250} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001251
Chris Lattner5ba61f02006-10-14 07:39:34 +00001252namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001253class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001254public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001255 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001256 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001257
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001258 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001259 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001260 case llvm::Triple::FreeBSD:
1261 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001262 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001263 PtrDiffType = SignedInt;
1264 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001265 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001266 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001267 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001268 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001269
Roman Divacky3ffe7462012-03-13 19:20:17 +00001270 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1271 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001272 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001273 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001274
1275 // PPC32 supports atomics up to 4 bytes.
1276 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001277 }
1278
Craig Topper3164f332014-03-11 03:39:26 +00001279 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001280 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001281 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001282 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001283};
1284} // end anonymous namespace.
1285
Bill Schmidt778d3872013-07-26 01:36:11 +00001286// Note: ABI differences may eventually require us to have a separate
1287// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001288namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001289class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001290public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001291 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001292 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001293 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001294 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001295
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001296 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1297 DescriptionString = "e-m:e-i64:64-n32:64";
1298 ABI = "elfv2";
1299 } else {
1300 DescriptionString = "E-m:e-i64:64-n32:64";
1301 ABI = "elfv1";
1302 }
1303
1304 switch (getTriple().getOS()) {
1305 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001306 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001307 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001308 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001309 case llvm::Triple::NetBSD:
1310 IntMaxType = SignedLongLong;
1311 Int64Type = SignedLongLong;
1312 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001313 default:
1314 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001315 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001316
1317 // PPC64 supports atomics up to 8 bytes.
1318 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001319 }
Craig Topper3164f332014-03-11 03:39:26 +00001320 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001321 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001322 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001323 // PPC64 Linux-specifc ABI options.
1324 bool setABI(const std::string &Name) override {
1325 if (Name == "elfv1" || Name == "elfv2") {
1326 ABI = Name;
1327 return true;
1328 }
1329 return false;
1330 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001331};
1332} // end anonymous namespace.
1333
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001334
1335namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001336class DarwinPPC32TargetInfo :
1337 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001338public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001339 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1340 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001341 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001342 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001343 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001344 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001345 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001346 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001347 }
Craig Topper3164f332014-03-11 03:39:26 +00001348 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001349 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001350 }
1351};
1352
1353class DarwinPPC64TargetInfo :
1354 public DarwinTargetInfo<PPC64TargetInfo> {
1355public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001356 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1357 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001358 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001359 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001360 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001361 }
1362};
1363} // end anonymous namespace.
1364
Chris Lattner5ba61f02006-10-14 07:39:34 +00001365namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001366 static const unsigned NVPTXAddrSpaceMap[] = {
1367 1, // opencl_global
1368 3, // opencl_local
1369 4, // opencl_constant
1370 1, // cuda_device
1371 4, // cuda_constant
1372 3, // cuda_shared
1373 };
1374 class NVPTXTargetInfo : public TargetInfo {
1375 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001376 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001377 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001378 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001379 BigEndian = false;
1380 TLSSupported = false;
1381 LongWidth = LongAlign = 64;
1382 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001383 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001384 // Define available target features
1385 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001386 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 }
Craig Topper3164f332014-03-11 03:39:26 +00001388 void getTargetDefines(const LangOptions &Opts,
1389 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001391 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 }
Craig Topper3164f332014-03-11 03:39:26 +00001393 void getTargetBuiltins(const Builtin::Info *&Records,
1394 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001395 Records = BuiltinInfo;
1396 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001397 }
Craig Topper3164f332014-03-11 03:39:26 +00001398 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001399 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001400 }
Craig Topper3164f332014-03-11 03:39:26 +00001401
1402 void getGCCRegNames(const char * const *&Names,
1403 unsigned &NumNames) const override;
1404 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1405 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001406 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001407 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001408 NumAliases = 0;
1409 }
Craig Topper3164f332014-03-11 03:39:26 +00001410 bool validateAsmConstraint(const char *&Name,
1411 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001412 switch (*Name) {
1413 default: return false;
1414 case 'c':
1415 case 'h':
1416 case 'r':
1417 case 'l':
1418 case 'f':
1419 case 'd':
1420 Info.setAllowsRegister();
1421 return true;
1422 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001423 }
Craig Topper3164f332014-03-11 03:39:26 +00001424 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001425 // FIXME: Is this really right?
1426 return "";
1427 }
Craig Topper3164f332014-03-11 03:39:26 +00001428 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001429 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001430 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001431 }
Craig Topper3164f332014-03-11 03:39:26 +00001432 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001433 bool Valid = llvm::StringSwitch<bool>(Name)
1434 .Case("sm_20", true)
1435 .Case("sm_21", true)
1436 .Case("sm_30", true)
1437 .Case("sm_35", true)
1438 .Default(false);
1439
1440 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001441 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001442 };
1443
1444 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1445#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1446#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1447 ALL_LANGUAGES },
1448#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001449 };
1450
1451 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1452 "r0"
1453 };
1454
1455 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1456 unsigned &NumNames) const {
1457 Names = GCCRegNames;
1458 NumNames = llvm::array_lengthof(GCCRegNames);
1459 }
1460
1461 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1462 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001463 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001464 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001465 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1466 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001467 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001468 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001469 };
1470
1471 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1472 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001473 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001474 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001475 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1476 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001477 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001478 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001479 };
1480}
1481
1482namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001483
1484static const unsigned R600AddrSpaceMap[] = {
1485 1, // opencl_global
1486 3, // opencl_local
1487 2, // opencl_constant
1488 1, // cuda_device
1489 2, // cuda_constant
1490 3 // cuda_shared
1491};
1492
Tom Stellarda96344b2014-08-21 13:58:40 +00001493// If you edit the description strings, make sure you update
1494// getPointerWidthV().
1495
Tom Stellardc74b1e02013-03-04 17:40:53 +00001496static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001497 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1498 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001499
1500static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001501 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1502 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001503
1504static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001505 "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 +00001506 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1507 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001508
Eli Friedmand13b41e2012-10-12 23:32:00 +00001509class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001510 static const Builtin::Info BuiltinInfo[];
1511
Tom Stellardc74b1e02013-03-04 17:40:53 +00001512 /// \brief The GPU profiles supported by the R600 target.
1513 enum GPUKind {
1514 GK_NONE,
1515 GK_R600,
1516 GK_R600_DOUBLE_OPS,
1517 GK_R700,
1518 GK_R700_DOUBLE_OPS,
1519 GK_EVERGREEN,
1520 GK_EVERGREEN_DOUBLE_OPS,
1521 GK_NORTHERN_ISLANDS,
1522 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001523 GK_SOUTHERN_ISLANDS,
1524 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001525 } GPU;
1526
Eli Friedmand13b41e2012-10-12 23:32:00 +00001527public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001528 R600TargetInfo(const llvm::Triple &Triple)
1529 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001530 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001531 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001532 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001533 }
1534
Tom Stellarda96344b2014-08-21 13:58:40 +00001535 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1536 if (GPU <= GK_CAYMAN)
1537 return 32;
1538
1539 switch(AddrSpace) {
1540 default:
1541 return 64;
1542 case 0:
1543 case 3:
1544 case 5:
1545 return 32;
1546 }
1547 }
1548
Craig Topper3164f332014-03-11 03:39:26 +00001549 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001550 return "";
1551 }
1552
Craig Topper3164f332014-03-11 03:39:26 +00001553 void getGCCRegNames(const char * const *&Names,
1554 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001555 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001556 numNames = 0;
1557 }
1558
Craig Topper3164f332014-03-11 03:39:26 +00001559 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1560 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001561 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001562 NumAliases = 0;
1563 }
1564
Craig Topper3164f332014-03-11 03:39:26 +00001565 bool validateAsmConstraint(const char *&Name,
1566 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001567 return true;
1568 }
1569
Craig Topper3164f332014-03-11 03:39:26 +00001570 void getTargetBuiltins(const Builtin::Info *&Records,
1571 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001572 Records = BuiltinInfo;
1573 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001574 }
1575
Craig Topper3164f332014-03-11 03:39:26 +00001576 void getTargetDefines(const LangOptions &Opts,
1577 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001578 Builder.defineMacro("__R600__");
1579 }
1580
Craig Topper3164f332014-03-11 03:39:26 +00001581 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001582 return TargetInfo::CharPtrBuiltinVaList;
1583 }
1584
Craig Topper3164f332014-03-11 03:39:26 +00001585 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001586 GPU = llvm::StringSwitch<GPUKind>(Name)
1587 .Case("r600" , GK_R600)
1588 .Case("rv610", GK_R600)
1589 .Case("rv620", GK_R600)
1590 .Case("rv630", GK_R600)
1591 .Case("rv635", GK_R600)
1592 .Case("rs780", GK_R600)
1593 .Case("rs880", GK_R600)
1594 .Case("rv670", GK_R600_DOUBLE_OPS)
1595 .Case("rv710", GK_R700)
1596 .Case("rv730", GK_R700)
1597 .Case("rv740", GK_R700_DOUBLE_OPS)
1598 .Case("rv770", GK_R700_DOUBLE_OPS)
1599 .Case("palm", GK_EVERGREEN)
1600 .Case("cedar", GK_EVERGREEN)
1601 .Case("sumo", GK_EVERGREEN)
1602 .Case("sumo2", GK_EVERGREEN)
1603 .Case("redwood", GK_EVERGREEN)
1604 .Case("juniper", GK_EVERGREEN)
1605 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1606 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1607 .Case("barts", GK_NORTHERN_ISLANDS)
1608 .Case("turks", GK_NORTHERN_ISLANDS)
1609 .Case("caicos", GK_NORTHERN_ISLANDS)
1610 .Case("cayman", GK_CAYMAN)
1611 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001612 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001613 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1614 .Case("verde", GK_SOUTHERN_ISLANDS)
1615 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001616 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001617 .Case("bonaire", GK_SEA_ISLANDS)
1618 .Case("kabini", GK_SEA_ISLANDS)
1619 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001620 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001621 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001622 .Default(GK_NONE);
1623
1624 if (GPU == GK_NONE) {
1625 return false;
1626 }
1627
1628 // Set the correct data layout
1629 switch (GPU) {
1630 case GK_NONE:
1631 case GK_R600:
1632 case GK_R700:
1633 case GK_EVERGREEN:
1634 case GK_NORTHERN_ISLANDS:
1635 DescriptionString = DescriptionStringR600;
1636 break;
1637 case GK_R600_DOUBLE_OPS:
1638 case GK_R700_DOUBLE_OPS:
1639 case GK_EVERGREEN_DOUBLE_OPS:
1640 case GK_CAYMAN:
1641 DescriptionString = DescriptionStringR600DoubleOps;
1642 break;
1643 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001644 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001645 DescriptionString = DescriptionStringSI;
1646 break;
1647 }
1648
1649 return true;
1650 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001651};
1652
Matt Arsenault56f008d2014-06-24 20:45:01 +00001653const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1654#define BUILTIN(ID, TYPE, ATTRS) \
1655 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1656#include "clang/Basic/BuiltinsR600.def"
1657};
1658
Eli Friedmand13b41e2012-10-12 23:32:00 +00001659} // end anonymous namespace
1660
1661namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001662// Namespace for x86 abstract base class
1663const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001664#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001665#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001666 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001667#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001668};
Eli Friedmanb5366062008-05-20 14:21:01 +00001669
Nuno Lopescfca1f02009-12-23 17:49:57 +00001670static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001671 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1672 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001673 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001674 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1675 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1676 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001677 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001678 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1679 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001680};
1681
Eric Christophercdd36352011-06-21 00:05:20 +00001682const TargetInfo::AddlRegName AddlRegNames[] = {
1683 { { "al", "ah", "eax", "rax" }, 0 },
1684 { { "bl", "bh", "ebx", "rbx" }, 3 },
1685 { { "cl", "ch", "ecx", "rcx" }, 2 },
1686 { { "dl", "dh", "edx", "rdx" }, 1 },
1687 { { "esi", "rsi" }, 4 },
1688 { { "edi", "rdi" }, 5 },
1689 { { "esp", "rsp" }, 7 },
1690 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001691};
1692
1693// X86 target abstract base class; x86-32 and x86-64 are very close, so
1694// most of the implementation can be shared.
1695class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001696 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001697 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001698 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001699 enum MMX3DNowEnum {
1700 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1701 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001702 enum XOPEnum {
1703 NoXOP,
1704 SSE4A,
1705 FMA4,
1706 XOP
1707 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001708
Eric Christophere1ddaf92010-04-02 23:50:19 +00001709 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001710 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001711 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001712 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001713 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001714 bool HasBMI;
1715 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001716 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001717 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001718 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001719 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001720 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001721 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001722 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001723 bool HasF16C;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001724 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001725 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001726 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001727
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001728 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1729 ///
1730 /// Each enumeration represents a particular CPU supported by Clang. These
1731 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1732 enum CPUKind {
1733 CK_Generic,
1734
1735 /// \name i386
1736 /// i386-generation processors.
1737 //@{
1738 CK_i386,
1739 //@}
1740
1741 /// \name i486
1742 /// i486-generation processors.
1743 //@{
1744 CK_i486,
1745 CK_WinChipC6,
1746 CK_WinChip2,
1747 CK_C3,
1748 //@}
1749
1750 /// \name i586
1751 /// i586-generation processors, P5 microarchitecture based.
1752 //@{
1753 CK_i586,
1754 CK_Pentium,
1755 CK_PentiumMMX,
1756 //@}
1757
1758 /// \name i686
1759 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1760 //@{
1761 CK_i686,
1762 CK_PentiumPro,
1763 CK_Pentium2,
1764 CK_Pentium3,
1765 CK_Pentium3M,
1766 CK_PentiumM,
1767 CK_C3_2,
1768
1769 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1770 /// Clang however has some logic to suport this.
1771 // FIXME: Warn, deprecate, and potentially remove this.
1772 CK_Yonah,
1773 //@}
1774
1775 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001776 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001777 //@{
1778 CK_Pentium4,
1779 CK_Pentium4M,
1780 CK_Prescott,
1781 CK_Nocona,
1782 //@}
1783
1784 /// \name Core
1785 /// Core microarchitecture based processors.
1786 //@{
1787 CK_Core2,
1788
1789 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1790 /// codename which GCC no longer accepts as an option to -march, but Clang
1791 /// has some logic for recognizing it.
1792 // FIXME: Warn, deprecate, and potentially remove this.
1793 CK_Penryn,
1794 //@}
1795
1796 /// \name Atom
1797 /// Atom processors
1798 //@{
1799 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001800 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001801 //@}
1802
1803 /// \name Nehalem
1804 /// Nehalem microarchitecture based processors.
1805 //@{
1806 CK_Corei7,
1807 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001808 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001809 CK_CoreAVX2,
Robert Khasanov50e6f582014-09-19 09:53:48 +00001810 CK_Broadwell,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001811 //@}
1812
Craig Topper449314e2013-08-20 07:09:39 +00001813 /// \name Knights Landing
1814 /// Knights Landing processor.
1815 CK_KNL,
1816
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001817 /// \name Skylake Server
1818 /// Skylake server processor.
1819 CK_SKX,
1820
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001821 /// \name K6
1822 /// K6 architecture processors.
1823 //@{
1824 CK_K6,
1825 CK_K6_2,
1826 CK_K6_3,
1827 //@}
1828
1829 /// \name K7
1830 /// K7 architecture processors.
1831 //@{
1832 CK_Athlon,
1833 CK_AthlonThunderbird,
1834 CK_Athlon4,
1835 CK_AthlonXP,
1836 CK_AthlonMP,
1837 //@}
1838
1839 /// \name K8
1840 /// K8 architecture processors.
1841 //@{
1842 CK_Athlon64,
1843 CK_Athlon64SSE3,
1844 CK_AthlonFX,
1845 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001846 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001847 CK_Opteron,
1848 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001849 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001850 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001851
Benjamin Kramer569f2152012-01-10 11:50:18 +00001852 /// \name Bobcat
1853 /// Bobcat architecture processors.
1854 //@{
1855 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001856 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001857 //@}
1858
1859 /// \name Bulldozer
1860 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001861 //@{
1862 CK_BDVER1,
1863 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001864 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001865 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001866 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001867
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001868 /// This specification is deprecated and will be removed in the future.
1869 /// Users should prefer \see CK_K8.
1870 // FIXME: Warn on this when the CPU is set to it.
1871 CK_x86_64,
1872 //@}
1873
1874 /// \name Geode
1875 /// Geode processors.
1876 //@{
1877 CK_Geode
1878 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001879 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001880
Rafael Espindolaeb265472013-08-21 21:59:03 +00001881 enum FPMathKind {
1882 FP_Default,
1883 FP_SSE,
1884 FP_387
1885 } FPMath;
1886
Eli Friedman3fd920a2008-08-20 02:34:37 +00001887public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001888 X86TargetInfo(const llvm::Triple &Triple)
1889 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001890 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001891 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1892 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1893 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1894 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1895 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1896 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001897 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001898 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001899 }
Craig Topper3164f332014-03-11 03:39:26 +00001900 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001901 // X87 evaluates with 80 bits "long double" precision.
1902 return SSELevel == NoSSE ? 2 : 0;
1903 }
Craig Topper3164f332014-03-11 03:39:26 +00001904 void getTargetBuiltins(const Builtin::Info *&Records,
1905 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001906 Records = BuiltinInfo;
1907 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001908 }
Craig Topper3164f332014-03-11 03:39:26 +00001909 void getGCCRegNames(const char * const *&Names,
1910 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001911 Names = GCCRegNames;
1912 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001913 }
Craig Topper3164f332014-03-11 03:39:26 +00001914 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1915 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001916 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001917 NumAliases = 0;
1918 }
Craig Topper3164f332014-03-11 03:39:26 +00001919 void getGCCAddlRegNames(const AddlRegName *&Names,
1920 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001921 Names = AddlRegNames;
1922 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001923 }
Craig Topper3164f332014-03-11 03:39:26 +00001924 bool validateAsmConstraint(const char *&Name,
1925 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001926
Akira Hatanaka974131e2014-09-18 18:17:18 +00001927 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1928
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001929 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1930
Akira Hatanaka974131e2014-09-18 18:17:18 +00001931 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1932
Craig Topper3164f332014-03-11 03:39:26 +00001933 std::string convertConstraint(const char *&Constraint) const override;
1934 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001935 return "~{dirflag},~{fpsr},~{flags}";
1936 }
Craig Topper3164f332014-03-11 03:39:26 +00001937 void getTargetDefines(const LangOptions &Opts,
1938 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001939 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1940 bool Enabled);
1941 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1942 bool Enabled);
1943 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1944 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001945 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1946 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001947 setFeatureEnabledImpl(Features, Name, Enabled);
1948 }
1949 // This exists purely to cut down on the number of virtual calls in
1950 // getDefaultFeatures which calls this repeatedly.
1951 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1952 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001953 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1954 bool hasFeature(StringRef Feature) const override;
1955 bool handleTargetFeatures(std::vector<std::string> &Features,
1956 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001957 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001958 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001959 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001960 else if (getTriple().getArch() == llvm::Triple::x86 &&
1961 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001962 return "no-mmx";
1963 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001964 }
Craig Topper3164f332014-03-11 03:39:26 +00001965 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001966 CPU = llvm::StringSwitch<CPUKind>(Name)
1967 .Case("i386", CK_i386)
1968 .Case("i486", CK_i486)
1969 .Case("winchip-c6", CK_WinChipC6)
1970 .Case("winchip2", CK_WinChip2)
1971 .Case("c3", CK_C3)
1972 .Case("i586", CK_i586)
1973 .Case("pentium", CK_Pentium)
1974 .Case("pentium-mmx", CK_PentiumMMX)
1975 .Case("i686", CK_i686)
1976 .Case("pentiumpro", CK_PentiumPro)
1977 .Case("pentium2", CK_Pentium2)
1978 .Case("pentium3", CK_Pentium3)
1979 .Case("pentium3m", CK_Pentium3M)
1980 .Case("pentium-m", CK_PentiumM)
1981 .Case("c3-2", CK_C3_2)
1982 .Case("yonah", CK_Yonah)
1983 .Case("pentium4", CK_Pentium4)
1984 .Case("pentium4m", CK_Pentium4M)
1985 .Case("prescott", CK_Prescott)
1986 .Case("nocona", CK_Nocona)
1987 .Case("core2", CK_Core2)
1988 .Case("penryn", CK_Penryn)
1989 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001990 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001991 .Case("corei7", CK_Corei7)
1992 .Case("corei7-avx", CK_Corei7AVX)
1993 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001994 .Case("core-avx2", CK_CoreAVX2)
Robert Khasanov50e6f582014-09-19 09:53:48 +00001995 .Case("broadwell", CK_Broadwell)
Craig Topper449314e2013-08-20 07:09:39 +00001996 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001997 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001998 .Case("k6", CK_K6)
1999 .Case("k6-2", CK_K6_2)
2000 .Case("k6-3", CK_K6_3)
2001 .Case("athlon", CK_Athlon)
2002 .Case("athlon-tbird", CK_AthlonThunderbird)
2003 .Case("athlon-4", CK_Athlon4)
2004 .Case("athlon-xp", CK_AthlonXP)
2005 .Case("athlon-mp", CK_AthlonMP)
2006 .Case("athlon64", CK_Athlon64)
2007 .Case("athlon64-sse3", CK_Athlon64SSE3)
2008 .Case("athlon-fx", CK_AthlonFX)
2009 .Case("k8", CK_K8)
2010 .Case("k8-sse3", CK_K8SSE3)
2011 .Case("opteron", CK_Opteron)
2012 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002013 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002014 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002015 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002016 .Case("bdver1", CK_BDVER1)
2017 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002018 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002019 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002020 .Case("x86-64", CK_x86_64)
2021 .Case("geode", CK_Geode)
2022 .Default(CK_Generic);
2023
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002024 // Perform any per-CPU checks necessary to determine if this CPU is
2025 // acceptable.
2026 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2027 // invalid without explaining *why*.
2028 switch (CPU) {
2029 case CK_Generic:
2030 // No processor selected!
2031 return false;
2032
2033 case CK_i386:
2034 case CK_i486:
2035 case CK_WinChipC6:
2036 case CK_WinChip2:
2037 case CK_C3:
2038 case CK_i586:
2039 case CK_Pentium:
2040 case CK_PentiumMMX:
2041 case CK_i686:
2042 case CK_PentiumPro:
2043 case CK_Pentium2:
2044 case CK_Pentium3:
2045 case CK_Pentium3M:
2046 case CK_PentiumM:
2047 case CK_Yonah:
2048 case CK_C3_2:
2049 case CK_Pentium4:
2050 case CK_Pentium4M:
2051 case CK_Prescott:
2052 case CK_K6:
2053 case CK_K6_2:
2054 case CK_K6_3:
2055 case CK_Athlon:
2056 case CK_AthlonThunderbird:
2057 case CK_Athlon4:
2058 case CK_AthlonXP:
2059 case CK_AthlonMP:
2060 case CK_Geode:
2061 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002062 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002063 return false;
2064
2065 // Fallthrough
2066 case CK_Nocona:
2067 case CK_Core2:
2068 case CK_Penryn:
2069 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002070 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002071 case CK_Corei7:
2072 case CK_Corei7AVX:
2073 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002074 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002075 case CK_Broadwell:
Craig Topper449314e2013-08-20 07:09:39 +00002076 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002077 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002078 case CK_Athlon64:
2079 case CK_Athlon64SSE3:
2080 case CK_AthlonFX:
2081 case CK_K8:
2082 case CK_K8SSE3:
2083 case CK_Opteron:
2084 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002085 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002086 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002087 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002088 case CK_BDVER1:
2089 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002090 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002091 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002092 case CK_x86_64:
2093 return true;
2094 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002095 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002096 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002097
Craig Topper3164f332014-03-11 03:39:26 +00002098 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002099
Craig Topper3164f332014-03-11 03:39:26 +00002100 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002101 // We accept all non-ARM calling conventions
2102 return (CC == CC_X86ThisCall ||
2103 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002104 CC == CC_X86StdCall ||
2105 CC == CC_X86VectorCall ||
2106 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002107 CC == CC_X86Pascal ||
2108 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002109 }
2110
Craig Topper3164f332014-03-11 03:39:26 +00002111 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002112 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002113 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002114};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002115
Rafael Espindolaeb265472013-08-21 21:59:03 +00002116bool X86TargetInfo::setFPMath(StringRef Name) {
2117 if (Name == "387") {
2118 FPMath = FP_387;
2119 return true;
2120 }
2121 if (Name == "sse") {
2122 FPMath = FP_SSE;
2123 return true;
2124 }
2125 return false;
2126}
2127
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002128void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002129 // FIXME: This *really* should not be here.
2130
2131 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002132 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002133 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002134
Chandler Carruth212334f2011-09-28 08:55:37 +00002135 switch (CPU) {
2136 case CK_Generic:
2137 case CK_i386:
2138 case CK_i486:
2139 case CK_i586:
2140 case CK_Pentium:
2141 case CK_i686:
2142 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002143 break;
2144 case CK_PentiumMMX:
2145 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002146 case CK_K6:
2147 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002148 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002149 break;
2150 case CK_Pentium3:
2151 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002152 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002153 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002154 break;
2155 case CK_PentiumM:
2156 case CK_Pentium4:
2157 case CK_Pentium4M:
2158 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002159 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002160 break;
2161 case CK_Yonah:
2162 case CK_Prescott:
2163 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002164 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002165 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002166 break;
2167 case CK_Core2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002168 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002169 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002170 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002171 break;
2172 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002174 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002175 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002176 case CK_SKX:
2177 setFeatureEnabledImpl(Features, "avx512f", true);
2178 setFeatureEnabledImpl(Features, "avx512cd", true);
2179 setFeatureEnabledImpl(Features, "avx512dq", true);
2180 setFeatureEnabledImpl(Features, "avx512bw", true);
2181 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002182 // FALLTHROUGH
2183 case CK_Broadwell:
2184 setFeatureEnabledImpl(Features, "rdseed", true);
2185 setFeatureEnabledImpl(Features, "adx", true);
2186 // FALLTHROUGH
2187 case CK_CoreAVX2:
2188 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002189 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002190 setFeatureEnabledImpl(Features, "bmi", true);
2191 setFeatureEnabledImpl(Features, "bmi2", true);
2192 setFeatureEnabledImpl(Features, "rtm", true);
2193 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002194 // FALLTHROUGH
2195 case CK_CoreAVXi:
2196 setFeatureEnabledImpl(Features, "rdrnd", true);
2197 setFeatureEnabledImpl(Features, "f16c", true);
2198 setFeatureEnabledImpl(Features, "fsgsbase", true);
2199 // FALLTHROUGH
2200 case CK_Corei7AVX:
2201 setFeatureEnabledImpl(Features, "avx", true);
2202 // FALLTHROUGH
2203 case CK_Silvermont:
2204 setFeatureEnabledImpl(Features, "aes", true);
2205 setFeatureEnabledImpl(Features, "pclmul", true);
2206 // FALLTHROUGH
2207 case CK_Corei7:
2208 setFeatureEnabledImpl(Features, "sse4.2", true);
2209 setFeatureEnabledImpl(Features, "cx16", true);
2210 break;
2211 case CK_KNL:
2212 setFeatureEnabledImpl(Features, "avx512f", true);
2213 setFeatureEnabledImpl(Features, "avx512cd", true);
2214 setFeatureEnabledImpl(Features, "avx512er", true);
2215 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002216 setFeatureEnabledImpl(Features, "rdseed", true);
2217 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002218 setFeatureEnabledImpl(Features, "lzcnt", true);
2219 setFeatureEnabledImpl(Features, "bmi", true);
2220 setFeatureEnabledImpl(Features, "bmi2", true);
2221 setFeatureEnabledImpl(Features, "rtm", true);
2222 setFeatureEnabledImpl(Features, "fma", true);
2223 setFeatureEnabledImpl(Features, "rdrnd", true);
2224 setFeatureEnabledImpl(Features, "f16c", true);
2225 setFeatureEnabledImpl(Features, "fsgsbase", true);
2226 setFeatureEnabledImpl(Features, "aes", true);
2227 setFeatureEnabledImpl(Features, "pclmul", true);
2228 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002229 break;
2230 case CK_K6_2:
2231 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002232 case CK_WinChip2:
2233 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002234 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002235 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002236 case CK_Athlon:
2237 case CK_AthlonThunderbird:
2238 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002239 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002240 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002241 case CK_Athlon4:
2242 case CK_AthlonXP:
2243 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002244 setFeatureEnabledImpl(Features, "sse", true);
2245 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002246 break;
2247 case CK_K8:
2248 case CK_Opteron:
2249 case CK_Athlon64:
2250 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002251 setFeatureEnabledImpl(Features, "sse2", true);
2252 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002253 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002254 case CK_AMDFAM10:
2255 setFeatureEnabledImpl(Features, "sse4a", true);
2256 setFeatureEnabledImpl(Features, "lzcnt", true);
2257 setFeatureEnabledImpl(Features, "popcnt", true);
2258 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002259 case CK_K8SSE3:
2260 case CK_OpteronSSE3:
2261 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002262 setFeatureEnabledImpl(Features, "sse3", true);
2263 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002264 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002265 case CK_BTVER2:
2266 setFeatureEnabledImpl(Features, "avx", true);
2267 setFeatureEnabledImpl(Features, "aes", true);
2268 setFeatureEnabledImpl(Features, "pclmul", true);
2269 setFeatureEnabledImpl(Features, "bmi", true);
2270 setFeatureEnabledImpl(Features, "f16c", true);
2271 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002272 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002273 setFeatureEnabledImpl(Features, "ssse3", true);
2274 setFeatureEnabledImpl(Features, "sse4a", true);
2275 setFeatureEnabledImpl(Features, "lzcnt", true);
2276 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002277 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002278 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002279 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002280 case CK_BDVER4:
2281 setFeatureEnabledImpl(Features, "avx2", true);
2282 setFeatureEnabledImpl(Features, "bmi2", true);
2283 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002284 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002285 setFeatureEnabledImpl(Features, "fsgsbase", true);
2286 // FALLTHROUGH
2287 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002288 setFeatureEnabledImpl(Features, "bmi", true);
2289 setFeatureEnabledImpl(Features, "fma", true);
2290 setFeatureEnabledImpl(Features, "f16c", true);
2291 setFeatureEnabledImpl(Features, "tbm", true);
2292 // FALLTHROUGH
2293 case CK_BDVER1:
2294 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002295 setFeatureEnabledImpl(Features, "xop", true);
2296 setFeatureEnabledImpl(Features, "lzcnt", true);
2297 setFeatureEnabledImpl(Features, "aes", true);
2298 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002299 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002300 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002301 break;
Eli Friedman33465822011-07-08 23:31:17 +00002302 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002303}
2304
Rafael Espindolae62e2792013-08-20 13:44:29 +00002305void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002306 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002307 if (Enabled) {
2308 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002309 case AVX512F:
2310 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002311 case AVX2:
2312 Features["avx2"] = true;
2313 case AVX:
2314 Features["avx"] = true;
2315 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002316 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002317 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002318 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002319 case SSSE3:
2320 Features["ssse3"] = true;
2321 case SSE3:
2322 Features["sse3"] = true;
2323 case SSE2:
2324 Features["sse2"] = true;
2325 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002326 Features["sse"] = true;
2327 case NoSSE:
2328 break;
2329 }
2330 return;
2331 }
2332
2333 switch (Level) {
2334 case NoSSE:
2335 case SSE1:
2336 Features["sse"] = false;
2337 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002338 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2339 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002340 case SSE3:
2341 Features["sse3"] = false;
2342 setXOPLevel(Features, NoXOP, false);
2343 case SSSE3:
2344 Features["ssse3"] = false;
2345 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002346 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002347 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002348 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002349 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002350 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002351 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002352 case AVX2:
2353 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002354 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002355 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2356 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002357 }
2358}
2359
2360void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002361 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002362 if (Enabled) {
2363 switch (Level) {
2364 case AMD3DNowAthlon:
2365 Features["3dnowa"] = true;
2366 case AMD3DNow:
2367 Features["3dnow"] = true;
2368 case MMX:
2369 Features["mmx"] = true;
2370 case NoMMX3DNow:
2371 break;
2372 }
2373 return;
2374 }
2375
2376 switch (Level) {
2377 case NoMMX3DNow:
2378 case MMX:
2379 Features["mmx"] = false;
2380 case AMD3DNow:
2381 Features["3dnow"] = false;
2382 case AMD3DNowAthlon:
2383 Features["3dnowa"] = false;
2384 }
2385}
2386
2387void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002388 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002389 if (Enabled) {
2390 switch (Level) {
2391 case XOP:
2392 Features["xop"] = true;
2393 case FMA4:
2394 Features["fma4"] = true;
2395 setSSELevel(Features, AVX, true);
2396 case SSE4A:
2397 Features["sse4a"] = true;
2398 setSSELevel(Features, SSE3, true);
2399 case NoXOP:
2400 break;
2401 }
2402 return;
2403 }
2404
2405 switch (Level) {
2406 case NoXOP:
2407 case SSE4A:
2408 Features["sse4a"] = false;
2409 case FMA4:
2410 Features["fma4"] = false;
2411 case XOP:
2412 Features["xop"] = false;
2413 }
2414}
2415
Craig Topper86d79ef2013-09-17 04:51:29 +00002416void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2417 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002418 // FIXME: This *really* should not be here. We need some way of translating
2419 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002420 if (Name == "sse4")
2421 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002422
Rafael Espindolae62e2792013-08-20 13:44:29 +00002423 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002424
Craig Topper29561122013-09-19 01:13:07 +00002425 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002426 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002427 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002428 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002429 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002430 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002431 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002432 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002433 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002434 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002435 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002436 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002437 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002438 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002439 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002440 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002441 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002442 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002443 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002444 if (Enabled)
2445 setSSELevel(Features, SSE2, Enabled);
2446 } else if (Name == "pclmul") {
2447 if (Enabled)
2448 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002449 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002450 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002451 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002452 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002453 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002454 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002455 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2456 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002457 if (Enabled)
2458 setSSELevel(Features, AVX512F, Enabled);
2459 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002460 if (Enabled)
2461 setSSELevel(Features, AVX, Enabled);
2462 } else if (Name == "fma4") {
2463 setXOPLevel(Features, FMA4, Enabled);
2464 } else if (Name == "xop") {
2465 setXOPLevel(Features, XOP, Enabled);
2466 } else if (Name == "sse4a") {
2467 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002468 } else if (Name == "f16c") {
2469 if (Enabled)
2470 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002471 } else if (Name == "sha") {
2472 if (Enabled)
2473 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002474 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002475}
2476
Eric Christopher3ff21b32013-10-16 21:26:26 +00002477/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002478/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002479bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002480 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002481 // Remember the maximum enabled sselevel.
2482 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2483 // Ignore disabled features.
2484 if (Features[i][0] == '-')
2485 continue;
2486
Benjamin Kramer27402c62012-03-05 15:10:44 +00002487 StringRef Feature = StringRef(Features[i]).substr(1);
2488
2489 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002490 HasAES = true;
2491 continue;
2492 }
2493
Craig Topper3f122a72012-05-31 05:18:48 +00002494 if (Feature == "pclmul") {
2495 HasPCLMUL = true;
2496 continue;
2497 }
2498
Benjamin Kramer27402c62012-03-05 15:10:44 +00002499 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002500 HasLZCNT = true;
2501 continue;
2502 }
2503
Rafael Espindola89049822013-08-23 20:21:37 +00002504 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002505 HasRDRND = true;
2506 continue;
2507 }
2508
Craig Topper8c7f2512014-11-03 06:51:41 +00002509 if (Feature == "fsgsbase") {
2510 HasFSGSBASE = true;
2511 continue;
2512 }
2513
Benjamin Kramer27402c62012-03-05 15:10:44 +00002514 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002515 HasBMI = true;
2516 continue;
2517 }
2518
Benjamin Kramer27402c62012-03-05 15:10:44 +00002519 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002520 HasBMI2 = true;
2521 continue;
2522 }
2523
Benjamin Kramer27402c62012-03-05 15:10:44 +00002524 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002525 HasPOPCNT = true;
2526 continue;
2527 }
2528
Michael Liao625a8752012-11-10 05:17:46 +00002529 if (Feature == "rtm") {
2530 HasRTM = true;
2531 continue;
2532 }
2533
Michael Liao74f4eaf2013-03-26 17:52:08 +00002534 if (Feature == "prfchw") {
2535 HasPRFCHW = true;
2536 continue;
2537 }
2538
Michael Liaoffaae352013-03-29 05:17:55 +00002539 if (Feature == "rdseed") {
2540 HasRDSEED = true;
2541 continue;
2542 }
2543
Robert Khasanov50e6f582014-09-19 09:53:48 +00002544 if (Feature == "adx") {
2545 HasADX = true;
2546 continue;
2547 }
2548
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002549 if (Feature == "tbm") {
2550 HasTBM = true;
2551 continue;
2552 }
2553
Craig Topperbba778b2012-06-03 21:46:30 +00002554 if (Feature == "fma") {
2555 HasFMA = true;
2556 continue;
2557 }
2558
Manman Rena45358c2012-10-11 00:59:55 +00002559 if (Feature == "f16c") {
2560 HasF16C = true;
2561 continue;
2562 }
2563
Craig Topper679b53a2013-08-21 05:29:10 +00002564 if (Feature == "avx512cd") {
2565 HasAVX512CD = true;
2566 continue;
2567 }
2568
2569 if (Feature == "avx512er") {
2570 HasAVX512ER = true;
2571 continue;
2572 }
2573
2574 if (Feature == "avx512pf") {
2575 HasAVX512PF = true;
2576 continue;
2577 }
2578
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002579 if (Feature == "avx512dq") {
2580 HasAVX512DQ = true;
2581 continue;
2582 }
2583
2584 if (Feature == "avx512bw") {
2585 HasAVX512BW = true;
2586 continue;
2587 }
2588
2589 if (Feature == "avx512vl") {
2590 HasAVX512VL = true;
2591 continue;
2592 }
2593
Ben Langmuir58078d02013-09-19 13:22:04 +00002594 if (Feature == "sha") {
2595 HasSHA = true;
2596 continue;
2597 }
2598
Nick Lewycky50e8f482013-10-05 20:14:27 +00002599 if (Feature == "cx16") {
2600 HasCX16 = true;
2601 continue;
2602 }
2603
Daniel Dunbar979586e2009-11-11 09:38:56 +00002604 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002605 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002606 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002607 .Case("avx2", AVX2)
2608 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002609 .Case("sse4.2", SSE42)
2610 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002611 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002612 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002613 .Case("sse2", SSE2)
2614 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002615 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002616 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002617
Eli Friedman33465822011-07-08 23:31:17 +00002618 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002619 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002620 .Case("3dnowa", AMD3DNowAthlon)
2621 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002622 .Case("mmx", MMX)
2623 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002624 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002625
2626 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2627 .Case("xop", XOP)
2628 .Case("fma4", FMA4)
2629 .Case("sse4a", SSE4A)
2630 .Default(NoXOP);
2631 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002632 }
Eli Friedman33465822011-07-08 23:31:17 +00002633
Craig Topper7481d8a2013-09-10 06:55:47 +00002634 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2635 // Can't do this earlier because we need to be able to explicitly enable
2636 // popcnt and still disable sse4.2.
2637 if (!HasPOPCNT && SSELevel >= SSE42 &&
2638 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2639 HasPOPCNT = true;
2640 Features.push_back("+popcnt");
2641 }
2642
Yunzhong Gao61089362013-10-16 19:07:02 +00002643 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2644 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2645 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2646 HasPRFCHW = true;
2647 Features.push_back("+prfchw");
2648 }
2649
Rafael Espindolaeb265472013-08-21 21:59:03 +00002650 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2651 // matches the selected sse level.
2652 if (FPMath == FP_SSE && SSELevel < SSE1) {
2653 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2654 return false;
2655 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2656 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2657 return false;
2658 }
2659
Eli Friedman33465822011-07-08 23:31:17 +00002660 // Don't tell the backend if we're turning off mmx; it will end up disabling
2661 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002662 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2663 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002664 std::vector<std::string>::iterator it;
2665 it = std::find(Features.begin(), Features.end(), "-mmx");
2666 if (it != Features.end())
2667 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002668 else if (SSELevel > NoSSE)
2669 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002670 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002671}
Chris Lattnerecd49032009-03-02 22:27:17 +00002672
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002673/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2674/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002675void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002676 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002677 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002678 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002679 Builder.defineMacro("__amd64__");
2680 Builder.defineMacro("__amd64");
2681 Builder.defineMacro("__x86_64");
2682 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002683 if (getTriple().getArchName() == "x86_64h") {
2684 Builder.defineMacro("__x86_64h");
2685 Builder.defineMacro("__x86_64h__");
2686 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002687 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002688 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002689 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002690
Chris Lattnerecd49032009-03-02 22:27:17 +00002691 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002692 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2693 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002694 switch (CPU) {
2695 case CK_Generic:
2696 break;
2697 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002698 // The rest are coming from the i386 define above.
2699 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002700 break;
2701 case CK_i486:
2702 case CK_WinChipC6:
2703 case CK_WinChip2:
2704 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002705 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002706 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002707 case CK_PentiumMMX:
2708 Builder.defineMacro("__pentium_mmx__");
2709 Builder.defineMacro("__tune_pentium_mmx__");
2710 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002711 case CK_i586:
2712 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002713 defineCPUMacros(Builder, "i586");
2714 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002715 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 case CK_Pentium3:
2717 case CK_Pentium3M:
2718 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002719 Builder.defineMacro("__tune_pentium3__");
2720 // Fallthrough
2721 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002722 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002723 Builder.defineMacro("__tune_pentium2__");
2724 // Fallthrough
2725 case CK_PentiumPro:
2726 Builder.defineMacro("__tune_i686__");
2727 Builder.defineMacro("__tune_pentiumpro__");
2728 // Fallthrough
2729 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002730 Builder.defineMacro("__i686");
2731 Builder.defineMacro("__i686__");
2732 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2733 Builder.defineMacro("__pentiumpro");
2734 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002735 break;
2736 case CK_Pentium4:
2737 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002738 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002739 break;
2740 case CK_Yonah:
2741 case CK_Prescott:
2742 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002743 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002744 break;
2745 case CK_Core2:
2746 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002747 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002748 break;
2749 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002750 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002751 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002752 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002753 defineCPUMacros(Builder, "slm");
2754 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002755 case CK_Corei7:
2756 case CK_Corei7AVX:
2757 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002758 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002759 case CK_Broadwell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002760 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002761 break;
Craig Topper449314e2013-08-20 07:09:39 +00002762 case CK_KNL:
2763 defineCPUMacros(Builder, "knl");
2764 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002765 case CK_SKX:
2766 defineCPUMacros(Builder, "skx");
2767 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002768 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002769 Builder.defineMacro("__k6_2__");
2770 Builder.defineMacro("__tune_k6_2__");
2771 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002772 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002773 if (CPU != CK_K6_2) { // In case of fallthrough
2774 // FIXME: GCC may be enabling these in cases where some other k6
2775 // architecture is specified but -m3dnow is explicitly provided. The
2776 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002777 Builder.defineMacro("__k6_3__");
2778 Builder.defineMacro("__tune_k6_3__");
2779 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002780 // Fallthrough
2781 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002782 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002783 break;
2784 case CK_Athlon:
2785 case CK_AthlonThunderbird:
2786 case CK_Athlon4:
2787 case CK_AthlonXP:
2788 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002789 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002790 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002791 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002792 Builder.defineMacro("__tune_athlon_sse__");
2793 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002794 break;
2795 case CK_K8:
2796 case CK_K8SSE3:
2797 case CK_x86_64:
2798 case CK_Opteron:
2799 case CK_OpteronSSE3:
2800 case CK_Athlon64:
2801 case CK_Athlon64SSE3:
2802 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002803 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002804 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002805 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002806 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002807 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002808 case CK_BTVER1:
2809 defineCPUMacros(Builder, "btver1");
2810 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002811 case CK_BTVER2:
2812 defineCPUMacros(Builder, "btver2");
2813 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002814 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002815 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002816 break;
2817 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002818 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002819 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002820 case CK_BDVER3:
2821 defineCPUMacros(Builder, "bdver3");
2822 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002823 case CK_BDVER4:
2824 defineCPUMacros(Builder, "bdver4");
2825 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002826 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002827 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002828 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002829 }
Chris Lattner96e43572009-03-02 22:40:39 +00002830
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002831 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002832 Builder.defineMacro("__REGISTER_PREFIX__", "");
2833
Chris Lattner6df41af2009-04-19 17:32:33 +00002834 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2835 // functions in glibc header files that use FP Stack inline asm which the
2836 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002837 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002838
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002839 if (HasAES)
2840 Builder.defineMacro("__AES__");
2841
Craig Topper3f122a72012-05-31 05:18:48 +00002842 if (HasPCLMUL)
2843 Builder.defineMacro("__PCLMUL__");
2844
Craig Topper22967d42011-12-25 05:06:45 +00002845 if (HasLZCNT)
2846 Builder.defineMacro("__LZCNT__");
2847
Benjamin Kramer1e250392012-07-07 09:39:18 +00002848 if (HasRDRND)
2849 Builder.defineMacro("__RDRND__");
2850
Craig Topper8c7f2512014-11-03 06:51:41 +00002851 if (HasFSGSBASE)
2852 Builder.defineMacro("__FSGSBASE__");
2853
Craig Topper22967d42011-12-25 05:06:45 +00002854 if (HasBMI)
2855 Builder.defineMacro("__BMI__");
2856
2857 if (HasBMI2)
2858 Builder.defineMacro("__BMI2__");
2859
Craig Topper1de83482011-12-29 16:10:46 +00002860 if (HasPOPCNT)
2861 Builder.defineMacro("__POPCNT__");
2862
Michael Liao625a8752012-11-10 05:17:46 +00002863 if (HasRTM)
2864 Builder.defineMacro("__RTM__");
2865
Michael Liao74f4eaf2013-03-26 17:52:08 +00002866 if (HasPRFCHW)
2867 Builder.defineMacro("__PRFCHW__");
2868
Michael Liaoffaae352013-03-29 05:17:55 +00002869 if (HasRDSEED)
2870 Builder.defineMacro("__RDSEED__");
2871
Robert Khasanov50e6f582014-09-19 09:53:48 +00002872 if (HasADX)
2873 Builder.defineMacro("__ADX__");
2874
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002875 if (HasTBM)
2876 Builder.defineMacro("__TBM__");
2877
Rafael Espindolae62e2792013-08-20 13:44:29 +00002878 switch (XOPLevel) {
2879 case XOP:
2880 Builder.defineMacro("__XOP__");
2881 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002882 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002883 case SSE4A:
2884 Builder.defineMacro("__SSE4A__");
2885 case NoXOP:
2886 break;
2887 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002888
Craig Topperbba778b2012-06-03 21:46:30 +00002889 if (HasFMA)
2890 Builder.defineMacro("__FMA__");
2891
Manman Rena45358c2012-10-11 00:59:55 +00002892 if (HasF16C)
2893 Builder.defineMacro("__F16C__");
2894
Craig Topper679b53a2013-08-21 05:29:10 +00002895 if (HasAVX512CD)
2896 Builder.defineMacro("__AVX512CD__");
2897 if (HasAVX512ER)
2898 Builder.defineMacro("__AVX512ER__");
2899 if (HasAVX512PF)
2900 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002901 if (HasAVX512DQ)
2902 Builder.defineMacro("__AVX512DQ__");
2903 if (HasAVX512BW)
2904 Builder.defineMacro("__AVX512BW__");
2905 if (HasAVX512VL)
2906 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002907
Ben Langmuir58078d02013-09-19 13:22:04 +00002908 if (HasSHA)
2909 Builder.defineMacro("__SHA__");
2910
Nick Lewycky50e8f482013-10-05 20:14:27 +00002911 if (HasCX16)
2912 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2913
Chris Lattner96e43572009-03-02 22:40:39 +00002914 // Each case falls through to the previous one here.
2915 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002916 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002917 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002918 case AVX2:
2919 Builder.defineMacro("__AVX2__");
2920 case AVX:
2921 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002922 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002923 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002924 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002925 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002926 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002927 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002928 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002929 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002930 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002931 Builder.defineMacro("__SSE2__");
2932 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002933 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002934 Builder.defineMacro("__SSE__");
2935 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002936 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002937 break;
2938 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002939
Derek Schuffc7dd7222012-10-11 15:52:22 +00002940 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002941 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002942 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002943 case AVX2:
2944 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002945 case SSE42:
2946 case SSE41:
2947 case SSSE3:
2948 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002949 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002950 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002951 break;
2952 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002953 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002954 break;
2955 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002956 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002957 }
2958 }
2959
Anders Carlssone437c682010-01-27 03:47:49 +00002960 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002961 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002962 case AMD3DNowAthlon:
2963 Builder.defineMacro("__3dNOW_A__");
2964 case AMD3DNow:
2965 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002966 case MMX:
2967 Builder.defineMacro("__MMX__");
2968 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002969 break;
2970 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002971
2972 if (CPU >= CK_i486) {
2973 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2974 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2975 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2976 }
2977 if (CPU >= CK_i586)
2978 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002979}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002980
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002981bool X86TargetInfo::hasFeature(StringRef Feature) const {
2982 return llvm::StringSwitch<bool>(Feature)
2983 .Case("aes", HasAES)
2984 .Case("avx", SSELevel >= AVX)
2985 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002986 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002987 .Case("avx512cd", HasAVX512CD)
2988 .Case("avx512er", HasAVX512ER)
2989 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002990 .Case("avx512dq", HasAVX512DQ)
2991 .Case("avx512bw", HasAVX512BW)
2992 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002993 .Case("bmi", HasBMI)
2994 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002995 .Case("cx16", HasCX16)
2996 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002997 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002998 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00002999 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003000 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003001 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3002 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3003 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003004 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003005 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003006 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003007 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003008 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003009 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003010 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003011 .Case("sse", SSELevel >= SSE1)
3012 .Case("sse2", SSELevel >= SSE2)
3013 .Case("sse3", SSELevel >= SSE3)
3014 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003015 .Case("sse4.1", SSELevel >= SSE41)
3016 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003017 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003018 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003019 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003020 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3021 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003022 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003023 .Default(false);
3024}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003025
Eli Friedman3fd920a2008-08-20 02:34:37 +00003026bool
Anders Carlsson58436352009-02-28 17:11:49 +00003027X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003028 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003029 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003030 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003031 case 'Y': // first letter of a pair:
3032 switch (*(Name+1)) {
3033 default: return false;
3034 case '0': // First SSE register.
3035 case 't': // Any SSE register, when SSE2 is enabled.
3036 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3037 case 'm': // any MMX register, when inter-unit moves enabled.
3038 break; // falls through to setAllowsRegister.
3039 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003040 case 'f': // any x87 floating point stack register.
3041 // Constraint 'f' cannot be used for output operands.
3042 if (Info.ConstraintStr[0] == '=')
3043 return false;
3044
3045 Info.setAllowsRegister();
3046 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003047 case 'a': // eax.
3048 case 'b': // ebx.
3049 case 'c': // ecx.
3050 case 'd': // edx.
3051 case 'S': // esi.
3052 case 'D': // edi.
3053 case 'A': // edx:eax.
3054 case 't': // top of floating point stack.
3055 case 'u': // second from top of floating point stack.
3056 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003057 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003058 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003059 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003060 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3061 case 'l': // "Index" registers: any general register that can be used as an
3062 // index in a base+index memory access.
3063 Info.setAllowsRegister();
3064 return true;
3065 case 'C': // SSE floating point constant.
3066 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003067 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003068 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003069 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003070 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003071 return true;
3072 }
3073}
3074
Akira Hatanaka974131e2014-09-18 18:17:18 +00003075bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3076 unsigned Size) const {
3077 // Strip off constraint modifiers.
3078 while (Constraint[0] == '=' ||
3079 Constraint[0] == '+' ||
3080 Constraint[0] == '&')
3081 Constraint = Constraint.substr(1);
3082
3083 return validateOperandSize(Constraint, Size);
3084}
3085
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003086bool X86TargetInfo::validateInputSize(StringRef Constraint,
3087 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003088 return validateOperandSize(Constraint, Size);
3089}
3090
3091bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3092 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003093 switch (Constraint[0]) {
3094 default: break;
3095 case 'y':
3096 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003097 case 'f':
3098 case 't':
3099 case 'u':
3100 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003101 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003102 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003103 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003104 }
3105
3106 return true;
3107}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003108
Eli Friedman3fd920a2008-08-20 02:34:37 +00003109std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003110X86TargetInfo::convertConstraint(const char *&Constraint) const {
3111 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003112 case 'a': return std::string("{ax}");
3113 case 'b': return std::string("{bx}");
3114 case 'c': return std::string("{cx}");
3115 case 'd': return std::string("{dx}");
3116 case 'S': return std::string("{si}");
3117 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003118 case 'p': // address
3119 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003120 case 't': // top of floating point stack.
3121 return std::string("{st}");
3122 case 'u': // second from top of floating point stack.
3123 return std::string("{st(1)}"); // second from top of floating point stack.
3124 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003125 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003126 }
3127}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003128} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003129
3130namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003131// X86-32 generic target
3132class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003133public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003134 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003135 DoubleAlign = LongLongAlign = 32;
3136 LongDoubleWidth = 96;
3137 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003138 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003139 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003140 SizeType = UnsignedInt;
3141 PtrDiffType = SignedInt;
3142 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003143 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003144
3145 // Use fpret for all types.
3146 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3147 (1 << TargetInfo::Double) |
3148 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003149
3150 // x86-32 has atomics up to 8 bytes
3151 // FIXME: Check that we actually have cmpxchg8b before setting
3152 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3153 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003154 }
Craig Topper3164f332014-03-11 03:39:26 +00003155 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003156 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003157 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003158
Craig Topper3164f332014-03-11 03:39:26 +00003159 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003160 if (RegNo == 0) return 0;
3161 if (RegNo == 1) return 2;
3162 return -1;
3163 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003164 bool validateOperandSize(StringRef Constraint,
3165 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003166 switch (Constraint[0]) {
3167 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003168 case 'R':
3169 case 'q':
3170 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003171 case 'a':
3172 case 'b':
3173 case 'c':
3174 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003175 case 'S':
3176 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003177 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003178 case 'A':
3179 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003180 }
3181
Akira Hatanaka974131e2014-09-18 18:17:18 +00003182 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003183 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003184};
3185} // end anonymous namespace
3186
3187namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003188class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3189public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003190 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3191 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003192
Craig Topper3164f332014-03-11 03:39:26 +00003193 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003194 unsigned Major, Minor, Micro;
3195 getTriple().getOSVersion(Major, Minor, Micro);
3196 // New NetBSD uses the default rounding mode.
3197 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3198 return X86_32TargetInfo::getFloatEvalMethod();
3199 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003200 return 1;
3201 }
3202};
3203} // end anonymous namespace
3204
3205namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003206class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3207public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003208 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3209 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003210 SizeType = UnsignedLong;
3211 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003212 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003213 }
3214};
3215} // end anonymous namespace
3216
3217namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003218class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3219public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003220 BitrigI386TargetInfo(const llvm::Triple &Triple)
3221 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003222 SizeType = UnsignedLong;
3223 IntPtrType = SignedLong;
3224 PtrDiffType = SignedLong;
3225 }
3226};
3227} // end anonymous namespace
3228
3229namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003230class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003231public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003232 DarwinI386TargetInfo(const llvm::Triple &Triple)
3233 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003234 LongDoubleWidth = 128;
3235 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003236 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003237 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003238 SizeType = UnsignedLong;
3239 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003240 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003241 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003242 }
3243
Eli Friedman3fd920a2008-08-20 02:34:37 +00003244};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003245} // end anonymous namespace
3246
3247namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003248// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003249class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003250public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003251 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3252 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003253 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003254 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003255 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003256 }
Craig Topper3164f332014-03-11 03:39:26 +00003257 void getTargetDefines(const LangOptions &Opts,
3258 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003259 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3260 }
3261};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003262
3263// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003264class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003265public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003266 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003267 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003268 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003269 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3270 }
Craig Topper3164f332014-03-11 03:39:26 +00003271 void getTargetDefines(const LangOptions &Opts,
3272 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003273 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3274 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3275 // The value of the following reflects processor type.
3276 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3277 // We lost the original triple, so we use the default.
3278 Builder.defineMacro("_M_IX86", "600");
3279 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003280};
3281} // end anonymous namespace
3282
Reid Kleckner47606832014-04-21 20:58:00 +00003283static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3284 Builder.defineMacro("__MSVCRT__");
3285 Builder.defineMacro("__MINGW32__");
3286
3287 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3288 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3289 // macro anyway for pre-processor compatibility.
3290 if (Opts.MicrosoftExt)
3291 Builder.defineMacro("__declspec", "__declspec");
3292 else
3293 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3294
3295 if (!Opts.MicrosoftExt) {
3296 // Provide macros for all the calling convention keywords. Provide both
3297 // single and double underscore prefixed variants. These are available on
3298 // x64 as well as x86, even though they have no effect.
3299 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3300 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003301 std::string GCCSpelling = "__attribute__((__";
3302 GCCSpelling += CC;
3303 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003304 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3305 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3306 }
3307 }
3308}
3309
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003310namespace {
3311// x86-32 MinGW target
3312class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3313public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003314 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3315 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003316 void getTargetDefines(const LangOptions &Opts,
3317 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003318 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003319 DefineStd(Builder, "WIN32", Opts);
3320 DefineStd(Builder, "WINNT", Opts);
3321 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003322 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003323 }
3324};
3325} // end anonymous namespace
3326
3327namespace {
3328// x86-32 Cygwin target
3329class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003331 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3332 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003333 TLSSupported = false;
3334 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003335 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003336 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003337 }
Craig Topper3164f332014-03-11 03:39:26 +00003338 void getTargetDefines(const LangOptions &Opts,
3339 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003340 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003341 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003342 Builder.defineMacro("__CYGWIN__");
3343 Builder.defineMacro("__CYGWIN32__");
3344 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003345 if (Opts.CPlusPlus)
3346 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003347 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003348};
3349} // end anonymous namespace
3350
3351namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003352// x86-32 Haiku target
3353class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003355 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003356 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003357 IntPtrType = SignedLong;
3358 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003359 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003360 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003361 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003362 }
Craig Topper3164f332014-03-11 03:39:26 +00003363 void getTargetDefines(const LangOptions &Opts,
3364 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003365 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3366 Builder.defineMacro("__INTEL__");
3367 Builder.defineMacro("__HAIKU__");
3368 }
3369};
3370} // end anonymous namespace
3371
Douglas Gregor9fabd852011-07-01 22:41:14 +00003372// RTEMS Target
3373template<typename Target>
3374class RTEMSTargetInfo : public OSTargetInfo<Target> {
3375protected:
Craig Topper3164f332014-03-11 03:39:26 +00003376 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3377 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003378 // RTEMS defines; list based off of gcc output
3379
Douglas Gregor9fabd852011-07-01 22:41:14 +00003380 Builder.defineMacro("__rtems__");
3381 Builder.defineMacro("__ELF__");
3382 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003383
Douglas Gregor9fabd852011-07-01 22:41:14 +00003384public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003385 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3386 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003387
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003388 switch (Triple.getArch()) {
3389 default:
3390 case llvm::Triple::x86:
3391 // this->MCountName = ".mcount";
3392 break;
3393 case llvm::Triple::mips:
3394 case llvm::Triple::mipsel:
3395 case llvm::Triple::ppc:
3396 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003397 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003398 // this->MCountName = "_mcount";
3399 break;
3400 case llvm::Triple::arm:
3401 // this->MCountName = "__mcount";
3402 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003403 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003404 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003405};
3406
3407namespace {
3408// x86-32 RTEMS target
3409class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3410public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003411 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003412 SizeType = UnsignedLong;
3413 IntPtrType = SignedLong;
3414 PtrDiffType = SignedLong;
3415 this->UserLabelPrefix = "";
3416 }
Craig Topper3164f332014-03-11 03:39:26 +00003417 void getTargetDefines(const LangOptions &Opts,
3418 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003419 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3420 Builder.defineMacro("__INTEL__");
3421 Builder.defineMacro("__rtems__");
3422 }
3423};
3424} // end anonymous namespace
3425
Chris Lattnerb986aba2010-04-11 19:29:39 +00003426namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003427// x86-64 generic target
3428class X86_64TargetInfo : public X86TargetInfo {
3429public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003430 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003431 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003432 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003433 LongDoubleWidth = 128;
3434 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003435 LargeArrayMinWidth = 128;
3436 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003437 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003438 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3439 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3440 IntPtrType = IsX32 ? SignedInt : SignedLong;
3441 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003442 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003443 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003444
Zinovy Nis1db95732014-07-10 15:27:19 +00003445 DescriptionString = (IsX32)
3446 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3447 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003448
3449 // Use fpret only for long double.
3450 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003451
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003452 // Use fp2ret for _Complex long double.
3453 ComplexLongDoubleUsesFP2Ret = true;
3454
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003455 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003456 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003457 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003458 }
Craig Topper3164f332014-03-11 03:39:26 +00003459 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003460 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003461 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003462
Craig Topper3164f332014-03-11 03:39:26 +00003463 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003464 if (RegNo == 0) return 0;
3465 if (RegNo == 1) return 1;
3466 return -1;
3467 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003468
Craig Topper3164f332014-03-11 03:39:26 +00003469 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003470 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003471 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003472 CC == CC_IntelOclBicc ||
3473 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003474 }
3475
Craig Topper3164f332014-03-11 03:39:26 +00003476 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003477 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003478 }
3479
Pavel Chupinfd223e12014-08-04 12:39:43 +00003480 // for x32 we need it here explicitly
3481 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003482};
3483} // end anonymous namespace
3484
3485namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003486// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003487class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003488public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003489 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3490 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003491 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003492 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003493 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003494 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003495 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003496 SizeType = UnsignedLongLong;
3497 PtrDiffType = SignedLongLong;
3498 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003499 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003500 }
Craig Topper3164f332014-03-11 03:39:26 +00003501 void getTargetDefines(const LangOptions &Opts,
3502 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003503 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003504 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003505 }
Craig Topper3164f332014-03-11 03:39:26 +00003506 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003507 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003508 }
Craig Topper3164f332014-03-11 03:39:26 +00003509 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003510 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003511 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003512 CC == CC_IntelOclBicc ||
3513 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3514 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003515};
3516} // end anonymous namespace
3517
3518namespace {
3519// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003520class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003521public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003522 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003523 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003524 LongDoubleWidth = LongDoubleAlign = 64;
3525 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003526 }
Craig Topper3164f332014-03-11 03:39:26 +00003527 void getTargetDefines(const LangOptions &Opts,
3528 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003529 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3530 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003531 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003532 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003533 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003534};
3535} // end anonymous namespace
3536
3537namespace {
3538// x86-64 MinGW target
3539class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3540public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003541 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3542 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003543 void getTargetDefines(const LangOptions &Opts,
3544 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003545 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003546 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003547 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003548 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003549
3550 // GCC defines this macro when it is using __gxx_personality_seh0.
3551 if (!Opts.SjLjExceptions)
3552 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003553 }
3554};
3555} // end anonymous namespace
3556
3557namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003558class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3559public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003560 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3561 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003562 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003563 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003564 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3565 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003566 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003567 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003568 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003569 }
3570};
3571} // end anonymous namespace
3572
3573namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003574class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3575public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003576 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3577 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003578 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003579 Int64Type = SignedLongLong;
3580 }
3581};
3582} // end anonymous namespace
3583
3584namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003585class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3586public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003587 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3588 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3589 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003590 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003591 }
3592};
Tim Northover9bb857a2013-01-31 12:13:10 +00003593}
3594
Eli Friedman9fa28852012-08-08 23:57:20 +00003595
3596namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003597class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003598 // Possible FPU choices.
3599 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003600 VFP2FPU = (1 << 0),
3601 VFP3FPU = (1 << 1),
3602 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003603 NeonFPU = (1 << 3),
3604 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003605 };
3606
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003607 // Possible HWDiv features.
3608 enum HWDivMode {
3609 HWDivThumb = (1 << 0),
3610 HWDivARM = (1 << 1)
3611 };
3612
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003613 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003614 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003615 }
3616
3617 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3618 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003619
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003620 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003621
Rafael Espindolaeb265472013-08-21 21:59:03 +00003622 enum {
3623 FP_Default,
3624 FP_VFP,
3625 FP_Neon
3626 } FPMath;
3627
Bernard Ogdenda13af32013-10-24 18:32:51 +00003628 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003629
Logan Chien57086ce2012-10-10 06:56:20 +00003630 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003631 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003632 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003633
3634 // Initialized via features.
3635 unsigned SoftFloat : 1;
3636 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003637
Bernard Ogden18b57012013-10-29 09:47:51 +00003638 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003639 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003640
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003641 // ACLE 6.5.1 Hardware floating point
3642 enum {
3643 HW_FP_HP = (1 << 1), /// half (16-bit)
3644 HW_FP_SP = (1 << 2), /// single (32-bit)
3645 HW_FP_DP = (1 << 3), /// double (64-bit)
3646 };
3647 uint32_t HW_FP;
3648
Chris Lattner5cc15e02010-03-03 19:03:45 +00003649 static const Builtin::Info BuiltinInfo[];
3650
Rafael Espindola101d5b92013-05-13 20:09:47 +00003651 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003652 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003653 if (T.getArch() == llvm::Triple::arm ||
3654 T.getArch() == llvm::Triple::armeb) {
3655 StringRef VersionStr;
3656 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003657 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003658 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003659 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003660 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003661 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003662 unsigned Version;
3663 if (VersionStr.getAsInteger(10, Version))
3664 return false;
3665 return Version >= 6;
3666 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003667 assert(T.getArch() == llvm::Triple::thumb ||
3668 T.getArch() == llvm::Triple::thumbeb);
3669 StringRef VersionStr;
3670 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003671 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003672 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003673 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003674 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003675 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003676 unsigned Version;
3677 if (VersionStr.getAsInteger(10, Version))
3678 return false;
3679 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003680 }
3681
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003682 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003683 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003684
3685 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003686 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003687
Tim Northover00853e52014-08-05 11:07:26 +00003688 // size_t is unsigned long on MachO-derived environments and NetBSD.
3689 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003690 SizeType = UnsignedLong;
3691 else
3692 SizeType = UnsignedInt;
3693
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003694 switch (T.getOS()) {
3695 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003696 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003697 break;
3698 case llvm::Triple::Win32:
3699 WCharType = UnsignedShort;
3700 break;
3701 case llvm::Triple::Linux:
3702 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003703 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3704 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003705 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003706 }
3707
3708 UseBitFieldTypeAlignment = true;
3709
3710 ZeroLengthBitfieldBoundary = 0;
3711
Tim Northover147cd2f2014-10-14 22:12:21 +00003712 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3713 // so set preferred for small types to 32.
3714 if (T.isOSBinFormatMachO()) {
3715 DescriptionString =
3716 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3717 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3718 } else if (T.isOSWindows()) {
3719 // FIXME: this is invalid for WindowsCE
3720 assert(!BigEndian && "Windows on ARM does not support big endian");
3721 DescriptionString = "e"
3722 "-m:e"
3723 "-p:32:32"
3724 "-i64:64"
3725 "-v128:64:128"
3726 "-a:0:32"
3727 "-n32"
3728 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003729 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003730 DescriptionString =
3731 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3732 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003733 }
3734
3735 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003736 }
3737
3738 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003739 const llvm::Triple &T = getTriple();
3740
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003741 IsAAPCS = false;
3742
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003743 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003744
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003745 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003746 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003747 SizeType = UnsignedInt;
3748 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003749 SizeType = UnsignedLong;
3750
3751 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3752 WCharType = SignedInt;
3753
3754 // Do not respect the alignment of bit-field types when laying out
3755 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3756 UseBitFieldTypeAlignment = false;
3757
3758 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3759 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3760 /// gcc.
3761 ZeroLengthBitfieldBoundary = 32;
3762
Tim Northover147cd2f2014-10-14 22:12:21 +00003763 if (T.isOSBinFormatMachO())
3764 DescriptionString =
3765 BigEndian
3766 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3767 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3768 else
3769 DescriptionString =
3770 BigEndian
3771 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3772 : "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 +00003773
3774 // FIXME: Override "preferred align" for double and long long.
3775 }
3776
Chris Lattner17df24e2008-04-21 18:56:49 +00003777public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003778 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003779 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003780 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003781 BigEndian = IsBigEndian;
3782
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003783 switch (getTriple().getOS()) {
3784 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003785 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003786 break;
3787 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003788 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003789 break;
3790 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003791
Chris Lattner1a8f3942010-04-23 16:29:58 +00003792 // {} in inline assembly are neon specifiers, not assembly variant
3793 // specifiers.
3794 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003795
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003796 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003797 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003798
3799 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003800
3801 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003802 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003803
3804 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003805 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003806 if (shouldUseInlineAtomic(getTriple()))
3807 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003808
3809 // Do force alignment of members that follow zero length bitfields. If
3810 // the alignment of the zero-length bitfield is greater than the member
3811 // that follows it, `bar', `bar' will be aligned as the type of the
3812 // zero length bitfield.
3813 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003814 }
Alp Toker4925ba72014-06-07 23:30:42 +00003815 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003816 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003817 ABI = Name;
3818
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003819 // The defaults (above) are for AAPCS, check if we need to change them.
3820 //
3821 // FIXME: We need support for -meabi... we could just mangle it into the
3822 // name.
3823 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003824 setABIAPCS();
3825 return true;
3826 }
3827 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3828 setABIAAPCS();
3829 return true;
3830 }
3831 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003832 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003833
Craig Topper3164f332014-03-11 03:39:26 +00003834 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003835 if (IsAAPCS)
3836 Features["aapcs"] = true;
3837 else
3838 Features["apcs"] = true;
3839
Silviu Barangae5690462013-10-21 10:59:33 +00003840 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003841 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3842 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00003843 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00003844 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003845 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003846 }
3847 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003848 Features["vfp4"] = true;
3849 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003850 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3851 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003852 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003853 Features["vfp4"] = true;
3854 Features["neon"] = true;
3855 Features["hwdiv"] = true;
3856 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003857 } else if (CPU == "cyclone") {
3858 Features["v8fp"] = true;
3859 Features["neon"] = true;
3860 Features["hwdiv"] = true;
3861 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003862 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3863 Features["fp-armv8"] = true;
3864 Features["neon"] = true;
3865 Features["hwdiv"] = true;
3866 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003867 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003868 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003869 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003870 // Enable the hwdiv extension for all v8a AArch32 cores by
3871 // default.
3872 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003873 ArchName == "armebv8a" || ArchName == "armebv8" ||
3874 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3875 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003876 Features["hwdiv"] = true;
3877 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003878 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003879 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003880 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003881 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003882
Craig Topper3164f332014-03-11 03:39:26 +00003883 bool handleTargetFeatures(std::vector<std::string> &Features,
3884 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003885 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003886 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003887 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003888 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003889 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003890
3891 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003892 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003893 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003894 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003895 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003896 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003897 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003898 HW_FP = HW_FP_SP | HW_FP_DP;
3899 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003900 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003901 HW_FP = HW_FP_SP | HW_FP_DP;
3902 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003903 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003904 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3905 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003906 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003907 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3908 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003909 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003910 HW_FP = HW_FP_SP | HW_FP_DP;
3911 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003912 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003913 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003914 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003915 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003916 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003917 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003918 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003919 } else if (Feature == "+fp-only-sp") {
3920 HW_FP &= ~HW_FP_DP;
3921 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003922 }
3923
Rafael Espindolaeb265472013-08-21 21:59:03 +00003924 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3925 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3926 return false;
3927 }
3928
3929 if (FPMath == FP_Neon)
3930 Features.push_back("+neonfp");
3931 else if (FPMath == FP_VFP)
3932 Features.push_back("-neonfp");
3933
Daniel Dunbar893d4752009-12-19 04:15:38 +00003934 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003935 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3936 for (const auto &FEFeature : FrontEndFeatures) {
3937 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3938 if (Feature != Features.end())
3939 Features.erase(Feature);
3940 }
3941
Rafael Espindolaeb265472013-08-21 21:59:03 +00003942 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003943 }
3944
Craig Topper3164f332014-03-11 03:39:26 +00003945 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003946 return llvm::StringSwitch<bool>(Feature)
3947 .Case("arm", true)
3948 .Case("softfloat", SoftFloat)
3949 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003950 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003951 .Case("hwdiv", HWDiv & HWDivThumb)
3952 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003953 .Default(false);
3954 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003955 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003956 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003957 return llvm::StringSwitch<const char*>(Name)
3958 .Cases("arm8", "arm810", "4")
3959 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3960 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3961 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3962 .Case("ep9312", "4T")
3963 .Cases("arm10tdmi", "arm1020t", "5T")
3964 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3965 .Case("arm926ej-s", "5TEJ")
3966 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3967 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003968 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003969 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003970 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003971 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00003972 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Renato Golin5886bc32014-10-13 10:22:48 +00003973 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003974 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003975 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003976 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003977 .Case("cortex-m3", "7M")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003978 .Cases("cortex-m4", "cortex-m7", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003979 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003980 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003981 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003982 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003983 static const char *getCPUProfile(StringRef Name) {
3984 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003985 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Renato Golin5886bc32014-10-13 10:22:48 +00003986 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003987 .Cases("cortex-a53", "cortex-a57", "A")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003988 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003989 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003990 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003991 }
Craig Topper3164f332014-03-11 03:39:26 +00003992 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003993 if (!getCPUDefineSuffix(Name))
3994 return false;
3995
Tim Northovere8c37212014-07-09 09:24:43 +00003996 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3997 StringRef Profile = getCPUProfile(Name);
3998 if (Profile == "M" && MaxAtomicInlineWidth) {
3999 MaxAtomicPromoteWidth = 32;
4000 MaxAtomicInlineWidth = 32;
4001 }
4002
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004003 CPU = Name;
4004 return true;
4005 }
Craig Topper3164f332014-03-11 03:39:26 +00004006 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004007 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4008 unsigned CPUArchVer) const {
4009 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4010 (CPUArch.find('M') != StringRef::npos);
4011 }
4012 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4013 unsigned CPUArchVer) const {
4014 // We check both CPUArchVer and ArchName because when only triple is
4015 // specified, the default CPU is arm1136j-s.
4016 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4017 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4018 }
Craig Topper3164f332014-03-11 03:39:26 +00004019 void getTargetDefines(const LangOptions &Opts,
4020 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004021 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__arm");
4023 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004024
Chris Lattnerecd49032009-03-02 22:27:17 +00004025 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004026 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004027
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004028 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004029 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004030 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004031 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004032 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004033
4034 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004035 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004036 StringRef ArchName = getTriple().getArchName();
4037
4038 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4039 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
James Molloy0ffb0932014-09-15 11:25:38 +00004040 if (CPUArch[0] >= '8') {
4041 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4042 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4043 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004044
4045 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4046 // is not defined for the M-profile.
4047 // NOTE that the deffault profile is assumed to be 'A'
4048 if (CPUProfile.empty() || CPUProfile != "M")
4049 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4050
4051 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4052 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4053 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4054 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4055 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4056 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4057 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4058
4059 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4060 // instruction set such as ARM or Thumb.
4061 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4062
4063 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4064
4065 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004066 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004067 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004068
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004069 // ACLE 6.5.1 Hardware Floating Point
4070 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004071 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004072
Yi Konga44c4d72014-06-27 21:25:42 +00004073 // ACLE predefines.
4074 Builder.defineMacro("__ARM_ACLE", "200");
4075
Mike Stump9d54bd72009-04-08 02:07:04 +00004076 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004077
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004078 // FIXME: It's more complicated than this and we don't really support
4079 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004080 // Windows on ARM does not "support" interworking
4081 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004082 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004083
David Tweed8f676532012-10-25 13:33:01 +00004084 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004085 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004086 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4087 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004088 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004089 Builder.defineMacro("__ARM_PCS", "1");
4090
David Tweed8f676532012-10-25 13:33:01 +00004091 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004092 Builder.defineMacro("__ARM_PCS_VFP", "1");
4093 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004094
Daniel Dunbar893d4752009-12-19 04:15:38 +00004095 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004096 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004097
4098 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004099 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004100
4101 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004102 Builder.defineMacro("__THUMBEL__");
4103 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004104 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004105 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004106 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004107 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4108 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004109
4110 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004111 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004112
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004113 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004114 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004115 if (FPU & VFP2FPU)
4116 Builder.defineMacro("__ARM_VFPV2__");
4117 if (FPU & VFP3FPU)
4118 Builder.defineMacro("__ARM_VFPV3__");
4119 if (FPU & VFP4FPU)
4120 Builder.defineMacro("__ARM_VFPV4__");
4121 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004122
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004123 // This only gets set when Neon instructions are actually available, unlike
4124 // the VFP define, hence the soft float and arch check. This is subtly
4125 // different from gcc, we follow the intent which was that it should be set
4126 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004127 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4128 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004129 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004130 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004131
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004132 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4133 Opts.ShortWChar ? "2" : "4");
4134
4135 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4136 Opts.ShortEnums ? "1" : "4");
4137
Bernard Ogden18b57012013-10-29 09:47:51 +00004138 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004139 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004140
Tim Northover02e38602014-02-03 17:28:04 +00004141 if (Crypto)
4142 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4143
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004144 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004145 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4146 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4147 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4148 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4149 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004150 }
Craig Topper3164f332014-03-11 03:39:26 +00004151 void getTargetBuiltins(const Builtin::Info *&Records,
4152 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004153 Records = BuiltinInfo;
4154 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004155 }
Craig Topper3164f332014-03-11 03:39:26 +00004156 bool isCLZForZeroUndef() const override { return false; }
4157 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004158 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004159 }
Craig Topper3164f332014-03-11 03:39:26 +00004160 void getGCCRegNames(const char * const *&Names,
4161 unsigned &NumNames) const override;
4162 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4163 unsigned &NumAliases) const override;
4164 bool validateAsmConstraint(const char *&Name,
4165 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004166 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004167 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004168 case 'l': // r0-r7
4169 case 'h': // r8-r15
4170 case 'w': // VFP Floating point register single precision
4171 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004172 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004173 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004174 case 'Q': // A memory address that is a single base register.
4175 Info.setAllowsMemory();
4176 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004177 case 'U': // a memory reference...
4178 switch (Name[1]) {
4179 case 'q': // ...ARMV4 ldrsb
4180 case 'v': // ...VFP load/store (reg+constant offset)
4181 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004182 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004183 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004184 case 'n': // valid address for Neon doubleword vector load/store
4185 case 'm': // valid address for Neon element and structure load/store
4186 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004187 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004188 Info.setAllowsMemory();
4189 Name++;
4190 return true;
4191 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004192 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004193 return false;
4194 }
Craig Topper3164f332014-03-11 03:39:26 +00004195 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004196 std::string R;
4197 switch (*Constraint) {
4198 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004199 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004200 Constraint++;
4201 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004202 case 'p': // 'p' should be translated to 'r' by default.
4203 R = std::string("r");
4204 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004205 default:
4206 return std::string(1, *Constraint);
4207 }
4208 return R;
4209 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004210 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004211 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004212 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004213 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004214 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004215
Bill Wendling9d1ee112012-10-25 23:28:48 +00004216 // Strip off constraint modifiers.
4217 while (Constraint[0] == '=' ||
4218 Constraint[0] == '+' ||
4219 Constraint[0] == '&')
4220 Constraint = Constraint.substr(1);
4221
4222 switch (Constraint[0]) {
4223 default: break;
4224 case 'r': {
4225 switch (Modifier) {
4226 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004227 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004228 case 'q':
4229 // A register of size 32 cannot fit a vector type.
4230 return false;
4231 }
4232 }
4233 }
4234
4235 return true;
4236 }
Craig Topper3164f332014-03-11 03:39:26 +00004237 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004238 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004239 return "";
4240 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004241
Craig Topper3164f332014-03-11 03:39:26 +00004242 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004243 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4244 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004245
Craig Topper3164f332014-03-11 03:39:26 +00004246 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004247 if (RegNo == 0) return 0;
4248 if (RegNo == 1) return 1;
4249 return -1;
4250 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004251};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004252
Rafael Espindolaeb265472013-08-21 21:59:03 +00004253bool ARMTargetInfo::setFPMath(StringRef Name) {
4254 if (Name == "neon") {
4255 FPMath = FP_Neon;
4256 return true;
4257 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4258 Name == "vfp4") {
4259 FPMath = FP_VFP;
4260 return true;
4261 }
4262 return false;
4263}
4264
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004265const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004266 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004267 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004268 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4269
4270 // Float registers
4271 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4272 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4273 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004274 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004275
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004276 // Double registers
4277 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4278 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004279 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4280 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004281
4282 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004283 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4284 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004285};
4286
4287void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004288 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004289 Names = GCCRegNames;
4290 NumNames = llvm::array_lengthof(GCCRegNames);
4291}
4292
4293const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004294 { { "a1" }, "r0" },
4295 { { "a2" }, "r1" },
4296 { { "a3" }, "r2" },
4297 { { "a4" }, "r3" },
4298 { { "v1" }, "r4" },
4299 { { "v2" }, "r5" },
4300 { { "v3" }, "r6" },
4301 { { "v4" }, "r7" },
4302 { { "v5" }, "r8" },
4303 { { "v6", "rfp" }, "r9" },
4304 { { "sl" }, "r10" },
4305 { { "fp" }, "r11" },
4306 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004307 { { "r13" }, "sp" },
4308 { { "r14" }, "lr" },
4309 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004310 // The S, D and Q registers overlap, but aren't really aliases; we
4311 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004312};
4313
4314void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4315 unsigned &NumAliases) const {
4316 Aliases = GCCRegAliases;
4317 NumAliases = llvm::array_lengthof(GCCRegAliases);
4318}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004319
4320const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004321#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004322#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004323 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004324#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004325
4326#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004327#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004328#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4329 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004330#include "clang/Basic/BuiltinsARM.def"
4331};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004332
4333class ARMleTargetInfo : public ARMTargetInfo {
4334public:
4335 ARMleTargetInfo(const llvm::Triple &Triple)
4336 : ARMTargetInfo(Triple, false) { }
4337 virtual void getTargetDefines(const LangOptions &Opts,
4338 MacroBuilder &Builder) const {
4339 Builder.defineMacro("__ARMEL__");
4340 ARMTargetInfo::getTargetDefines(Opts, Builder);
4341 }
4342};
4343
4344class ARMbeTargetInfo : public ARMTargetInfo {
4345public:
4346 ARMbeTargetInfo(const llvm::Triple &Triple)
4347 : ARMTargetInfo(Triple, true) { }
4348 virtual void getTargetDefines(const LangOptions &Opts,
4349 MacroBuilder &Builder) const {
4350 Builder.defineMacro("__ARMEB__");
4351 Builder.defineMacro("__ARM_BIG_ENDIAN");
4352 ARMTargetInfo::getTargetDefines(Opts, Builder);
4353 }
4354};
Chris Lattner17df24e2008-04-21 18:56:49 +00004355} // end anonymous namespace.
4356
Eli Friedmanf05b7722008-08-20 07:44:10 +00004357namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004358class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4359 const llvm::Triple Triple;
4360public:
4361 WindowsARMTargetInfo(const llvm::Triple &Triple)
4362 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4363 TLSSupported = false;
4364 WCharType = UnsignedShort;
4365 SizeType = UnsignedInt;
4366 UserLabelPrefix = "";
4367 }
4368 void getVisualStudioDefines(const LangOptions &Opts,
4369 MacroBuilder &Builder) const {
4370 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4371
4372 // FIXME: this is invalid for WindowsCE
4373 Builder.defineMacro("_M_ARM_NT", "1");
4374 Builder.defineMacro("_M_ARMT", "_M_ARM");
4375 Builder.defineMacro("_M_THUMB", "_M_ARM");
4376
4377 assert((Triple.getArch() == llvm::Triple::arm ||
4378 Triple.getArch() == llvm::Triple::thumb) &&
4379 "invalid architecture for Windows ARM target info");
4380 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4381 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4382
4383 // TODO map the complete set of values
4384 // 31: VFPv3 40: VFPv4
4385 Builder.defineMacro("_M_ARM_FP", "31");
4386 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004387 BuiltinVaListKind getBuiltinVaListKind() const override {
4388 return TargetInfo::CharPtrBuiltinVaList;
4389 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004390};
4391
4392// Windows ARM + Itanium C++ ABI Target
4393class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4394public:
4395 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4396 : WindowsARMTargetInfo(Triple) {
4397 TheCXXABI.set(TargetCXXABI::GenericARM);
4398 }
4399
4400 void getTargetDefines(const LangOptions &Opts,
4401 MacroBuilder &Builder) const override {
4402 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4403
4404 if (Opts.MSVCCompat)
4405 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4406 }
4407};
4408
4409// Windows ARM, MS (C++) ABI
4410class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4411public:
4412 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4413 : WindowsARMTargetInfo(Triple) {
4414 TheCXXABI.set(TargetCXXABI::Microsoft);
4415 }
4416
4417 void getTargetDefines(const LangOptions &Opts,
4418 MacroBuilder &Builder) const override {
4419 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4420 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4421 }
4422};
4423}
4424
4425
4426namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004427class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004428 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004429protected:
Craig Topper3164f332014-03-11 03:39:26 +00004430 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4431 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004432 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004433 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004434
Torok Edwinb2b37c62009-06-30 17:10:35 +00004435public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004436 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004437 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004438 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004439 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004440 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004441 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004442
4443 // Darwin on iOS uses a variant of the ARM C++ ABI.
4444 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004445 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004446};
4447} // end anonymous namespace.
4448
Tony Linthicum76329bf2011-12-12 21:14:55 +00004449
4450namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004451class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004452 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004453 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4454 static const char *const GCCRegNames[];
4455
James Molloy75f5f9e2014-04-16 15:33:48 +00004456 enum FPUModeEnum {
4457 FPUMode,
4458 NeonMode
4459 };
4460
4461 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004462 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004463 unsigned Crypto;
4464
Tim Northovera2ee4332014-03-29 15:09:45 +00004465 static const Builtin::Info BuiltinInfo[];
4466
4467 std::string ABI;
4468
4469public:
Tim Northover573cbee2014-05-24 12:52:07 +00004470 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004471 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004472
4473 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4474 WCharType = SignedInt;
4475
4476 // NetBSD apparently prefers consistency across ARM targets to consistency
4477 // across 64-bit targets.
4478 Int64Type = SignedLongLong;
4479 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004480 } else {
4481 WCharType = UnsignedInt;
4482 Int64Type = SignedLong;
4483 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004484 }
4485
Tim Northovera2ee4332014-03-29 15:09:45 +00004486 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004487 MaxVectorAlign = 128;
4488 RegParmMax = 8;
4489 MaxAtomicInlineWidth = 128;
4490 MaxAtomicPromoteWidth = 128;
4491
4492 LongDoubleWidth = LongDoubleAlign = 128;
4493 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4494
Tim Northovera2ee4332014-03-29 15:09:45 +00004495 // {} in inline assembly are neon specifiers, not assembly variant
4496 // specifiers.
4497 NoAsmVariants = true;
4498
Tim Northover573cbee2014-05-24 12:52:07 +00004499 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004500 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4501 }
4502
Alp Toker4925ba72014-06-07 23:30:42 +00004503 StringRef getABI() const override { return ABI; }
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004504 virtual bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004505 if (Name != "aapcs" && Name != "darwinpcs")
4506 return false;
4507
4508 ABI = Name;
4509 return true;
4510 }
4511
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004512 virtual bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004513 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004514 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004515 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004516 .Case("cyclone", true)
4517 .Default(false);
4518 return CPUKnown;
4519 }
4520
4521 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004522 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004523 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004524 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004525
4526 // Target properties.
4527 Builder.defineMacro("_LP64");
4528 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004529
4530 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4531 Builder.defineMacro("__ARM_ACLE", "200");
4532 Builder.defineMacro("__ARM_ARCH", "8");
4533 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4534
4535 Builder.defineMacro("__ARM_64BIT_STATE");
4536 Builder.defineMacro("__ARM_PCS_AAPCS64");
4537 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4538
4539 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4540 Builder.defineMacro("__ARM_FEATURE_CLZ");
4541 Builder.defineMacro("__ARM_FEATURE_FMA");
4542 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004543 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4544 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4545 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4546 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004547
4548 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4549
4550 // 0xe implies support for half, single and double precision operations.
4551 Builder.defineMacro("__ARM_FP", "0xe");
4552
4553 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4554 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4555 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4556
4557 if (Opts.FastMath || Opts.FiniteMathOnly)
4558 Builder.defineMacro("__ARM_FP_FAST");
4559
Richard Smithab506ad2014-10-20 23:26:58 +00004560 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004561 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4562
4563 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4564
4565 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4566 Opts.ShortEnums ? "1" : "4");
4567
James Molloy75f5f9e2014-04-16 15:33:48 +00004568 if (FPU == NeonMode) {
4569 Builder.defineMacro("__ARM_NEON");
4570 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004571 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004572 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004573
Bradley Smith418c5932014-05-02 15:17:51 +00004574 if (CRC)
4575 Builder.defineMacro("__ARM_FEATURE_CRC32");
4576
James Molloy75f5f9e2014-04-16 15:33:48 +00004577 if (Crypto)
4578 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004579 }
4580
4581 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004582 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004583 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004584 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004585 }
4586
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004587 virtual bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004588 return Feature == "aarch64" ||
4589 Feature == "arm64" ||
4590 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004591 }
4592
James Molloy5e73df52014-04-16 15:06:20 +00004593 bool handleTargetFeatures(std::vector<std::string> &Features,
4594 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004595 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004596 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004597 Crypto = 0;
4598 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4599 if (Features[i] == "+neon")
4600 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004601 if (Features[i] == "+crc")
4602 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004603 if (Features[i] == "+crypto")
4604 Crypto = 1;
4605 }
4606
James Molloy5e73df52014-04-16 15:06:20 +00004607 setDescriptionString();
4608
4609 return true;
4610 }
4611
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004612 virtual bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004613
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004614 virtual BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004615 return TargetInfo::AArch64ABIBuiltinVaList;
4616 }
4617
4618 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004619 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004620 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004621 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004622
4623 virtual bool validateAsmConstraint(const char *&Name,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004624 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004625 switch (*Name) {
4626 default:
4627 return false;
4628 case 'w': // Floating point and SIMD registers (V0-V31)
4629 Info.setAllowsRegister();
4630 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004631 case 'I': // Constant that can be used with an ADD instruction
4632 case 'J': // Constant that can be used with a SUB instruction
4633 case 'K': // Constant that can be used with a 32-bit logical instruction
4634 case 'L': // Constant that can be used with a 64-bit logical instruction
4635 case 'M': // Constant that can be used as a 32-bit MOV immediate
4636 case 'N': // Constant that can be used as a 64-bit MOV immediate
4637 case 'Y': // Floating point constant zero
4638 case 'Z': // Integer constant zero
4639 return true;
4640 case 'Q': // A memory reference with base register and no offset
4641 Info.setAllowsMemory();
4642 return true;
4643 case 'S': // A symbolic address
4644 Info.setAllowsRegister();
4645 return true;
4646 case 'U':
4647 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4648 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4649 // Usa: An absolute symbolic address
4650 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4651 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004652 case 'z': // Zero register, wzr or xzr
4653 Info.setAllowsRegister();
4654 return true;
4655 case 'x': // Floating point and SIMD registers (V0-V15)
4656 Info.setAllowsRegister();
4657 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004658 }
4659 return false;
4660 }
4661
Akira Hatanaka987f1862014-08-22 06:05:21 +00004662 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004663 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004664 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004665 // Strip off constraint modifiers.
4666 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4667 Constraint = Constraint.substr(1);
4668
4669 switch (Constraint[0]) {
4670 default:
4671 return true;
4672 case 'z':
4673 case 'r': {
4674 switch (Modifier) {
4675 case 'x':
4676 case 'w':
4677 // For now assume that the person knows what they're
4678 // doing with the modifier.
4679 return true;
4680 default:
4681 // By default an 'r' constraint will be in the 'x'
4682 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004683 if (Size == 64)
4684 return true;
4685
4686 SuggestedModifier = "w";
4687 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004688 }
4689 }
4690 }
4691 }
4692
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004693 virtual const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004694
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004695 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004696 if (RegNo == 0)
4697 return 0;
4698 if (RegNo == 1)
4699 return 1;
4700 return -1;
4701 }
4702};
4703
Tim Northover573cbee2014-05-24 12:52:07 +00004704const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004705 // 32-bit Integer registers
4706 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4707 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4708 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4709
4710 // 64-bit Integer registers
4711 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4712 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4713 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4714
4715 // 32-bit floating point regsisters
4716 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4717 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4718 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4719
4720 // 64-bit floating point regsisters
4721 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4722 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4723 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4724
4725 // Vector registers
4726 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4727 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4728 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4729};
4730
Tim Northover573cbee2014-05-24 12:52:07 +00004731void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004732 unsigned &NumNames) const {
4733 Names = GCCRegNames;
4734 NumNames = llvm::array_lengthof(GCCRegNames);
4735}
4736
Tim Northover573cbee2014-05-24 12:52:07 +00004737const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004738 { { "w31" }, "wsp" },
4739 { { "x29" }, "fp" },
4740 { { "x30" }, "lr" },
4741 { { "x31" }, "sp" },
4742 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4743 // don't want to substitute one of these for a different-sized one.
4744};
4745
Tim Northover573cbee2014-05-24 12:52:07 +00004746void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004747 unsigned &NumAliases) const {
4748 Aliases = GCCRegAliases;
4749 NumAliases = llvm::array_lengthof(GCCRegAliases);
4750}
4751
Tim Northover573cbee2014-05-24 12:52:07 +00004752const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004753#define BUILTIN(ID, TYPE, ATTRS) \
4754 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4755#include "clang/Basic/BuiltinsNEON.def"
4756
4757#define BUILTIN(ID, TYPE, ATTRS) \
4758 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004759#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004760};
James Molloy5e73df52014-04-16 15:06:20 +00004761
Tim Northover573cbee2014-05-24 12:52:07 +00004762class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004763 void setDescriptionString() override {
4764 if (getTriple().isOSBinFormatMachO())
4765 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4766 else
4767 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4768 }
4769
4770public:
Tim Northover573cbee2014-05-24 12:52:07 +00004771 AArch64leTargetInfo(const llvm::Triple &Triple)
4772 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004773 BigEndian = false;
4774 }
4775 void getTargetDefines(const LangOptions &Opts,
4776 MacroBuilder &Builder) const override {
4777 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004778 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004779 }
4780};
4781
Tim Northover573cbee2014-05-24 12:52:07 +00004782class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004783 void setDescriptionString() override {
4784 assert(!getTriple().isOSBinFormatMachO());
4785 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4786 }
4787
4788public:
Tim Northover573cbee2014-05-24 12:52:07 +00004789 AArch64beTargetInfo(const llvm::Triple &Triple)
4790 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004791 void getTargetDefines(const LangOptions &Opts,
4792 MacroBuilder &Builder) const override {
4793 Builder.defineMacro("__AARCH64EB__");
4794 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4795 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004796 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004797 }
4798};
Tim Northovera2ee4332014-03-29 15:09:45 +00004799} // end anonymous namespace.
4800
4801namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004802class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004803protected:
4804 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4805 MacroBuilder &Builder) const override {
4806 Builder.defineMacro("__AARCH64_SIMD__");
4807 Builder.defineMacro("__ARM64_ARCH_8__");
4808 Builder.defineMacro("__ARM_NEON__");
4809 Builder.defineMacro("__LITTLE_ENDIAN__");
4810 Builder.defineMacro("__REGISTER_PREFIX__", "");
4811 Builder.defineMacro("__arm64", "1");
4812 Builder.defineMacro("__arm64__", "1");
4813
4814 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4815 }
4816
Tim Northovera2ee4332014-03-29 15:09:45 +00004817public:
Tim Northover573cbee2014-05-24 12:52:07 +00004818 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4819 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004820 Int64Type = SignedLongLong;
4821 WCharType = SignedInt;
4822 UseSignedCharForObjCBool = false;
4823
4824 LongDoubleWidth = LongDoubleAlign = 64;
4825 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4826
4827 TheCXXABI.set(TargetCXXABI::iOS64);
4828 }
4829
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004830 virtual BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004831 return TargetInfo::CharPtrBuiltinVaList;
4832 }
4833};
4834} // end anonymous namespace
4835
4836namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004837// Hexagon abstract base class
4838class HexagonTargetInfo : public TargetInfo {
4839 static const Builtin::Info BuiltinInfo[];
4840 static const char * const GCCRegNames[];
4841 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4842 std::string CPU;
4843public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004844 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004845 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004846 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004847
4848 // {} in inline assembly are packet specifiers, not assembly variant
4849 // specifiers.
4850 NoAsmVariants = true;
4851 }
4852
Craig Topper3164f332014-03-11 03:39:26 +00004853 void getTargetBuiltins(const Builtin::Info *&Records,
4854 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004855 Records = BuiltinInfo;
4856 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4857 }
4858
Craig Topper3164f332014-03-11 03:39:26 +00004859 bool validateAsmConstraint(const char *&Name,
4860 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004861 return true;
4862 }
4863
Craig Topper3164f332014-03-11 03:39:26 +00004864 void getTargetDefines(const LangOptions &Opts,
4865 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004866
Craig Topper3164f332014-03-11 03:39:26 +00004867 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004868 return Feature == "hexagon";
4869 }
Craig Topper3164f332014-03-11 03:39:26 +00004870
4871 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004872 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004873 }
Craig Topper3164f332014-03-11 03:39:26 +00004874 void getGCCRegNames(const char * const *&Names,
4875 unsigned &NumNames) const override;
4876 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4877 unsigned &NumAliases) const override;
4878 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004879 return "";
4880 }
Sebastian Pop86500282012-01-13 20:37:10 +00004881
4882 static const char *getHexagonCPUSuffix(StringRef Name) {
4883 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004884 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004885 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004886 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004887 }
4888
Craig Topper3164f332014-03-11 03:39:26 +00004889 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004890 if (!getHexagonCPUSuffix(Name))
4891 return false;
4892
Tony Linthicum76329bf2011-12-12 21:14:55 +00004893 CPU = Name;
4894 return true;
4895 }
4896};
4897
4898void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4899 MacroBuilder &Builder) const {
4900 Builder.defineMacro("qdsp6");
4901 Builder.defineMacro("__qdsp6", "1");
4902 Builder.defineMacro("__qdsp6__", "1");
4903
4904 Builder.defineMacro("hexagon");
4905 Builder.defineMacro("__hexagon", "1");
4906 Builder.defineMacro("__hexagon__", "1");
4907
4908 if(CPU == "hexagonv1") {
4909 Builder.defineMacro("__HEXAGON_V1__");
4910 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4911 if(Opts.HexagonQdsp6Compat) {
4912 Builder.defineMacro("__QDSP6_V1__");
4913 Builder.defineMacro("__QDSP6_ARCH__", "1");
4914 }
4915 }
4916 else if(CPU == "hexagonv2") {
4917 Builder.defineMacro("__HEXAGON_V2__");
4918 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4919 if(Opts.HexagonQdsp6Compat) {
4920 Builder.defineMacro("__QDSP6_V2__");
4921 Builder.defineMacro("__QDSP6_ARCH__", "2");
4922 }
4923 }
4924 else if(CPU == "hexagonv3") {
4925 Builder.defineMacro("__HEXAGON_V3__");
4926 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4927 if(Opts.HexagonQdsp6Compat) {
4928 Builder.defineMacro("__QDSP6_V3__");
4929 Builder.defineMacro("__QDSP6_ARCH__", "3");
4930 }
4931 }
4932 else if(CPU == "hexagonv4") {
4933 Builder.defineMacro("__HEXAGON_V4__");
4934 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4935 if(Opts.HexagonQdsp6Compat) {
4936 Builder.defineMacro("__QDSP6_V4__");
4937 Builder.defineMacro("__QDSP6_ARCH__", "4");
4938 }
4939 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004940 else if(CPU == "hexagonv5") {
4941 Builder.defineMacro("__HEXAGON_V5__");
4942 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4943 if(Opts.HexagonQdsp6Compat) {
4944 Builder.defineMacro("__QDSP6_V5__");
4945 Builder.defineMacro("__QDSP6_ARCH__", "5");
4946 }
4947 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004948}
4949
4950const char * const HexagonTargetInfo::GCCRegNames[] = {
4951 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4952 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4953 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4954 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4955 "p0", "p1", "p2", "p3",
4956 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4957};
4958
4959void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4960 unsigned &NumNames) const {
4961 Names = GCCRegNames;
4962 NumNames = llvm::array_lengthof(GCCRegNames);
4963}
4964
4965
4966const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4967 { { "sp" }, "r29" },
4968 { { "fp" }, "r30" },
4969 { { "lr" }, "r31" },
4970 };
4971
4972void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4973 unsigned &NumAliases) const {
4974 Aliases = GCCRegAliases;
4975 NumAliases = llvm::array_lengthof(GCCRegAliases);
4976}
4977
4978
4979const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4980#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4981#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4982 ALL_LANGUAGES },
4983#include "clang/Basic/BuiltinsHexagon.def"
4984};
4985}
4986
4987
Chris Lattner5ba61f02006-10-14 07:39:34 +00004988namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004989// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4990class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004991 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4992 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004993 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004994public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004995 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004996
Craig Topper3164f332014-03-11 03:39:26 +00004997 bool handleTargetFeatures(std::vector<std::string> &Features,
4998 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004999 SoftFloat = false;
5000 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5001 if (Features[i] == "+soft-float")
5002 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005003 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005004 }
Craig Topper3164f332014-03-11 03:39:26 +00005005 void getTargetDefines(const LangOptions &Opts,
5006 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005007 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005008 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005009
5010 if (SoftFloat)
5011 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005012 }
Craig Topper3164f332014-03-11 03:39:26 +00005013
5014 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005015 return llvm::StringSwitch<bool>(Feature)
5016 .Case("softfloat", SoftFloat)
5017 .Case("sparc", true)
5018 .Default(false);
5019 }
Craig Topper3164f332014-03-11 03:39:26 +00005020
5021 void getTargetBuiltins(const Builtin::Info *&Records,
5022 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005023 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005024 }
Craig Topper3164f332014-03-11 03:39:26 +00005025 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005026 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005027 }
Craig Topper3164f332014-03-11 03:39:26 +00005028 void getGCCRegNames(const char * const *&Names,
5029 unsigned &NumNames) const override;
5030 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5031 unsigned &NumAliases) const override;
5032 bool validateAsmConstraint(const char *&Name,
5033 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005034 // FIXME: Implement!
5035 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005036 }
Craig Topper3164f332014-03-11 03:39:26 +00005037 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005038 // FIXME: Implement!
5039 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005040 }
5041};
5042
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005043const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005044 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5045 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5046 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5047 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5048};
5049
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005050void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5051 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005052 Names = GCCRegNames;
5053 NumNames = llvm::array_lengthof(GCCRegNames);
5054}
5055
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005056const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005057 { { "g0" }, "r0" },
5058 { { "g1" }, "r1" },
5059 { { "g2" }, "r2" },
5060 { { "g3" }, "r3" },
5061 { { "g4" }, "r4" },
5062 { { "g5" }, "r5" },
5063 { { "g6" }, "r6" },
5064 { { "g7" }, "r7" },
5065 { { "o0" }, "r8" },
5066 { { "o1" }, "r9" },
5067 { { "o2" }, "r10" },
5068 { { "o3" }, "r11" },
5069 { { "o4" }, "r12" },
5070 { { "o5" }, "r13" },
5071 { { "o6", "sp" }, "r14" },
5072 { { "o7" }, "r15" },
5073 { { "l0" }, "r16" },
5074 { { "l1" }, "r17" },
5075 { { "l2" }, "r18" },
5076 { { "l3" }, "r19" },
5077 { { "l4" }, "r20" },
5078 { { "l5" }, "r21" },
5079 { { "l6" }, "r22" },
5080 { { "l7" }, "r23" },
5081 { { "i0" }, "r24" },
5082 { { "i1" }, "r25" },
5083 { { "i2" }, "r26" },
5084 { { "i3" }, "r27" },
5085 { { "i4" }, "r28" },
5086 { { "i5" }, "r29" },
5087 { { "i6", "fp" }, "r30" },
5088 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005089};
5090
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005091void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5092 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005093 Aliases = GCCRegAliases;
5094 NumAliases = llvm::array_lengthof(GCCRegAliases);
5095}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005096
5097// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5098class SparcV8TargetInfo : public SparcTargetInfo {
5099public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005100 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005101 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005102 }
5103
Craig Topper3164f332014-03-11 03:39:26 +00005104 void getTargetDefines(const LangOptions &Opts,
5105 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005106 SparcTargetInfo::getTargetDefines(Opts, Builder);
5107 Builder.defineMacro("__sparcv8");
5108 }
5109};
5110
5111// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5112class SparcV9TargetInfo : public SparcTargetInfo {
5113public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005114 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005115 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005116 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005117 // This is an LP64 platform.
5118 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005119
5120 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005121 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005122 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005123 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005124 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005125 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005126
5127 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5128 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5129 LongDoubleWidth = 128;
5130 LongDoubleAlign = 128;
5131 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005132 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005133 }
5134
Craig Topper3164f332014-03-11 03:39:26 +00005135 void getTargetDefines(const LangOptions &Opts,
5136 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005137 SparcTargetInfo::getTargetDefines(Opts, Builder);
5138 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005139 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005140 // Solaris doesn't need these variants, but the BSDs do.
5141 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005142 Builder.defineMacro("__sparc64__");
5143 Builder.defineMacro("__sparc_v9__");
5144 Builder.defineMacro("__sparcv9__");
5145 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005146 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005147
Craig Topper3164f332014-03-11 03:39:26 +00005148 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005149 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5150 .Case("v9", true)
5151 .Case("ultrasparc", true)
5152 .Case("ultrasparc3", true)
5153 .Case("niagara", true)
5154 .Case("niagara2", true)
5155 .Case("niagara3", true)
5156 .Case("niagara4", true)
5157 .Default(false);
5158
5159 // No need to store the CPU yet. There aren't any CPU-specific
5160 // macros to define.
5161 return CPUKnown;
5162 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005163};
5164
Gabor Greif49991682008-02-21 16:29:08 +00005165} // end anonymous namespace.
5166
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005167namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005168class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005169public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005170 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5171 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005172 SizeType = UnsignedInt;
5173 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005174 }
5175};
5176} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005177
Chris Lattnerb781dc792008-05-08 05:58:21 +00005178namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005179class SystemZTargetInfo : public TargetInfo {
5180 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005181
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005182public:
5183 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5184 TLSSupported = true;
5185 IntWidth = IntAlign = 32;
5186 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5187 PointerWidth = PointerAlign = 64;
5188 LongDoubleWidth = 128;
5189 LongDoubleAlign = 64;
5190 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5191 MinGlobalAlign = 16;
5192 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5193 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5194 }
5195 void getTargetDefines(const LangOptions &Opts,
5196 MacroBuilder &Builder) const override {
5197 Builder.defineMacro("__s390__");
5198 Builder.defineMacro("__s390x__");
5199 Builder.defineMacro("__zarch__");
5200 Builder.defineMacro("__LONG_DOUBLE_128__");
5201 }
5202 void getTargetBuiltins(const Builtin::Info *&Records,
5203 unsigned &NumRecords) const override {
5204 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005205 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005206 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005207 }
5208
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005209 void getGCCRegNames(const char *const *&Names,
5210 unsigned &NumNames) const override;
5211 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5212 unsigned &NumAliases) const override {
5213 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005214 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005215 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005216 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005217 bool validateAsmConstraint(const char *&Name,
5218 TargetInfo::ConstraintInfo &info) const override;
5219 const char *getClobbers() const override {
5220 // FIXME: Is this really right?
5221 return "";
5222 }
5223 BuiltinVaListKind getBuiltinVaListKind() const override {
5224 return TargetInfo::SystemZBuiltinVaList;
5225 }
5226 bool setCPU(const std::string &Name) override {
5227 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5228 .Case("z10", true)
5229 .Case("z196", true)
5230 .Case("zEC12", true)
5231 .Default(false);
5232
5233 // No need to store the CPU yet. There aren't any CPU-specific
5234 // macros to define.
5235 return CPUKnown;
5236 }
5237};
5238
5239const char *const SystemZTargetInfo::GCCRegNames[] = {
5240 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5241 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5242 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5243 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5244};
5245
5246void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5247 unsigned &NumNames) const {
5248 Names = GCCRegNames;
5249 NumNames = llvm::array_lengthof(GCCRegNames);
5250}
5251
5252bool SystemZTargetInfo::
5253validateAsmConstraint(const char *&Name,
5254 TargetInfo::ConstraintInfo &Info) const {
5255 switch (*Name) {
5256 default:
5257 return false;
5258
5259 case 'a': // Address register
5260 case 'd': // Data register (equivalent to 'r')
5261 case 'f': // Floating-point register
5262 Info.setAllowsRegister();
5263 return true;
5264
5265 case 'I': // Unsigned 8-bit constant
5266 case 'J': // Unsigned 12-bit constant
5267 case 'K': // Signed 16-bit constant
5268 case 'L': // Signed 20-bit displacement (on all targets we support)
5269 case 'M': // 0x7fffffff
5270 return true;
5271
5272 case 'Q': // Memory with base and unsigned 12-bit displacement
5273 case 'R': // Likewise, plus an index
5274 case 'S': // Memory with base and signed 20-bit displacement
5275 case 'T': // Likewise, plus an index
5276 Info.setAllowsMemory();
5277 return true;
5278 }
5279}
Ulrich Weigand47445072013-05-06 16:26:41 +00005280}
5281
5282namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005283 class MSP430TargetInfo : public TargetInfo {
5284 static const char * const GCCRegNames[];
5285 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005286 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005287 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005288 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005289 IntWidth = 16; IntAlign = 16;
5290 LongWidth = 32; LongLongWidth = 64;
5291 LongAlign = LongLongAlign = 16;
5292 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005293 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005294 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005295 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005296 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005297 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005298 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005299 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005300 }
5301 void getTargetDefines(const LangOptions &Opts,
5302 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005303 Builder.defineMacro("MSP430");
5304 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005305 // FIXME: defines for different 'flavours' of MCU
5306 }
Craig Topper3164f332014-03-11 03:39:26 +00005307 void getTargetBuiltins(const Builtin::Info *&Records,
5308 unsigned &NumRecords) const override {
5309 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005310 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005311 NumRecords = 0;
5312 }
Craig Topper3164f332014-03-11 03:39:26 +00005313 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005314 return Feature == "msp430";
5315 }
Craig Topper3164f332014-03-11 03:39:26 +00005316 void getGCCRegNames(const char * const *&Names,
5317 unsigned &NumNames) const override;
5318 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5319 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005320 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005321 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005322 NumAliases = 0;
5323 }
Craig Topper3164f332014-03-11 03:39:26 +00005324 bool validateAsmConstraint(const char *&Name,
5325 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005326 // No target constraints for now.
5327 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005328 }
Craig Topper3164f332014-03-11 03:39:26 +00005329 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005330 // FIXME: Is this really right?
5331 return "";
5332 }
Craig Topper3164f332014-03-11 03:39:26 +00005333 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005334 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005335 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005336 }
5337 };
5338
5339 const char * const MSP430TargetInfo::GCCRegNames[] = {
5340 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5341 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5342 };
5343
5344 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5345 unsigned &NumNames) const {
5346 Names = GCCRegNames;
5347 NumNames = llvm::array_lengthof(GCCRegNames);
5348 }
5349}
5350
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005351namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005352
Mike Stump11289f42009-09-09 15:08:12 +00005353 // LLVM and Clang cannot be used directly to output native binaries for
5354 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005355 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005356 //
5357 // TCE uses the llvm bitcode as input and uses it for generating customized
5358 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005359 // publicly available in http://tce.cs.tut.fi
5360
Eli Friedman1f191002011-10-07 19:51:42 +00005361 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5362 3, // opencl_global
5363 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005364 5, // opencl_constant
5365 0, // cuda_device
5366 0, // cuda_constant
5367 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005368 };
5369
Eli Friedmana9c3d712009-08-19 20:47:07 +00005370 class TCETargetInfo : public TargetInfo{
5371 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005372 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005373 TLSSupported = false;
5374 IntWidth = 32;
5375 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005376 PointerWidth = 32;
5377 IntAlign = 32;
5378 LongAlign = LongLongAlign = 32;
5379 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005380 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005381 SizeType = UnsignedInt;
5382 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005383 IntPtrType = SignedInt;
5384 PtrDiffType = SignedInt;
5385 FloatWidth = 32;
5386 FloatAlign = 32;
5387 DoubleWidth = 32;
5388 DoubleAlign = 32;
5389 LongDoubleWidth = 32;
5390 LongDoubleAlign = 32;
5391 FloatFormat = &llvm::APFloat::IEEEsingle;
5392 DoubleFormat = &llvm::APFloat::IEEEsingle;
5393 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005394 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5395 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005396 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005397 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005398 }
5399
Craig Topper3164f332014-03-11 03:39:26 +00005400 void getTargetDefines(const LangOptions &Opts,
5401 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005402 DefineStd(Builder, "tce", Opts);
5403 Builder.defineMacro("__TCE__");
5404 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005405 }
Craig Topper3164f332014-03-11 03:39:26 +00005406 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005407 return Feature == "tce";
5408 }
Craig Topper3164f332014-03-11 03:39:26 +00005409
5410 void getTargetBuiltins(const Builtin::Info *&Records,
5411 unsigned &NumRecords) const override {}
5412 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005413 return "";
5414 }
Craig Topper3164f332014-03-11 03:39:26 +00005415 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005416 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005417 }
Craig Topper3164f332014-03-11 03:39:26 +00005418 void getGCCRegNames(const char * const *&Names,
5419 unsigned &NumNames) const override {}
5420 bool validateAsmConstraint(const char *&Name,
5421 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005422 return true;
5423 }
Craig Topper3164f332014-03-11 03:39:26 +00005424 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5425 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005426 };
5427}
5428
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005429namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005430class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005431 virtual void setDescriptionString() = 0;
5432
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005433 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005434 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005435 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005436 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005437 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005438 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005439 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005440 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005441 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005442 enum DspRevEnum {
5443 NoDSP, DSP1, DSP2
5444 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005445 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005446
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005447protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005448 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005449 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005450
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005451public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005452 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5453 const std::string &CPUStr)
5454 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005455 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005456 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005457
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005458 bool isNaN2008Default() const {
5459 return CPU == "mips32r6" || CPU == "mips64r6";
5460 }
5461
5462 bool isFP64Default() const {
5463 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5464 }
5465
Alp Toker4925ba72014-06-07 23:30:42 +00005466 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005467 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005468 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5469 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005470 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005471 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005472 .Case("mips1", IsMips32)
5473 .Case("mips2", IsMips32)
5474 .Case("mips3", true)
5475 .Case("mips4", true)
5476 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005477 .Case("mips32", IsMips32)
5478 .Case("mips32r2", IsMips32)
5479 .Case("mips32r6", IsMips32)
5480 .Case("mips64", true)
5481 .Case("mips64r2", true)
5482 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005483 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005484 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005485 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005486 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005487 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005488 // The backend enables certain ABI's by default according to the
5489 // architecture.
5490 // Disable both possible defaults so that we don't end up with multiple
5491 // ABI's selected and trigger an assertion.
5492 Features["o32"] = false;
5493 Features["n64"] = false;
5494
Eric Christopher0b26a612010-03-02 02:41:08 +00005495 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005496 if (CPU == "octeon")
5497 Features["mips64r2"] = Features["cnmips"] = true;
5498 else
5499 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005500 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005501
Craig Topper3164f332014-03-11 03:39:26 +00005502 void getTargetDefines(const LangOptions &Opts,
5503 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005504 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005505 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005506 if (Opts.GNUMode)
5507 Builder.defineMacro("mips");
5508
Simon Atanasyan683535b2012-08-29 19:14:58 +00005509 Builder.defineMacro("__REGISTER_PREFIX__", "");
5510
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005511 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005512 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005513 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005514 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005515 case SoftFloat:
5516 Builder.defineMacro("__mips_soft_float", Twine(1));
5517 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005518 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005519
Simon Atanasyan16071912013-04-14 14:07:30 +00005520 if (IsSingleFloat)
5521 Builder.defineMacro("__mips_single_float", Twine(1));
5522
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005523 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5524 Builder.defineMacro("_MIPS_FPSET",
5525 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5526
Simon Atanasyan72244b62012-07-05 16:06:06 +00005527 if (IsMips16)
5528 Builder.defineMacro("__mips16", Twine(1));
5529
Simon Atanasyan60777612013-04-14 14:07:51 +00005530 if (IsMicromips)
5531 Builder.defineMacro("__mips_micromips", Twine(1));
5532
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005533 if (IsNan2008)
5534 Builder.defineMacro("__mips_nan2008", Twine(1));
5535
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005536 switch (DspRev) {
5537 default:
5538 break;
5539 case DSP1:
5540 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5541 Builder.defineMacro("__mips_dsp", Twine(1));
5542 break;
5543 case DSP2:
5544 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5545 Builder.defineMacro("__mips_dspr2", Twine(1));
5546 Builder.defineMacro("__mips_dsp", Twine(1));
5547 break;
5548 }
5549
Jack Carter44ff1e52013-08-12 17:20:29 +00005550 if (HasMSA)
5551 Builder.defineMacro("__mips_msa", Twine(1));
5552
Simon Atanasyan26f19672012-04-05 19:28:31 +00005553 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5554 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5555 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005556
5557 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5558 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005559 }
5560
Craig Topper3164f332014-03-11 03:39:26 +00005561 void getTargetBuiltins(const Builtin::Info *&Records,
5562 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005563 Records = BuiltinInfo;
5564 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005565 }
Craig Topper3164f332014-03-11 03:39:26 +00005566 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005567 return llvm::StringSwitch<bool>(Feature)
5568 .Case("mips", true)
5569 .Case("fp64", HasFP64)
5570 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005571 }
Craig Topper3164f332014-03-11 03:39:26 +00005572 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005573 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005574 }
Craig Topper3164f332014-03-11 03:39:26 +00005575 void getGCCRegNames(const char * const *&Names,
5576 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005577 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005578 // CPU register names
5579 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005580 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5581 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5582 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005583 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5584 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005585 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5586 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5587 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5588 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005589 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005590 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005591 "$fcc5","$fcc6","$fcc7",
5592 // MSA register names
5593 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5594 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5595 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5596 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5597 // MSA control register names
5598 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5599 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005600 };
5601 Names = GCCRegNames;
5602 NumNames = llvm::array_lengthof(GCCRegNames);
5603 }
Craig Topper3164f332014-03-11 03:39:26 +00005604 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5605 unsigned &NumAliases) const override = 0;
5606 bool validateAsmConstraint(const char *&Name,
5607 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005608 switch (*Name) {
5609 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005610 return false;
5611
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005612 case 'r': // CPU registers.
5613 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005614 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005615 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005616 case 'c': // $25 for indirect jumps
5617 case 'l': // lo register
5618 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005619 Info.setAllowsRegister();
5620 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005621 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005622 Info.setAllowsMemory();
5623 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005624 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005625 }
5626
Craig Topper3164f332014-03-11 03:39:26 +00005627 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005628 // FIXME: Implement!
5629 return "";
5630 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005631
Craig Topper3164f332014-03-11 03:39:26 +00005632 bool handleTargetFeatures(std::vector<std::string> &Features,
5633 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005634 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005635 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005636 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005637 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005638 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005639 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005640 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005641
5642 for (std::vector<std::string>::iterator it = Features.begin(),
5643 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005644 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005645 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005646 else if (*it == "+soft-float")
5647 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005648 else if (*it == "+mips16")
5649 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005650 else if (*it == "+micromips")
5651 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005652 else if (*it == "+dsp")
5653 DspRev = std::max(DspRev, DSP1);
5654 else if (*it == "+dspr2")
5655 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005656 else if (*it == "+msa")
5657 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005658 else if (*it == "+fp64")
5659 HasFP64 = true;
5660 else if (*it == "-fp64")
5661 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005662 else if (*it == "+nan2008")
5663 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005664 else if (*it == "-nan2008")
5665 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005666 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005667
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005668 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005669 std::vector<std::string>::iterator it =
5670 std::find(Features.begin(), Features.end(), "+soft-float");
5671 if (it != Features.end())
5672 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005673
Akira Hatanaka9064e362013-10-29 18:30:33 +00005674 setDescriptionString();
5675
Rafael Espindolaeb265472013-08-21 21:59:03 +00005676 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005677 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005678
Craig Topper3164f332014-03-11 03:39:26 +00005679 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005680 if (RegNo == 0) return 4;
5681 if (RegNo == 1) return 5;
5682 return -1;
5683 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005684
5685 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005686};
5687
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005688const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5689#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5690#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5691 ALL_LANGUAGES },
5692#include "clang/Basic/BuiltinsMips.def"
5693};
5694
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005695class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005696public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005697 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005698 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005699 SizeType = UnsignedInt;
5700 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005701 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005702 }
Craig Topper3164f332014-03-11 03:39:26 +00005703 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005704 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005705 ABI = Name;
5706 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005707 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005708 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005709 }
Craig Topper3164f332014-03-11 03:39:26 +00005710 void getTargetDefines(const LangOptions &Opts,
5711 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005712 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005713
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005714 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005715 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5716
5717 const std::string& CPUStr = getCPU();
5718 if (CPUStr == "mips32")
5719 Builder.defineMacro("__mips_isa_rev", "1");
5720 else if (CPUStr == "mips32r2")
5721 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005722
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005723 if (ABI == "o32") {
5724 Builder.defineMacro("__mips_o32");
5725 Builder.defineMacro("_ABIO32", "1");
5726 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5727 }
5728 else if (ABI == "eabi")
5729 Builder.defineMacro("__mips_eabi");
5730 else
David Blaikie83d382b2011-09-23 05:06:16 +00005731 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005732 }
Craig Topper3164f332014-03-11 03:39:26 +00005733 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5734 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005735 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5736 { { "at" }, "$1" },
5737 { { "v0" }, "$2" },
5738 { { "v1" }, "$3" },
5739 { { "a0" }, "$4" },
5740 { { "a1" }, "$5" },
5741 { { "a2" }, "$6" },
5742 { { "a3" }, "$7" },
5743 { { "t0" }, "$8" },
5744 { { "t1" }, "$9" },
5745 { { "t2" }, "$10" },
5746 { { "t3" }, "$11" },
5747 { { "t4" }, "$12" },
5748 { { "t5" }, "$13" },
5749 { { "t6" }, "$14" },
5750 { { "t7" }, "$15" },
5751 { { "s0" }, "$16" },
5752 { { "s1" }, "$17" },
5753 { { "s2" }, "$18" },
5754 { { "s3" }, "$19" },
5755 { { "s4" }, "$20" },
5756 { { "s5" }, "$21" },
5757 { { "s6" }, "$22" },
5758 { { "s7" }, "$23" },
5759 { { "t8" }, "$24" },
5760 { { "t9" }, "$25" },
5761 { { "k0" }, "$26" },
5762 { { "k1" }, "$27" },
5763 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005764 { { "sp","$sp" }, "$29" },
5765 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005766 { { "ra" }, "$31" }
5767 };
5768 Aliases = GCCRegAliases;
5769 NumAliases = llvm::array_lengthof(GCCRegAliases);
5770 }
5771};
5772
5773class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005774 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005775 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005776 }
5777
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005778public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005779 Mips32EBTargetInfo(const llvm::Triple &Triple)
5780 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005781 }
Craig Topper3164f332014-03-11 03:39:26 +00005782 void getTargetDefines(const LangOptions &Opts,
5783 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005784 DefineStd(Builder, "MIPSEB", Opts);
5785 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005786 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005787 }
5788};
5789
5790class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005791 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005792 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005793 }
5794
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005796 Mips32ELTargetInfo(const llvm::Triple &Triple)
5797 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005798 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005799 }
Craig Topper3164f332014-03-11 03:39:26 +00005800 void getTargetDefines(const LangOptions &Opts,
5801 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005802 DefineStd(Builder, "MIPSEL", Opts);
5803 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005804 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005805 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005806};
Akira Hatanakabef17452011-09-20 19:21:49 +00005807
5808class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005809public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005810 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005811 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005812 LongDoubleWidth = LongDoubleAlign = 128;
5813 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005814 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5815 LongDoubleWidth = LongDoubleAlign = 64;
5816 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5817 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005818 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005819 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005820 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005821 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005822
5823 void setN64ABITypes() {
5824 LongWidth = LongAlign = 64;
5825 PointerWidth = PointerAlign = 64;
5826 SizeType = UnsignedLong;
5827 PtrDiffType = SignedLong;
5828 }
5829
5830 void setN32ABITypes() {
5831 LongWidth = LongAlign = 32;
5832 PointerWidth = PointerAlign = 32;
5833 SizeType = UnsignedInt;
5834 PtrDiffType = SignedInt;
5835 }
5836
Craig Topper3164f332014-03-11 03:39:26 +00005837 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005838 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005839 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005840 ABI = Name;
5841 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005842 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005843 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005844 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005845 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005846 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005847 }
5848 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005849 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005850
Craig Topper3164f332014-03-11 03:39:26 +00005851 void getTargetDefines(const LangOptions &Opts,
5852 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005853 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005854
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005855 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005856 Builder.defineMacro("__mips64");
5857 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005858 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5859
5860 const std::string& CPUStr = getCPU();
5861 if (CPUStr == "mips64")
5862 Builder.defineMacro("__mips_isa_rev", "1");
5863 else if (CPUStr == "mips64r2")
5864 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005865
Akira Hatanakabef17452011-09-20 19:21:49 +00005866 if (ABI == "n32") {
5867 Builder.defineMacro("__mips_n32");
5868 Builder.defineMacro("_ABIN32", "2");
5869 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5870 }
5871 else if (ABI == "n64") {
5872 Builder.defineMacro("__mips_n64");
5873 Builder.defineMacro("_ABI64", "3");
5874 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5875 }
5876 else
David Blaikie83d382b2011-09-23 05:06:16 +00005877 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005878 }
Craig Topper3164f332014-03-11 03:39:26 +00005879 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5880 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005881 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5882 { { "at" }, "$1" },
5883 { { "v0" }, "$2" },
5884 { { "v1" }, "$3" },
5885 { { "a0" }, "$4" },
5886 { { "a1" }, "$5" },
5887 { { "a2" }, "$6" },
5888 { { "a3" }, "$7" },
5889 { { "a4" }, "$8" },
5890 { { "a5" }, "$9" },
5891 { { "a6" }, "$10" },
5892 { { "a7" }, "$11" },
5893 { { "t0" }, "$12" },
5894 { { "t1" }, "$13" },
5895 { { "t2" }, "$14" },
5896 { { "t3" }, "$15" },
5897 { { "s0" }, "$16" },
5898 { { "s1" }, "$17" },
5899 { { "s2" }, "$18" },
5900 { { "s3" }, "$19" },
5901 { { "s4" }, "$20" },
5902 { { "s5" }, "$21" },
5903 { { "s6" }, "$22" },
5904 { { "s7" }, "$23" },
5905 { { "t8" }, "$24" },
5906 { { "t9" }, "$25" },
5907 { { "k0" }, "$26" },
5908 { { "k1" }, "$27" },
5909 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005910 { { "sp","$sp" }, "$29" },
5911 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005912 { { "ra" }, "$31" }
5913 };
5914 Aliases = GCCRegAliases;
5915 NumAliases = llvm::array_lengthof(GCCRegAliases);
5916 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005917
5918 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005919};
5920
5921class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005922 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005923 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005924 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 +00005925 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005926 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005927
Akira Hatanakabef17452011-09-20 19:21:49 +00005928 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005929
Akira Hatanakabef17452011-09-20 19:21:49 +00005930public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005931 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005932 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005933 void getTargetDefines(const LangOptions &Opts,
5934 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005935 DefineStd(Builder, "MIPSEB", Opts);
5936 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005937 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005938 }
5939};
5940
5941class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005942 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005943 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005944 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 +00005945 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005946 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005947 }
5948public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005949 Mips64ELTargetInfo(const llvm::Triple &Triple)
5950 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005951 // Default ABI is n64.
5952 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005953 }
Craig Topper3164f332014-03-11 03:39:26 +00005954 void getTargetDefines(const LangOptions &Opts,
5955 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005956 DefineStd(Builder, "MIPSEL", Opts);
5957 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005958 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005959 }
5960};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005961} // end anonymous namespace.
5962
Ivan Krasindd7403e2011-08-24 20:22:22 +00005963namespace {
5964class PNaClTargetInfo : public TargetInfo {
5965public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005966 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005967 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005968 this->UserLabelPrefix = "";
5969 this->LongAlign = 32;
5970 this->LongWidth = 32;
5971 this->PointerAlign = 32;
5972 this->PointerWidth = 32;
5973 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005974 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005975 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005976 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005977 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005978 this->SizeType = TargetInfo::UnsignedInt;
5979 this->PtrDiffType = TargetInfo::SignedInt;
5980 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005981 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005982 }
5983
Craig Topper3164f332014-03-11 03:39:26 +00005984 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005985 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005986 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005987 Builder.defineMacro("__le32__");
5988 Builder.defineMacro("__pnacl__");
5989 }
Craig Topper3164f332014-03-11 03:39:26 +00005990 void getTargetDefines(const LangOptions &Opts,
5991 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005992 getArchDefines(Opts, Builder);
5993 }
Craig Topper3164f332014-03-11 03:39:26 +00005994 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005995 return Feature == "pnacl";
5996 }
Craig Topper3164f332014-03-11 03:39:26 +00005997 void getTargetBuiltins(const Builtin::Info *&Records,
5998 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005999 }
Craig Topper3164f332014-03-11 03:39:26 +00006000 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006001 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006002 }
Craig Topper3164f332014-03-11 03:39:26 +00006003 void getGCCRegNames(const char * const *&Names,
6004 unsigned &NumNames) const override;
6005 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6006 unsigned &NumAliases) const override;
6007 bool validateAsmConstraint(const char *&Name,
6008 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006009 return false;
6010 }
6011
Craig Topper3164f332014-03-11 03:39:26 +00006012 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006013 return "";
6014 }
6015};
6016
6017void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6018 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006019 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006020 NumNames = 0;
6021}
6022
6023void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6024 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006025 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006026 NumAliases = 0;
6027}
6028} // end anonymous namespace.
6029
Guy Benyeib798fc92012-12-11 21:38:14 +00006030namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006031class Le64TargetInfo : public TargetInfo {
6032 static const Builtin::Info BuiltinInfo[];
6033
6034public:
6035 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6036 BigEndian = false;
6037 NoAsmVariants = true;
6038 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6039 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6040 DescriptionString =
6041 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6042 }
6043
6044 void getTargetDefines(const LangOptions &Opts,
6045 MacroBuilder &Builder) const override {
6046 DefineStd(Builder, "unix", Opts);
6047 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6048 Builder.defineMacro("__ELF__");
6049 }
6050 void getTargetBuiltins(const Builtin::Info *&Records,
6051 unsigned &NumRecords) const override {
6052 Records = BuiltinInfo;
6053 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6054 }
6055 BuiltinVaListKind getBuiltinVaListKind() const override {
6056 return TargetInfo::PNaClABIBuiltinVaList;
6057 }
6058 const char *getClobbers() const override { return ""; }
6059 void getGCCRegNames(const char *const *&Names,
6060 unsigned &NumNames) const override {
6061 Names = nullptr;
6062 NumNames = 0;
6063 }
6064 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6065 unsigned &NumAliases) const override {
6066 Aliases = nullptr;
6067 NumAliases = 0;
6068 }
6069 bool validateAsmConstraint(const char *&Name,
6070 TargetInfo::ConstraintInfo &Info) const override {
6071 return false;
6072 }
6073
6074 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006075};
6076} // end anonymous namespace.
6077
6078const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6079#define BUILTIN(ID, TYPE, ATTRS) \
6080 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6081#include "clang/Basic/BuiltinsLe64.def"
6082};
6083
6084namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006085 static const unsigned SPIRAddrSpaceMap[] = {
6086 1, // opencl_global
6087 3, // opencl_local
6088 2, // opencl_constant
6089 0, // cuda_device
6090 0, // cuda_constant
6091 0 // cuda_shared
6092 };
6093 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006094 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006095 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006096 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6097 "SPIR target must use unknown OS");
6098 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6099 "SPIR target must use unknown environment type");
6100 BigEndian = false;
6101 TLSSupported = false;
6102 LongWidth = LongAlign = 64;
6103 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006104 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006105 // Define available target features
6106 // These must be defined in sorted order!
6107 NoAsmVariants = true;
6108 }
Craig Topper3164f332014-03-11 03:39:26 +00006109 void getTargetDefines(const LangOptions &Opts,
6110 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006111 DefineStd(Builder, "SPIR", Opts);
6112 }
Craig Topper3164f332014-03-11 03:39:26 +00006113 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006114 return Feature == "spir";
6115 }
Craig Topper3164f332014-03-11 03:39:26 +00006116
6117 void getTargetBuiltins(const Builtin::Info *&Records,
6118 unsigned &NumRecords) const override {}
6119 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006120 return "";
6121 }
Craig Topper3164f332014-03-11 03:39:26 +00006122 void getGCCRegNames(const char * const *&Names,
6123 unsigned &NumNames) const override {}
6124 bool validateAsmConstraint(const char *&Name,
6125 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006126 return true;
6127 }
Craig Topper3164f332014-03-11 03:39:26 +00006128 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6129 unsigned &NumAliases) const override {}
6130 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006131 return TargetInfo::VoidPtrBuiltinVaList;
6132 }
6133 };
6134
6135
6136 class SPIR32TargetInfo : public SPIRTargetInfo {
6137 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006138 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006139 PointerWidth = PointerAlign = 32;
6140 SizeType = TargetInfo::UnsignedInt;
6141 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6142 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006143 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6144 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006145 }
Craig Topper3164f332014-03-11 03:39:26 +00006146 void getTargetDefines(const LangOptions &Opts,
6147 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006148 DefineStd(Builder, "SPIR32", Opts);
6149 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006150 };
6151
6152 class SPIR64TargetInfo : public SPIRTargetInfo {
6153 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006154 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006155 PointerWidth = PointerAlign = 64;
6156 SizeType = TargetInfo::UnsignedLong;
6157 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006158 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6159 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006160 }
Craig Topper3164f332014-03-11 03:39:26 +00006161 void getTargetDefines(const LangOptions &Opts,
6162 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006163 DefineStd(Builder, "SPIR64", Opts);
6164 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006165 };
6166}
6167
Robert Lytton0e076492013-08-13 09:43:10 +00006168namespace {
6169class XCoreTargetInfo : public TargetInfo {
6170 static const Builtin::Info BuiltinInfo[];
6171public:
6172 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6173 BigEndian = false;
6174 NoAsmVariants = true;
6175 LongLongAlign = 32;
6176 SuitableAlign = 32;
6177 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006178 SizeType = UnsignedInt;
6179 PtrDiffType = SignedInt;
6180 IntPtrType = SignedInt;
6181 WCharType = UnsignedChar;
6182 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006183 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006184 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 +00006185 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006186 }
Craig Topper3164f332014-03-11 03:39:26 +00006187 void getTargetDefines(const LangOptions &Opts,
6188 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006189 Builder.defineMacro("__XS1B__");
6190 }
Craig Topper3164f332014-03-11 03:39:26 +00006191 void getTargetBuiltins(const Builtin::Info *&Records,
6192 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006193 Records = BuiltinInfo;
6194 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6195 }
Craig Topper3164f332014-03-11 03:39:26 +00006196 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006197 return TargetInfo::VoidPtrBuiltinVaList;
6198 }
Craig Topper3164f332014-03-11 03:39:26 +00006199 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006200 return "";
6201 }
Craig Topper3164f332014-03-11 03:39:26 +00006202 void getGCCRegNames(const char * const *&Names,
6203 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006204 static const char * const GCCRegNames[] = {
6205 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6206 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6207 };
6208 Names = GCCRegNames;
6209 NumNames = llvm::array_lengthof(GCCRegNames);
6210 }
Craig Topper3164f332014-03-11 03:39:26 +00006211 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6212 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006213 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006214 NumAliases = 0;
6215 }
Craig Topper3164f332014-03-11 03:39:26 +00006216 bool validateAsmConstraint(const char *&Name,
6217 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006218 return false;
6219 }
Craig Topper3164f332014-03-11 03:39:26 +00006220 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006221 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6222 return (RegNo < 2)? RegNo : -1;
6223 }
Robert Lytton0e076492013-08-13 09:43:10 +00006224};
6225
6226const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6227#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6228#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6229 ALL_LANGUAGES },
6230#include "clang/Basic/BuiltinsXCore.def"
6231};
6232} // end anonymous namespace.
6233
Ivan Krasindd7403e2011-08-24 20:22:22 +00006234
Chris Lattner5ba61f02006-10-14 07:39:34 +00006235//===----------------------------------------------------------------------===//
6236// Driver code
6237//===----------------------------------------------------------------------===//
6238
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006239static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006240 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006241
Daniel Dunbar52322032009-08-18 05:47:58 +00006242 switch (Triple.getArch()) {
6243 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006244 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006245
Tim Northover2a0783d2014-05-30 14:14:07 +00006246 case llvm::Triple::xcore:
6247 return new XCoreTargetInfo(Triple);
6248
6249 case llvm::Triple::hexagon:
6250 return new HexagonTargetInfo(Triple);
6251
6252 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006253 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006254 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006255
6256 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006257 case llvm::Triple::FreeBSD:
6258 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006259 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006260 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006261 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006262 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006263 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006264 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006265 }
6266
Christian Pirker9b019ae2014-02-25 13:51:00 +00006267 case llvm::Triple::aarch64_be:
6268 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006269 case llvm::Triple::FreeBSD:
6270 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006271 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006272 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006273 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006274 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006275 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006276 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006277 }
6278
Daniel Dunbar52322032009-08-18 05:47:58 +00006279 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006280 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006281 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006282 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006283
Daniel Dunbar52322032009-08-18 05:47:58 +00006284 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006285 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006286 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006287 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006288 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006289 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006290 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006291 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006292 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006293 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006294 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006295 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006296 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006297 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006298 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006299 case llvm::Triple::Win32:
6300 switch (Triple.getEnvironment()) {
6301 default:
6302 return new ARMleTargetInfo(Triple);
6303 case llvm::Triple::Itanium:
6304 return new ItaniumWindowsARMleTargetInfo(Triple);
6305 case llvm::Triple::MSVC:
6306 return new MicrosoftARMleTargetInfo(Triple);
6307 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006308 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006309 return new ARMleTargetInfo(Triple);
6310 }
6311
6312 case llvm::Triple::armeb:
6313 case llvm::Triple::thumbeb:
6314 if (Triple.isOSDarwin())
6315 return new DarwinARMTargetInfo(Triple);
6316
6317 switch (os) {
6318 case llvm::Triple::Linux:
6319 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6320 case llvm::Triple::FreeBSD:
6321 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6322 case llvm::Triple::NetBSD:
6323 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6324 case llvm::Triple::OpenBSD:
6325 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6326 case llvm::Triple::Bitrig:
6327 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6328 case llvm::Triple::RTEMS:
6329 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6330 case llvm::Triple::NaCl:
6331 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6332 default:
6333 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006334 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006335
Daniel Dunbar52322032009-08-18 05:47:58 +00006336 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006337 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006338
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006339 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006340 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006341 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006342 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006343 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006344 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006345 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006346 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006347 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006348 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006349 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006350 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006351 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006352
6353 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006354 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006355 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006356 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006357 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006358 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006359 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006360 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006361 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006362 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006363 case llvm::Triple::NaCl:
6364 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006365 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006367 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006368
Akira Hatanakabef17452011-09-20 19:21:49 +00006369 case llvm::Triple::mips64:
6370 switch (os) {
6371 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006373 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006374 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006375 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006376 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006377 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006378 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006379 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006380 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006381 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006382 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006383 }
6384
6385 case llvm::Triple::mips64el:
6386 switch (os) {
6387 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006389 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006390 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006391 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006392 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006393 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006394 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006395 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006396 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006397 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006398 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006399 }
6400
Ivan Krasindd7403e2011-08-24 20:22:22 +00006401 case llvm::Triple::le32:
6402 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006403 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006404 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006405 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006406 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006407 }
6408
JF Bastien643817d2014-09-12 17:52:47 +00006409 case llvm::Triple::le64:
6410 return new Le64TargetInfo(Triple);
6411
Daniel Dunbar52322032009-08-18 05:47:58 +00006412 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006413 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006414 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006415 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006416 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006417 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006418 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006419 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006420 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006421 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006422 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006423 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006424 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006425 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006426 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006427 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006428 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006429
6430 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006431 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006432 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006433 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006434 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006435 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006436 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006437 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006438 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006439 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006440 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006441 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006442 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006443 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006444 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006445
Bill Schmidt778d3872013-07-26 01:36:11 +00006446 case llvm::Triple::ppc64le:
6447 switch (os) {
6448 case llvm::Triple::Linux:
6449 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6450 default:
6451 return new PPC64TargetInfo(Triple);
6452 }
6453
Peter Collingbournec947aae2012-05-20 23:28:41 +00006454 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006455 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006456 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006457 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006458
Eli Friedmand13b41e2012-10-12 23:32:00 +00006459 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006460 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006461
Daniel Dunbar52322032009-08-18 05:47:58 +00006462 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006463 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006464 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006465 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006466 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006467 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006468 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006469 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006470 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006471 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006472 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006473 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006474 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006475 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006476 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006477
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006478 case llvm::Triple::sparcv9:
6479 switch (os) {
6480 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006481 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006482 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006483 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006484 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006485 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006486 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006487 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006488 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006489 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006490 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006492 }
6493
Ulrich Weigand47445072013-05-06 16:26:41 +00006494 case llvm::Triple::systemz:
6495 switch (os) {
6496 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006497 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006498 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006499 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006500 }
6501
Eli Friedmana9c3d712009-08-19 20:47:07 +00006502 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006503 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006504
Daniel Dunbar52322032009-08-18 05:47:58 +00006505 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006506 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006508
Daniel Dunbar52322032009-08-18 05:47:58 +00006509 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006510 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006511 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006512 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006513 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006514 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006515 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006516 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006517 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006518 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006519 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006520 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006521 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006522 case llvm::Triple::KFreeBSD:
6523 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006524 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006525 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006526 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006527 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006528 case llvm::Triple::Win32: {
6529 switch (Triple.getEnvironment()) {
6530 default:
6531 return new X86_32TargetInfo(Triple);
6532 case llvm::Triple::Cygnus:
6533 return new CygwinX86_32TargetInfo(Triple);
6534 case llvm::Triple::GNU:
6535 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006536 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006537 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006538 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006539 }
6540 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006541 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006542 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006543 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006544 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006545 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006546 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006547 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006548 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006549 }
6550
6551 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006552 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006553 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006554
Daniel Dunbar52322032009-08-18 05:47:58 +00006555 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006556 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006557 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006558 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006559 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006560 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006561 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006562 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006563 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006564 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006565 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006566 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006568 case llvm::Triple::KFreeBSD:
6569 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006570 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006571 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006572 case llvm::Triple::Win32: {
6573 switch (Triple.getEnvironment()) {
6574 default:
6575 return new X86_64TargetInfo(Triple);
6576 case llvm::Triple::GNU:
6577 return new MinGWX86_64TargetInfo(Triple);
6578 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006579 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006580 }
6581 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006582 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006583 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006584 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006585 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006586 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006587
6588 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006589 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006590 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006591 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006592 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006593 }
6594 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006595 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006596 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006597 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006598 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006599 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006600 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006601}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006602
6603/// CreateTargetInfo - Return the target info object for the specified target
6604/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006605TargetInfo *
6606TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6607 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006608 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006609
6610 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006611 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006612 if (!Target) {
6613 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006614 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006615 }
Alp Toker80758082014-07-06 05:26:44 +00006616 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006617
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006618 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006619 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6620 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006621 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006622 }
6623
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006624 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006625 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6626 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006627 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006628 }
6629
Rafael Espindolaeb265472013-08-21 21:59:03 +00006630 // Set the fp math unit.
6631 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6632 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006633 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006634 }
6635
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006636 // Compute the default target features, we need the target to handle this
6637 // because features may have dependencies on one another.
6638 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006639 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006640
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006641 // Apply the user specified deltas.
6642 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6643 I < N; ++I) {
6644 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006645 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006646 bool Enabled = Name[0] == '+';
6647 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006648 }
6649
6650 // Add the features to the compile options.
6651 //
6652 // FIXME: If we are completely confident that we have the right set, we only
6653 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006654 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006655 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6656 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006657 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006658 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006659 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006660
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006661 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006662}