blob: f83eea5de0eaca709052e659e35ebe2c164f3fb0 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Craig Topper3164f332014-03-11 03:39:26 +0000191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Craig Topper3164f332014-03-11 03:39:26 +0000203 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000207 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000211
Craig Topper3164f332014-03-11 03:39:26 +0000212 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000216
John McCalleed64c72012-01-29 01:20:30 +0000217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000220 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000221 return false;
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223};
224
Chris Lattner30ba6742009-08-10 19:03:04 +0000225
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
Craig Topper3164f332014-03-11 03:39:26 +0000230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 }
240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000244
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
Craig Topper3164f332014-03-11 03:39:26 +0000259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 // FreeBSD defines; list based off of gcc output
262
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
276 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277 }
278public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000279 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
280 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000281
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000282 switch (Triple.getArch()) {
283 default:
284 case llvm::Triple::x86:
285 case llvm::Triple::x86_64:
286 this->MCountName = ".mcount";
287 break;
288 case llvm::Triple::mips:
289 case llvm::Triple::mipsel:
290 case llvm::Triple::ppc:
291 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000292 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000293 this->MCountName = "_mcount";
294 break;
295 case llvm::Triple::arm:
296 this->MCountName = "__mcount";
297 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000298 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300};
301
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000302// GNU/kFreeBSD Target
303template<typename Target>
304class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
305protected:
Craig Topper3164f332014-03-11 03:39:26 +0000306 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
307 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308 // GNU/kFreeBSD defines; list based off of gcc output
309
310 DefineStd(Builder, "unix", Opts);
311 Builder.defineMacro("__FreeBSD_kernel__");
312 Builder.defineMacro("__GLIBC__");
313 Builder.defineMacro("__ELF__");
314 if (Opts.POSIXThreads)
315 Builder.defineMacro("_REENTRANT");
316 if (Opts.CPlusPlus)
317 Builder.defineMacro("_GNU_SOURCE");
318 }
319public:
Eric Christopher917e9522014-11-18 22:36:15 +0000320 KFreeBSDTargetInfo(const llvm::Triple &Triple)
321 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000322 this->UserLabelPrefix = "";
323 }
324};
325
Chris Lattner3e2ee142010-07-07 16:01:42 +0000326// Minix Target
327template<typename Target>
328class MinixTargetInfo : public OSTargetInfo<Target> {
329protected:
Craig Topper3164f332014-03-11 03:39:26 +0000330 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
331 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000332 // Minix defines
333
334 Builder.defineMacro("__minix", "3");
335 Builder.defineMacro("_EM_WSIZE", "4");
336 Builder.defineMacro("_EM_PSIZE", "4");
337 Builder.defineMacro("_EM_SSIZE", "2");
338 Builder.defineMacro("_EM_LSIZE", "4");
339 Builder.defineMacro("_EM_FSIZE", "4");
340 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000341 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000342 DefineStd(Builder, "unix", Opts);
343 }
344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000345 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
346 this->UserLabelPrefix = "";
347 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000348};
349
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350// Linux target
351template<typename Target>
352class LinuxTargetInfo : public OSTargetInfo<Target> {
353protected:
Craig Topper3164f332014-03-11 03:39:26 +0000354 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
355 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000357 DefineStd(Builder, "unix", Opts);
358 DefineStd(Builder, "linux", Opts);
359 Builder.defineMacro("__gnu_linux__");
360 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000361 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000362 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000363 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000364 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000365 if (Opts.CPlusPlus)
366 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000367 }
368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000369 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000370 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000371 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000372
373 switch (Triple.getArch()) {
374 default:
375 break;
376 case llvm::Triple::ppc:
377 case llvm::Triple::ppc64:
378 case llvm::Triple::ppc64le:
379 this->MCountName = "_mcount";
380 break;
381 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000382 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000383
Craig Topper3164f332014-03-11 03:39:26 +0000384 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000385 return ".text.startup";
386 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000387};
388
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000389// NetBSD Target
390template<typename Target>
391class NetBSDTargetInfo : public OSTargetInfo<Target> {
392protected:
Craig Topper3164f332014-03-11 03:39:26 +0000393 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
394 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000395 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("__NetBSD__");
397 Builder.defineMacro("__unix__");
398 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000399 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000400 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000401
402 switch (Triple.getArch()) {
403 default:
404 break;
405 case llvm::Triple::arm:
406 case llvm::Triple::armeb:
407 case llvm::Triple::thumb:
408 case llvm::Triple::thumbeb:
409 Builder.defineMacro("__ARM_DWARF_EH__");
410 break;
411 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000412 }
413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000414 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
415 this->UserLabelPrefix = "";
416 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000417};
418
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419// OpenBSD Target
420template<typename Target>
421class OpenBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425 // OpenBSD defines; list based off of gcc output
426
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("__OpenBSD__");
428 DefineStd(Builder, "unix", Opts);
429 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000430 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000431 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000432 }
433public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000434 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
435 this->UserLabelPrefix = "";
436 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000437
Eli Friedman3715d1f2011-12-15 02:15:56 +0000438 switch (Triple.getArch()) {
439 default:
440 case llvm::Triple::x86:
441 case llvm::Triple::x86_64:
442 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000443 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000444 this->MCountName = "__mcount";
445 break;
446 case llvm::Triple::mips64:
447 case llvm::Triple::mips64el:
448 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000449 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000450 this->MCountName = "_mcount";
451 break;
452 }
453 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000454};
455
Eli Friedman9fa28852012-08-08 23:57:20 +0000456// Bitrig Target
457template<typename Target>
458class BitrigTargetInfo : public OSTargetInfo<Target> {
459protected:
Craig Topper3164f332014-03-11 03:39:26 +0000460 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
461 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000462 // Bitrig defines; list based off of gcc output
463
464 Builder.defineMacro("__Bitrig__");
465 DefineStd(Builder, "unix", Opts);
466 Builder.defineMacro("__ELF__");
467 if (Opts.POSIXThreads)
468 Builder.defineMacro("_REENTRANT");
469 }
470public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000471 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
472 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000473 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000474 }
475};
476
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000477// PSP Target
478template<typename Target>
479class PSPTargetInfo : public OSTargetInfo<Target> {
480protected:
Craig Topper3164f332014-03-11 03:39:26 +0000481 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
482 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000483 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000484 Builder.defineMacro("PSP");
485 Builder.defineMacro("_PSP");
486 Builder.defineMacro("__psp__");
487 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000488 }
489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000490 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000491 this->UserLabelPrefix = "";
492 }
493};
494
John Thompsone467e192009-11-19 17:18:50 +0000495// PS3 PPU Target
496template<typename Target>
497class PS3PPUTargetInfo : public OSTargetInfo<Target> {
498protected:
Craig Topper3164f332014-03-11 03:39:26 +0000499 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
500 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000501 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000502 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000503 Builder.defineMacro("__PPU__");
504 Builder.defineMacro("__CELLOS_LV2__");
505 Builder.defineMacro("__ELF__");
506 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000507 Builder.defineMacro("_ARCH_PPC64");
508 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000509 }
510public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000511 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000512 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000513 this->LongWidth = this->LongAlign = 32;
514 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000515 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000516 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000517 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000518 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000519 }
520};
521
Torok Edwinb2b37c62009-06-30 17:10:35 +0000522// Solaris target
523template<typename Target>
524class SolarisTargetInfo : public OSTargetInfo<Target> {
525protected:
Craig Topper3164f332014-03-11 03:39:26 +0000526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
527 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 DefineStd(Builder, "sun", Opts);
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
531 Builder.defineMacro("__svr4__");
532 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000533 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
534 // newer, but to 500 for everything else. feature_test.h has a check to
535 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000536 // with a new version.
537 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000538 Builder.defineMacro("_XOPEN_SOURCE", "600");
539 else
540 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000541 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000542 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000543 Builder.defineMacro("_LARGEFILE_SOURCE");
544 Builder.defineMacro("_LARGEFILE64_SOURCE");
545 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000546 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000547 }
548public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000549 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000551 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000552 // FIXME: WIntType should be SignedLong
553 }
554};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000555
556// Windows target
557template<typename Target>
558class WindowsTargetInfo : public OSTargetInfo<Target> {
559protected:
Craig Topper3164f332014-03-11 03:39:26 +0000560 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
561 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000562 Builder.defineMacro("_WIN32");
563 }
564 void getVisualStudioDefines(const LangOptions &Opts,
565 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000566 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000567 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000568 Builder.defineMacro("_CPPRTTI");
569
570 if (Opts.Exceptions)
571 Builder.defineMacro("_CPPUNWIND");
572 }
573
574 if (!Opts.CharIsSigned)
575 Builder.defineMacro("_CHAR_UNSIGNED");
576
577 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
578 // but it works for now.
579 if (Opts.POSIXThreads)
580 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000581
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000582 if (Opts.MSCompatibilityVersion) {
583 Builder.defineMacro("_MSC_VER",
584 Twine(Opts.MSCompatibilityVersion / 100000));
585 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000586 // FIXME We cannot encode the revision information into 32-bits
587 Builder.defineMacro("_MSC_BUILD", Twine(1));
588 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000589
590 if (Opts.MicrosoftExt) {
591 Builder.defineMacro("_MSC_EXTENSIONS");
592
593 if (Opts.CPlusPlus11) {
594 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
595 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
596 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
597 }
598 }
599
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000600 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601 }
602
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000603public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000604 WindowsTargetInfo(const llvm::Triple &Triple)
605 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000606};
607
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000608template <typename Target>
609class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000610protected:
Craig Topper3164f332014-03-11 03:39:26 +0000611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
612 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000613 if (Opts.POSIXThreads)
614 Builder.defineMacro("_REENTRANT");
615 if (Opts.CPlusPlus)
616 Builder.defineMacro("_GNU_SOURCE");
617
618 DefineStd(Builder, "unix", Opts);
619 Builder.defineMacro("__ELF__");
620 Builder.defineMacro("__native_client__");
621 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000622
623public:
624 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000625 this->UserLabelPrefix = "";
626 this->LongAlign = 32;
627 this->LongWidth = 32;
628 this->PointerAlign = 32;
629 this->PointerWidth = 32;
630 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000631 this->Int64Type = TargetInfo::SignedLongLong;
632 this->DoubleAlign = 64;
633 this->LongDoubleWidth = 64;
634 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000635 this->LongLongWidth = 64;
636 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000637 this->SizeType = TargetInfo::UnsignedInt;
638 this->PtrDiffType = TargetInfo::SignedInt;
639 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000640 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000641 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000642 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000643 this->DescriptionString =
644 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000645 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000646 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000647 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000648 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000649 } else if (Triple.getArch() == llvm::Triple::mipsel) {
650 // Handled on mips' setDescriptionString.
651 } else {
652 assert(Triple.getArch() == llvm::Triple::le32);
653 this->DescriptionString = "e-p:32:32-i64:64";
654 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000655 }
Craig Topper3164f332014-03-11 03:39:26 +0000656 typename Target::CallingConvCheckResult checkCallingConvention(
657 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000658 return CC == CC_PnaclCall ? Target::CCCR_OK :
659 Target::checkCallingConvention(CC);
660 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000661};
Mike Stump11289f42009-09-09 15:08:12 +0000662} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000663
Chris Lattner09d98f52008-10-05 21:50:58 +0000664//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665// Specific target implementations.
666//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000667
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000668namespace {
669// PPC abstract base class
670class PPCTargetInfo : public TargetInfo {
671 static const Builtin::Info BuiltinInfo[];
672 static const char * const GCCRegNames[];
673 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000674 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000675
676 // Target cpu features.
677 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000678 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000679
Ulrich Weigand8afad612014-07-28 13:17:52 +0000680protected:
681 std::string ABI;
682
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000683public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000684 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000685 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000686 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000687 LongDoubleWidth = LongDoubleAlign = 128;
688 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
689 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000690
Hal Finkel6b984f02012-07-03 16:51:04 +0000691 /// \brief Flags for architecture specific defines.
692 typedef enum {
693 ArchDefineNone = 0,
694 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
695 ArchDefinePpcgr = 1 << 1,
696 ArchDefinePpcsq = 1 << 2,
697 ArchDefine440 = 1 << 3,
698 ArchDefine603 = 1 << 4,
699 ArchDefine604 = 1 << 5,
700 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000701 ArchDefinePwr5 = 1 << 7,
702 ArchDefinePwr5x = 1 << 8,
703 ArchDefinePwr6 = 1 << 9,
704 ArchDefinePwr6x = 1 << 10,
705 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000706 ArchDefinePwr8 = 1 << 12,
707 ArchDefineA2 = 1 << 13,
708 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000709 } ArchDefineTypes;
710
Bill Schmidt38378a02013-02-01 20:23:10 +0000711 // Note: GCC recognizes the following additional cpus:
712 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
713 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
714 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000715 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000716 bool CPUKnown = llvm::StringSwitch<bool>(Name)
717 .Case("generic", true)
718 .Case("440", true)
719 .Case("450", true)
720 .Case("601", true)
721 .Case("602", true)
722 .Case("603", true)
723 .Case("603e", true)
724 .Case("603ev", true)
725 .Case("604", true)
726 .Case("604e", true)
727 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000728 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000729 .Case("g3", true)
730 .Case("7400", true)
731 .Case("g4", true)
732 .Case("7450", true)
733 .Case("g4+", true)
734 .Case("750", true)
735 .Case("970", true)
736 .Case("g5", true)
737 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000738 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000739 .Case("e500mc", true)
740 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000741 .Case("power3", true)
742 .Case("pwr3", true)
743 .Case("power4", true)
744 .Case("pwr4", true)
745 .Case("power5", true)
746 .Case("pwr5", true)
747 .Case("power5x", true)
748 .Case("pwr5x", true)
749 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000750 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000751 .Case("power6x", true)
752 .Case("pwr6x", true)
753 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000754 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000755 .Case("power8", true)
756 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000757 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000758 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000759 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000760 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000761 .Case("powerpc64le", true)
762 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000763 .Default(false);
764
765 if (CPUKnown)
766 CPU = Name;
767
768 return CPUKnown;
769 }
770
Ulrich Weigand8afad612014-07-28 13:17:52 +0000771
772 StringRef getABI() const override { return ABI; }
773
Craig Topper3164f332014-03-11 03:39:26 +0000774 void getTargetBuiltins(const Builtin::Info *&Records,
775 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000776 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000777 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000778 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000779
Craig Topper3164f332014-03-11 03:39:26 +0000780 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000781
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getTargetDefines(const LangOptions &Opts,
783 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000784
Craig Topper3164f332014-03-11 03:39:26 +0000785 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000786
Craig Topper3164f332014-03-11 03:39:26 +0000787 bool handleTargetFeatures(std::vector<std::string> &Features,
788 DiagnosticsEngine &Diags) override;
789 bool hasFeature(StringRef Feature) const override;
790
791 void getGCCRegNames(const char * const *&Names,
792 unsigned &NumNames) const override;
793 void getGCCRegAliases(const GCCRegAlias *&Aliases,
794 unsigned &NumAliases) const override;
795 bool validateAsmConstraint(const char *&Name,
796 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000797 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000798 default: return false;
799 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000800 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000801 case 'b': // Base register
802 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000803 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000804 break;
805 // FIXME: The following are added to allow parsing.
806 // I just took a guess at what the actions should be.
807 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'v': // Altivec vector register
810 Info.setAllowsRegister();
811 break;
812 case 'w':
813 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000814 case 'd':// VSX vector register to hold vector double data
815 case 'f':// VSX vector register to hold vector float data
816 case 's':// VSX vector register to hold scalar float data
817 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000818 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000819 break;
820 default:
821 return false;
822 }
823 Info.setAllowsRegister();
824 Name++; // Skip over 'w'.
825 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000826 case 'h': // `MQ', `CTR', or `LINK' register
827 case 'q': // `MQ' register
828 case 'c': // `CTR' register
829 case 'l': // `LINK' register
830 case 'x': // `CR' register (condition register) number 0
831 case 'y': // `CR' register (condition register)
832 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000833 Info.setAllowsRegister();
834 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000835 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000836 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000837 // (use `L' instead for SImode constants)
838 case 'K': // Unsigned 16-bit constant
839 case 'L': // Signed 16-bit constant shifted left 16 bits
840 case 'M': // Constant larger than 31
841 case 'N': // Exact power of 2
842 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000843 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000844 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000845 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000846 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000847 break;
848 case 'm': // Memory operand. Note that on PowerPC targets, m can
849 // include addresses that update the base register. It
850 // is therefore only safe to use `m' in an asm statement
851 // if that asm statement accesses the operand exactly once.
852 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000853 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000855 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000856 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000857 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
858 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // register to be updated.
860 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000861 if (Name[1] != 's')
862 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000863 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000864 // include any automodification of the base register. Unlike
865 // `m', this constraint can be used in asm statements that
866 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000867 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000868 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000869 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000870 break;
871 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000873 case 'Z': // Memory operand that is an indexed or indirect from a
874 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000875 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000876 Info.setAllowsMemory();
877 Info.setAllowsRegister();
878 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000879 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000880 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000881 // register (`p' is preferable for asm statements)
882 case 'S': // Constant suitable as a 64-bit mask operand
883 case 'T': // Constant suitable as a 32-bit mask operand
884 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000885 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000886 // instructions
887 case 'W': // Vector constant that does not require memory
888 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000889 break;
890 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000891 }
John Thompson07a61a42010-06-24 22:44:13 +0000892 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000893 }
Craig Topper3164f332014-03-11 03:39:26 +0000894 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000895 std::string R;
896 switch (*Constraint) {
897 case 'e':
898 case 'w':
899 // Two-character constraint; add "^" hint for later parsing.
900 R = std::string("^") + std::string(Constraint, 2);
901 Constraint++;
902 break;
903 default:
904 return TargetInfo::convertConstraint(Constraint);
905 }
906 return R;
907 }
Craig Topper3164f332014-03-11 03:39:26 +0000908 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000909 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000910 }
Craig Topper3164f332014-03-11 03:39:26 +0000911 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000912 if (RegNo == 0) return 3;
913 if (RegNo == 1) return 4;
914 return -1;
915 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000916};
Anders Carlssonf511f642007-11-27 04:11:28 +0000917
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000918const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000919#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000920#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000921 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000922#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000923};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000924
Eric Christopher917e9522014-11-18 22:36:15 +0000925/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000926/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000927bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000928 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000929 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
930 // Ignore disabled features.
931 if (Features[i][0] == '-')
932 continue;
933
934 StringRef Feature = StringRef(Features[i]).substr(1);
935
936 if (Feature == "vsx") {
937 HasVSX = true;
938 continue;
939 }
940
Bill Schmidt59eb7672014-10-10 15:09:43 +0000941 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000942 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000943 continue;
944 }
945
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000946 // TODO: Finish this list and add an assert that we've handled them
947 // all.
948 }
949
950 return true;
951}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952
Chris Lattnerecd49032009-03-02 22:27:17 +0000953/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
954/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000955void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000956 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000957 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000958 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000959 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000960 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000961 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000962 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000963 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000964 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000965 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000966 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000967 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000968 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000969
Chris Lattnerecd49032009-03-02 22:27:17 +0000970 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000971 if (getTriple().getArch() == llvm::Triple::ppc64le) {
972 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000973 } else {
974 if (getTriple().getOS() != llvm::Triple::NetBSD &&
975 getTriple().getOS() != llvm::Triple::OpenBSD)
976 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Ulrich Weigand8afad612014-07-28 13:17:52 +0000979 // ABI options.
980 if (ABI == "elfv1")
981 Builder.defineMacro("_CALL_ELF", "1");
982 if (ABI == "elfv2")
983 Builder.defineMacro("_CALL_ELF", "2");
984
Chris Lattnerecd49032009-03-02 22:27:17 +0000985 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000986 Builder.defineMacro("__NATURAL_ALIGNMENT__");
987 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000988
Chris Lattnerecd49032009-03-02 22:27:17 +0000989 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000990 if (LongDoubleWidth == 128)
991 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000992
John Thompsone467e192009-11-19 17:18:50 +0000993 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000994 Builder.defineMacro("__VEC__", "10206");
995 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000996 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000997
998 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000999 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1000 .Case("440", ArchDefineName)
1001 .Case("450", ArchDefineName | ArchDefine440)
1002 .Case("601", ArchDefineName)
1003 .Case("602", ArchDefineName | ArchDefinePpcgr)
1004 .Case("603", ArchDefineName | ArchDefinePpcgr)
1005 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1006 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1007 .Case("604", ArchDefineName | ArchDefinePpcgr)
1008 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1009 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001010 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001011 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1012 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1013 .Case("750", ArchDefineName | ArchDefinePpcgr)
1014 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1015 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001016 .Case("a2", ArchDefineA2)
1017 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001018 .Case("pwr3", ArchDefinePpcgr)
1019 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1020 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1021 | ArchDefinePpcsq)
1022 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1023 | ArchDefinePpcgr | ArchDefinePpcsq)
1024 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1025 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1027 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1028 | ArchDefinePpcsq)
1029 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1030 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001031 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1033 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1034 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001035 .Case("power3", ArchDefinePpcgr)
1036 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1037 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1038 | ArchDefinePpcsq)
1039 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1040 | ArchDefinePpcgr | ArchDefinePpcsq)
1041 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1042 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1044 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1045 | ArchDefinePpcsq)
1046 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1047 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001048 | ArchDefinePpcgr | ArchDefinePpcsq)
1049 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1050 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1051 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001052 .Default(ArchDefineNone);
1053
1054 if (defs & ArchDefineName)
1055 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1056 if (defs & ArchDefinePpcgr)
1057 Builder.defineMacro("_ARCH_PPCGR");
1058 if (defs & ArchDefinePpcsq)
1059 Builder.defineMacro("_ARCH_PPCSQ");
1060 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001061 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001062 if (defs & ArchDefine603)
1063 Builder.defineMacro("_ARCH_603");
1064 if (defs & ArchDefine604)
1065 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001066 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001067 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001069 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001070 if (defs & ArchDefinePwr5x)
1071 Builder.defineMacro("_ARCH_PWR5X");
1072 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001073 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001074 if (defs & ArchDefinePwr6x)
1075 Builder.defineMacro("_ARCH_PWR6X");
1076 if (defs & ArchDefinePwr7)
1077 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001078 if (defs & ArchDefinePwr8)
1079 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001080 if (defs & ArchDefineA2)
1081 Builder.defineMacro("_ARCH_A2");
1082 if (defs & ArchDefineA2q) {
1083 Builder.defineMacro("_ARCH_A2Q");
1084 Builder.defineMacro("_ARCH_QP");
1085 }
1086
1087 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1088 Builder.defineMacro("__bg__");
1089 Builder.defineMacro("__THW_BLUEGENE__");
1090 Builder.defineMacro("__bgq__");
1091 Builder.defineMacro("__TOS_BGQ__");
1092 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001093
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001094 if (HasVSX)
1095 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001096 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001097 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001098
Bill Schmidt38378a02013-02-01 20:23:10 +00001099 // FIXME: The following are not yet generated here by Clang, but are
1100 // generated by GCC:
1101 //
1102 // _SOFT_FLOAT_
1103 // __RECIP_PRECISION__
1104 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001105 // __RECIP__
1106 // __RECIPF__
1107 // __RSQRTE__
1108 // __RSQRTEF__
1109 // _SOFT_DOUBLE_
1110 // __NO_LWSYNC__
1111 // __HAVE_BSWAP__
1112 // __LONGDOUBLE128
1113 // __CMODEL_MEDIUM__
1114 // __CMODEL_LARGE__
1115 // _CALL_SYSV
1116 // _CALL_DARWIN
1117 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001118}
1119
1120void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1121 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1122 .Case("7400", true)
1123 .Case("g4", true)
1124 .Case("7450", true)
1125 .Case("g4+", true)
1126 .Case("970", true)
1127 .Case("g5", true)
1128 .Case("pwr6", true)
1129 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001130 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001131 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001132 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001133 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001134
1135 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001136
1137 if (!ABI.empty())
1138 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001139}
1140
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001141bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001142 return llvm::StringSwitch<bool>(Feature)
1143 .Case("powerpc", true)
1144 .Case("vsx", HasVSX)
1145 .Case("power8-vector", HasP8Vector)
1146 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001147}
Chris Lattner17df24e2008-04-21 18:56:49 +00001148
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001149const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001150 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1151 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1152 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1153 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1154 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1155 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1156 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1157 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001159 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001161 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1162 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1163 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1164 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001165 "vrsave", "vscr",
1166 "spe_acc", "spefscr",
1167 "sfp"
1168};
Chris Lattner10a5b382007-01-29 05:24:35 +00001169
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001170void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171 unsigned &NumNames) const {
1172 Names = GCCRegNames;
1173 NumNames = llvm::array_lengthof(GCCRegNames);
1174}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001175
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001176const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1177 // While some of these aliases do map to different registers
1178 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001179 { { "0" }, "r0" },
1180 { { "1"}, "r1" },
1181 { { "2" }, "r2" },
1182 { { "3" }, "r3" },
1183 { { "4" }, "r4" },
1184 { { "5" }, "r5" },
1185 { { "6" }, "r6" },
1186 { { "7" }, "r7" },
1187 { { "8" }, "r8" },
1188 { { "9" }, "r9" },
1189 { { "10" }, "r10" },
1190 { { "11" }, "r11" },
1191 { { "12" }, "r12" },
1192 { { "13" }, "r13" },
1193 { { "14" }, "r14" },
1194 { { "15" }, "r15" },
1195 { { "16" }, "r16" },
1196 { { "17" }, "r17" },
1197 { { "18" }, "r18" },
1198 { { "19" }, "r19" },
1199 { { "20" }, "r20" },
1200 { { "21" }, "r21" },
1201 { { "22" }, "r22" },
1202 { { "23" }, "r23" },
1203 { { "24" }, "r24" },
1204 { { "25" }, "r25" },
1205 { { "26" }, "r26" },
1206 { { "27" }, "r27" },
1207 { { "28" }, "r28" },
1208 { { "29" }, "r29" },
1209 { { "30" }, "r30" },
1210 { { "31" }, "r31" },
1211 { { "fr0" }, "f0" },
1212 { { "fr1" }, "f1" },
1213 { { "fr2" }, "f2" },
1214 { { "fr3" }, "f3" },
1215 { { "fr4" }, "f4" },
1216 { { "fr5" }, "f5" },
1217 { { "fr6" }, "f6" },
1218 { { "fr7" }, "f7" },
1219 { { "fr8" }, "f8" },
1220 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001221 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001222 { { "fr11" }, "f11" },
1223 { { "fr12" }, "f12" },
1224 { { "fr13" }, "f13" },
1225 { { "fr14" }, "f14" },
1226 { { "fr15" }, "f15" },
1227 { { "fr16" }, "f16" },
1228 { { "fr17" }, "f17" },
1229 { { "fr18" }, "f18" },
1230 { { "fr19" }, "f19" },
1231 { { "fr20" }, "f20" },
1232 { { "fr21" }, "f21" },
1233 { { "fr22" }, "f22" },
1234 { { "fr23" }, "f23" },
1235 { { "fr24" }, "f24" },
1236 { { "fr25" }, "f25" },
1237 { { "fr26" }, "f26" },
1238 { { "fr27" }, "f27" },
1239 { { "fr28" }, "f28" },
1240 { { "fr29" }, "f29" },
1241 { { "fr30" }, "f30" },
1242 { { "fr31" }, "f31" },
1243 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001244};
1245
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001246void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001247 unsigned &NumAliases) const {
1248 Aliases = GCCRegAliases;
1249 NumAliases = llvm::array_lengthof(GCCRegAliases);
1250}
1251} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001252
Chris Lattner5ba61f02006-10-14 07:39:34 +00001253namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001254class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001256 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001257 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001258
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001259 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001260 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001261 case llvm::Triple::FreeBSD:
1262 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001263 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001264 PtrDiffType = SignedInt;
1265 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001266 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001267 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001268 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001269 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001270
Roman Divacky3ffe7462012-03-13 19:20:17 +00001271 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1272 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001273 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001274 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001275
1276 // PPC32 supports atomics up to 4 bytes.
1277 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001278 }
1279
Craig Topper3164f332014-03-11 03:39:26 +00001280 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001281 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001282 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001283 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001284};
1285} // end anonymous namespace.
1286
Bill Schmidt778d3872013-07-26 01:36:11 +00001287// Note: ABI differences may eventually require us to have a separate
1288// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001289namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001290class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001291public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001292 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001293 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001294 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001295 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001296
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001297 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1298 DescriptionString = "e-m:e-i64:64-n32:64";
1299 ABI = "elfv2";
1300 } else {
1301 DescriptionString = "E-m:e-i64:64-n32:64";
1302 ABI = "elfv1";
1303 }
1304
1305 switch (getTriple().getOS()) {
1306 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001307 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001308 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001309 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001310 case llvm::Triple::NetBSD:
1311 IntMaxType = SignedLongLong;
1312 Int64Type = SignedLongLong;
1313 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001314 default:
1315 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001316 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001317
1318 // PPC64 supports atomics up to 8 bytes.
1319 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001320 }
Craig Topper3164f332014-03-11 03:39:26 +00001321 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001322 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001323 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001324 // PPC64 Linux-specifc ABI options.
1325 bool setABI(const std::string &Name) override {
1326 if (Name == "elfv1" || Name == "elfv2") {
1327 ABI = Name;
1328 return true;
1329 }
1330 return false;
1331 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001332};
1333} // end anonymous namespace.
1334
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001335
1336namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001337class DarwinPPC32TargetInfo :
1338 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001339public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001340 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1341 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001342 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001343 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001344 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001345 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001346 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001347 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001348 }
Craig Topper3164f332014-03-11 03:39:26 +00001349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001350 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001351 }
1352};
1353
1354class DarwinPPC64TargetInfo :
1355 public DarwinTargetInfo<PPC64TargetInfo> {
1356public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001357 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1358 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001359 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001360 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001361 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001362 }
1363};
1364} // end anonymous namespace.
1365
Chris Lattner5ba61f02006-10-14 07:39:34 +00001366namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001367 static const unsigned NVPTXAddrSpaceMap[] = {
1368 1, // opencl_global
1369 3, // opencl_local
1370 4, // opencl_constant
1371 1, // cuda_device
1372 4, // cuda_constant
1373 3, // cuda_shared
1374 };
1375 class NVPTXTargetInfo : public TargetInfo {
1376 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001377 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001378 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001379 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001380 BigEndian = false;
1381 TLSSupported = false;
1382 LongWidth = LongAlign = 64;
1383 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001384 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001385 // Define available target features
1386 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001387 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001388 }
Craig Topper3164f332014-03-11 03:39:26 +00001389 void getTargetDefines(const LangOptions &Opts,
1390 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001391 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001392 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001393 }
Craig Topper3164f332014-03-11 03:39:26 +00001394 void getTargetBuiltins(const Builtin::Info *&Records,
1395 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001396 Records = BuiltinInfo;
1397 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001398 }
Craig Topper3164f332014-03-11 03:39:26 +00001399 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001400 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001401 }
Craig Topper3164f332014-03-11 03:39:26 +00001402
1403 void getGCCRegNames(const char * const *&Names,
1404 unsigned &NumNames) const override;
1405 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1406 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001407 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001408 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001409 NumAliases = 0;
1410 }
Eric Christopher917e9522014-11-18 22:36:15 +00001411 bool
1412 validateAsmConstraint(const char *&Name,
1413 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001414 switch (*Name) {
1415 default: return false;
1416 case 'c':
1417 case 'h':
1418 case 'r':
1419 case 'l':
1420 case 'f':
1421 case 'd':
1422 Info.setAllowsRegister();
1423 return true;
1424 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001425 }
Craig Topper3164f332014-03-11 03:39:26 +00001426 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001427 // FIXME: Is this really right?
1428 return "";
1429 }
Craig Topper3164f332014-03-11 03:39:26 +00001430 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001431 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001432 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001433 }
Craig Topper3164f332014-03-11 03:39:26 +00001434 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001435 bool Valid = llvm::StringSwitch<bool>(Name)
1436 .Case("sm_20", true)
1437 .Case("sm_21", true)
1438 .Case("sm_30", true)
1439 .Case("sm_35", true)
1440 .Default(false);
1441
1442 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001443 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001444 };
1445
1446 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1447#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1448#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1449 ALL_LANGUAGES },
1450#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001451 };
1452
1453 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1454 "r0"
1455 };
1456
1457 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1458 unsigned &NumNames) const {
1459 Names = GCCRegNames;
1460 NumNames = llvm::array_lengthof(GCCRegNames);
1461 }
1462
1463 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1464 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001465 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001466 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001467 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1468 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001469 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001470 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001471 };
1472
1473 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1474 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001475 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001476 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001477 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1478 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001479 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001480 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001481 };
1482}
1483
1484namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001485
1486static const unsigned R600AddrSpaceMap[] = {
1487 1, // opencl_global
1488 3, // opencl_local
1489 2, // opencl_constant
1490 1, // cuda_device
1491 2, // cuda_constant
1492 3 // cuda_shared
1493};
1494
Tom Stellarda96344b2014-08-21 13:58:40 +00001495// If you edit the description strings, make sure you update
1496// getPointerWidthV().
1497
Tom Stellardc74b1e02013-03-04 17:40:53 +00001498static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001499 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1500 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001501
1502static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001503 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1504 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001505
1506static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001507 "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 +00001508 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1509 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001510
Eli Friedmand13b41e2012-10-12 23:32:00 +00001511class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001512 static const Builtin::Info BuiltinInfo[];
1513
Tom Stellardc74b1e02013-03-04 17:40:53 +00001514 /// \brief The GPU profiles supported by the R600 target.
1515 enum GPUKind {
1516 GK_NONE,
1517 GK_R600,
1518 GK_R600_DOUBLE_OPS,
1519 GK_R700,
1520 GK_R700_DOUBLE_OPS,
1521 GK_EVERGREEN,
1522 GK_EVERGREEN_DOUBLE_OPS,
1523 GK_NORTHERN_ISLANDS,
1524 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001525 GK_SOUTHERN_ISLANDS,
1526 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001527 } GPU;
1528
Eli Friedmand13b41e2012-10-12 23:32:00 +00001529public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001530 R600TargetInfo(const llvm::Triple &Triple)
1531 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001532 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001533 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001534 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001535 }
1536
Tom Stellarda96344b2014-08-21 13:58:40 +00001537 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1538 if (GPU <= GK_CAYMAN)
1539 return 32;
1540
1541 switch(AddrSpace) {
1542 default:
1543 return 64;
1544 case 0:
1545 case 3:
1546 case 5:
1547 return 32;
1548 }
1549 }
1550
Craig Topper3164f332014-03-11 03:39:26 +00001551 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001552 return "";
1553 }
1554
Craig Topper3164f332014-03-11 03:39:26 +00001555 void getGCCRegNames(const char * const *&Names,
1556 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001557 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001558 numNames = 0;
1559 }
1560
Craig Topper3164f332014-03-11 03:39:26 +00001561 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1562 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001563 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001564 NumAliases = 0;
1565 }
1566
Craig Topper3164f332014-03-11 03:39:26 +00001567 bool validateAsmConstraint(const char *&Name,
1568 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001569 return true;
1570 }
1571
Craig Topper3164f332014-03-11 03:39:26 +00001572 void getTargetBuiltins(const Builtin::Info *&Records,
1573 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001574 Records = BuiltinInfo;
1575 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001576 }
1577
Craig Topper3164f332014-03-11 03:39:26 +00001578 void getTargetDefines(const LangOptions &Opts,
1579 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001580 Builder.defineMacro("__R600__");
1581 }
1582
Craig Topper3164f332014-03-11 03:39:26 +00001583 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001584 return TargetInfo::CharPtrBuiltinVaList;
1585 }
1586
Craig Topper3164f332014-03-11 03:39:26 +00001587 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001588 GPU = llvm::StringSwitch<GPUKind>(Name)
1589 .Case("r600" , GK_R600)
1590 .Case("rv610", GK_R600)
1591 .Case("rv620", GK_R600)
1592 .Case("rv630", GK_R600)
1593 .Case("rv635", GK_R600)
1594 .Case("rs780", GK_R600)
1595 .Case("rs880", GK_R600)
1596 .Case("rv670", GK_R600_DOUBLE_OPS)
1597 .Case("rv710", GK_R700)
1598 .Case("rv730", GK_R700)
1599 .Case("rv740", GK_R700_DOUBLE_OPS)
1600 .Case("rv770", GK_R700_DOUBLE_OPS)
1601 .Case("palm", GK_EVERGREEN)
1602 .Case("cedar", GK_EVERGREEN)
1603 .Case("sumo", GK_EVERGREEN)
1604 .Case("sumo2", GK_EVERGREEN)
1605 .Case("redwood", GK_EVERGREEN)
1606 .Case("juniper", GK_EVERGREEN)
1607 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1608 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1609 .Case("barts", GK_NORTHERN_ISLANDS)
1610 .Case("turks", GK_NORTHERN_ISLANDS)
1611 .Case("caicos", GK_NORTHERN_ISLANDS)
1612 .Case("cayman", GK_CAYMAN)
1613 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001614 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001615 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1616 .Case("verde", GK_SOUTHERN_ISLANDS)
1617 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001618 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001619 .Case("bonaire", GK_SEA_ISLANDS)
1620 .Case("kabini", GK_SEA_ISLANDS)
1621 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001622 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001623 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001624 .Default(GK_NONE);
1625
1626 if (GPU == GK_NONE) {
1627 return false;
1628 }
1629
1630 // Set the correct data layout
1631 switch (GPU) {
1632 case GK_NONE:
1633 case GK_R600:
1634 case GK_R700:
1635 case GK_EVERGREEN:
1636 case GK_NORTHERN_ISLANDS:
1637 DescriptionString = DescriptionStringR600;
1638 break;
1639 case GK_R600_DOUBLE_OPS:
1640 case GK_R700_DOUBLE_OPS:
1641 case GK_EVERGREEN_DOUBLE_OPS:
1642 case GK_CAYMAN:
1643 DescriptionString = DescriptionStringR600DoubleOps;
1644 break;
1645 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001646 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001647 DescriptionString = DescriptionStringSI;
1648 break;
1649 }
1650
1651 return true;
1652 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001653};
1654
Matt Arsenault56f008d2014-06-24 20:45:01 +00001655const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1656#define BUILTIN(ID, TYPE, ATTRS) \
1657 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1658#include "clang/Basic/BuiltinsR600.def"
1659};
1660
Eli Friedmand13b41e2012-10-12 23:32:00 +00001661} // end anonymous namespace
1662
1663namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001664// Namespace for x86 abstract base class
1665const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001666#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001667#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001668 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001669#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001670};
Eli Friedmanb5366062008-05-20 14:21:01 +00001671
Nuno Lopescfca1f02009-12-23 17:49:57 +00001672static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001673 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1674 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001675 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001676 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1677 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1678 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001679 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001680 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1681 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001682};
1683
Eric Christophercdd36352011-06-21 00:05:20 +00001684const TargetInfo::AddlRegName AddlRegNames[] = {
1685 { { "al", "ah", "eax", "rax" }, 0 },
1686 { { "bl", "bh", "ebx", "rbx" }, 3 },
1687 { { "cl", "ch", "ecx", "rcx" }, 2 },
1688 { { "dl", "dh", "edx", "rdx" }, 1 },
1689 { { "esi", "rsi" }, 4 },
1690 { { "edi", "rdi" }, 5 },
1691 { { "esp", "rsp" }, 7 },
1692 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001693};
1694
1695// X86 target abstract base class; x86-32 and x86-64 are very close, so
1696// most of the implementation can be shared.
1697class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001698 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001699 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001700 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001701 enum MMX3DNowEnum {
1702 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1703 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001704 enum XOPEnum {
1705 NoXOP,
1706 SSE4A,
1707 FMA4,
1708 XOP
1709 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001710
Eric Christophere1ddaf92010-04-02 23:50:19 +00001711 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001712 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001713 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001714 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001715 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001716 bool HasBMI;
1717 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001718 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001719 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001720 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001721 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001722 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001723 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001724 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001725 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001726 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1727 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001728 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001729 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001730
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001731 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1732 ///
1733 /// Each enumeration represents a particular CPU supported by Clang. These
1734 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1735 enum CPUKind {
1736 CK_Generic,
1737
1738 /// \name i386
1739 /// i386-generation processors.
1740 //@{
1741 CK_i386,
1742 //@}
1743
1744 /// \name i486
1745 /// i486-generation processors.
1746 //@{
1747 CK_i486,
1748 CK_WinChipC6,
1749 CK_WinChip2,
1750 CK_C3,
1751 //@}
1752
1753 /// \name i586
1754 /// i586-generation processors, P5 microarchitecture based.
1755 //@{
1756 CK_i586,
1757 CK_Pentium,
1758 CK_PentiumMMX,
1759 //@}
1760
1761 /// \name i686
1762 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1763 //@{
1764 CK_i686,
1765 CK_PentiumPro,
1766 CK_Pentium2,
1767 CK_Pentium3,
1768 CK_Pentium3M,
1769 CK_PentiumM,
1770 CK_C3_2,
1771
1772 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1773 /// Clang however has some logic to suport this.
1774 // FIXME: Warn, deprecate, and potentially remove this.
1775 CK_Yonah,
1776 //@}
1777
1778 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001779 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001780 //@{
1781 CK_Pentium4,
1782 CK_Pentium4M,
1783 CK_Prescott,
1784 CK_Nocona,
1785 //@}
1786
1787 /// \name Core
1788 /// Core microarchitecture based processors.
1789 //@{
1790 CK_Core2,
1791
1792 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1793 /// codename which GCC no longer accepts as an option to -march, but Clang
1794 /// has some logic for recognizing it.
1795 // FIXME: Warn, deprecate, and potentially remove this.
1796 CK_Penryn,
1797 //@}
1798
1799 /// \name Atom
1800 /// Atom processors
1801 //@{
1802 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001803 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001804 //@}
1805
1806 /// \name Nehalem
1807 /// Nehalem microarchitecture based processors.
1808 //@{
1809 CK_Corei7,
1810 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001811 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001812 CK_CoreAVX2,
Robert Khasanov50e6f582014-09-19 09:53:48 +00001813 CK_Broadwell,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001814 //@}
1815
Craig Topper449314e2013-08-20 07:09:39 +00001816 /// \name Knights Landing
1817 /// Knights Landing processor.
1818 CK_KNL,
1819
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001820 /// \name Skylake Server
1821 /// Skylake server processor.
1822 CK_SKX,
1823
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001824 /// \name K6
1825 /// K6 architecture processors.
1826 //@{
1827 CK_K6,
1828 CK_K6_2,
1829 CK_K6_3,
1830 //@}
1831
1832 /// \name K7
1833 /// K7 architecture processors.
1834 //@{
1835 CK_Athlon,
1836 CK_AthlonThunderbird,
1837 CK_Athlon4,
1838 CK_AthlonXP,
1839 CK_AthlonMP,
1840 //@}
1841
1842 /// \name K8
1843 /// K8 architecture processors.
1844 //@{
1845 CK_Athlon64,
1846 CK_Athlon64SSE3,
1847 CK_AthlonFX,
1848 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001849 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001850 CK_Opteron,
1851 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001852 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001853 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001854
Benjamin Kramer569f2152012-01-10 11:50:18 +00001855 /// \name Bobcat
1856 /// Bobcat architecture processors.
1857 //@{
1858 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001859 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001860 //@}
1861
1862 /// \name Bulldozer
1863 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001864 //@{
1865 CK_BDVER1,
1866 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001867 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001868 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001869 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001870
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001871 /// This specification is deprecated and will be removed in the future.
1872 /// Users should prefer \see CK_K8.
1873 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001874 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001875 CK_x86_64,
1876 //@}
1877
1878 /// \name Geode
1879 /// Geode processors.
1880 //@{
1881 CK_Geode
1882 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001883 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001884
Rafael Espindolaeb265472013-08-21 21:59:03 +00001885 enum FPMathKind {
1886 FP_Default,
1887 FP_SSE,
1888 FP_387
1889 } FPMath;
1890
Eli Friedman3fd920a2008-08-20 02:34:37 +00001891public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001892 X86TargetInfo(const llvm::Triple &Triple)
1893 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001894 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001895 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1896 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1897 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1898 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1899 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1900 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001901 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001902 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001903 }
Craig Topper3164f332014-03-11 03:39:26 +00001904 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001905 // X87 evaluates with 80 bits "long double" precision.
1906 return SSELevel == NoSSE ? 2 : 0;
1907 }
Craig Topper3164f332014-03-11 03:39:26 +00001908 void getTargetBuiltins(const Builtin::Info *&Records,
1909 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001910 Records = BuiltinInfo;
1911 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001912 }
Craig Topper3164f332014-03-11 03:39:26 +00001913 void getGCCRegNames(const char * const *&Names,
1914 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001915 Names = GCCRegNames;
1916 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001917 }
Craig Topper3164f332014-03-11 03:39:26 +00001918 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1919 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001920 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001921 NumAliases = 0;
1922 }
Craig Topper3164f332014-03-11 03:39:26 +00001923 void getGCCAddlRegNames(const AddlRegName *&Names,
1924 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001925 Names = AddlRegNames;
1926 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001927 }
Craig Topper3164f332014-03-11 03:39:26 +00001928 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00001929 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001930
Akira Hatanaka974131e2014-09-18 18:17:18 +00001931 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1932
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001933 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1934
Akira Hatanaka974131e2014-09-18 18:17:18 +00001935 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1936
Craig Topper3164f332014-03-11 03:39:26 +00001937 std::string convertConstraint(const char *&Constraint) const override;
1938 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001939 return "~{dirflag},~{fpsr},~{flags}";
1940 }
Craig Topper3164f332014-03-11 03:39:26 +00001941 void getTargetDefines(const LangOptions &Opts,
1942 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001943 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1944 bool Enabled);
1945 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1946 bool Enabled);
1947 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1948 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001949 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1950 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001951 setFeatureEnabledImpl(Features, Name, Enabled);
1952 }
1953 // This exists purely to cut down on the number of virtual calls in
1954 // getDefaultFeatures which calls this repeatedly.
1955 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1956 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001957 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1958 bool hasFeature(StringRef Feature) const override;
1959 bool handleTargetFeatures(std::vector<std::string> &Features,
1960 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001961 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001962 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001963 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001964 else if (getTriple().getArch() == llvm::Triple::x86 &&
1965 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001966 return "no-mmx";
1967 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001968 }
Craig Topper3164f332014-03-11 03:39:26 +00001969 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001970 CPU = llvm::StringSwitch<CPUKind>(Name)
1971 .Case("i386", CK_i386)
1972 .Case("i486", CK_i486)
1973 .Case("winchip-c6", CK_WinChipC6)
1974 .Case("winchip2", CK_WinChip2)
1975 .Case("c3", CK_C3)
1976 .Case("i586", CK_i586)
1977 .Case("pentium", CK_Pentium)
1978 .Case("pentium-mmx", CK_PentiumMMX)
1979 .Case("i686", CK_i686)
1980 .Case("pentiumpro", CK_PentiumPro)
1981 .Case("pentium2", CK_Pentium2)
1982 .Case("pentium3", CK_Pentium3)
1983 .Case("pentium3m", CK_Pentium3M)
1984 .Case("pentium-m", CK_PentiumM)
1985 .Case("c3-2", CK_C3_2)
1986 .Case("yonah", CK_Yonah)
1987 .Case("pentium4", CK_Pentium4)
1988 .Case("pentium4m", CK_Pentium4M)
1989 .Case("prescott", CK_Prescott)
1990 .Case("nocona", CK_Nocona)
1991 .Case("core2", CK_Core2)
1992 .Case("penryn", CK_Penryn)
1993 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001994 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001995 .Case("corei7", CK_Corei7)
1996 .Case("corei7-avx", CK_Corei7AVX)
1997 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001998 .Case("core-avx2", CK_CoreAVX2)
Robert Khasanov50e6f582014-09-19 09:53:48 +00001999 .Case("broadwell", CK_Broadwell)
Craig Topper449314e2013-08-20 07:09:39 +00002000 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002001 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00002002 .Case("k6", CK_K6)
2003 .Case("k6-2", CK_K6_2)
2004 .Case("k6-3", CK_K6_3)
2005 .Case("athlon", CK_Athlon)
2006 .Case("athlon-tbird", CK_AthlonThunderbird)
2007 .Case("athlon-4", CK_Athlon4)
2008 .Case("athlon-xp", CK_AthlonXP)
2009 .Case("athlon-mp", CK_AthlonMP)
2010 .Case("athlon64", CK_Athlon64)
2011 .Case("athlon64-sse3", CK_Athlon64SSE3)
2012 .Case("athlon-fx", CK_AthlonFX)
2013 .Case("k8", CK_K8)
2014 .Case("k8-sse3", CK_K8SSE3)
2015 .Case("opteron", CK_Opteron)
2016 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002017 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002018 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002019 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002020 .Case("bdver1", CK_BDVER1)
2021 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002022 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002023 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002024 .Case("x86-64", CK_x86_64)
2025 .Case("geode", CK_Geode)
2026 .Default(CK_Generic);
2027
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002028 // Perform any per-CPU checks necessary to determine if this CPU is
2029 // acceptable.
2030 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2031 // invalid without explaining *why*.
2032 switch (CPU) {
2033 case CK_Generic:
2034 // No processor selected!
2035 return false;
2036
2037 case CK_i386:
2038 case CK_i486:
2039 case CK_WinChipC6:
2040 case CK_WinChip2:
2041 case CK_C3:
2042 case CK_i586:
2043 case CK_Pentium:
2044 case CK_PentiumMMX:
2045 case CK_i686:
2046 case CK_PentiumPro:
2047 case CK_Pentium2:
2048 case CK_Pentium3:
2049 case CK_Pentium3M:
2050 case CK_PentiumM:
2051 case CK_Yonah:
2052 case CK_C3_2:
2053 case CK_Pentium4:
2054 case CK_Pentium4M:
2055 case CK_Prescott:
2056 case CK_K6:
2057 case CK_K6_2:
2058 case CK_K6_3:
2059 case CK_Athlon:
2060 case CK_AthlonThunderbird:
2061 case CK_Athlon4:
2062 case CK_AthlonXP:
2063 case CK_AthlonMP:
2064 case CK_Geode:
2065 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002066 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002067 return false;
2068
2069 // Fallthrough
2070 case CK_Nocona:
2071 case CK_Core2:
2072 case CK_Penryn:
2073 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002074 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002075 case CK_Corei7:
2076 case CK_Corei7AVX:
2077 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002078 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002079 case CK_Broadwell:
Craig Topper449314e2013-08-20 07:09:39 +00002080 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002081 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002082 case CK_Athlon64:
2083 case CK_Athlon64SSE3:
2084 case CK_AthlonFX:
2085 case CK_K8:
2086 case CK_K8SSE3:
2087 case CK_Opteron:
2088 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002089 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002090 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002091 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002092 case CK_BDVER1:
2093 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002094 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002095 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002096 case CK_x86_64:
2097 return true;
2098 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002099 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002100 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002101
Craig Topper3164f332014-03-11 03:39:26 +00002102 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002103
Craig Topper3164f332014-03-11 03:39:26 +00002104 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002105 // We accept all non-ARM calling conventions
2106 return (CC == CC_X86ThisCall ||
2107 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002108 CC == CC_X86StdCall ||
2109 CC == CC_X86VectorCall ||
2110 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002111 CC == CC_X86Pascal ||
2112 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002113 }
2114
Craig Topper3164f332014-03-11 03:39:26 +00002115 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002116 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002117 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002118};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002119
Rafael Espindolaeb265472013-08-21 21:59:03 +00002120bool X86TargetInfo::setFPMath(StringRef Name) {
2121 if (Name == "387") {
2122 FPMath = FP_387;
2123 return true;
2124 }
2125 if (Name == "sse") {
2126 FPMath = FP_SSE;
2127 return true;
2128 }
2129 return false;
2130}
2131
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002132void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002133 // FIXME: This *really* should not be here.
2134
2135 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002136 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002138
Chandler Carruth212334f2011-09-28 08:55:37 +00002139 switch (CPU) {
2140 case CK_Generic:
2141 case CK_i386:
2142 case CK_i486:
2143 case CK_i586:
2144 case CK_Pentium:
2145 case CK_i686:
2146 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002147 break;
2148 case CK_PentiumMMX:
2149 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002150 case CK_K6:
2151 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002152 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002153 break;
2154 case CK_Pentium3:
2155 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002156 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002157 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002158 break;
2159 case CK_PentiumM:
2160 case CK_Pentium4:
2161 case CK_Pentium4M:
2162 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002163 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002164 break;
2165 case CK_Yonah:
2166 case CK_Prescott:
2167 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002168 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002169 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002170 break;
2171 case CK_Core2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002172 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002174 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002175 break;
2176 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002178 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002179 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002180 case CK_SKX:
2181 setFeatureEnabledImpl(Features, "avx512f", true);
2182 setFeatureEnabledImpl(Features, "avx512cd", true);
2183 setFeatureEnabledImpl(Features, "avx512dq", true);
2184 setFeatureEnabledImpl(Features, "avx512bw", true);
2185 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002186 // FALLTHROUGH
2187 case CK_Broadwell:
2188 setFeatureEnabledImpl(Features, "rdseed", true);
2189 setFeatureEnabledImpl(Features, "adx", true);
2190 // FALLTHROUGH
2191 case CK_CoreAVX2:
2192 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002193 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002194 setFeatureEnabledImpl(Features, "bmi", true);
2195 setFeatureEnabledImpl(Features, "bmi2", true);
2196 setFeatureEnabledImpl(Features, "rtm", true);
2197 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002198 // FALLTHROUGH
2199 case CK_CoreAVXi:
2200 setFeatureEnabledImpl(Features, "rdrnd", true);
2201 setFeatureEnabledImpl(Features, "f16c", true);
2202 setFeatureEnabledImpl(Features, "fsgsbase", true);
2203 // FALLTHROUGH
2204 case CK_Corei7AVX:
2205 setFeatureEnabledImpl(Features, "avx", true);
2206 // FALLTHROUGH
2207 case CK_Silvermont:
2208 setFeatureEnabledImpl(Features, "aes", true);
2209 setFeatureEnabledImpl(Features, "pclmul", true);
2210 // FALLTHROUGH
2211 case CK_Corei7:
2212 setFeatureEnabledImpl(Features, "sse4.2", true);
2213 setFeatureEnabledImpl(Features, "cx16", true);
2214 break;
2215 case CK_KNL:
2216 setFeatureEnabledImpl(Features, "avx512f", true);
2217 setFeatureEnabledImpl(Features, "avx512cd", true);
2218 setFeatureEnabledImpl(Features, "avx512er", true);
2219 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002220 setFeatureEnabledImpl(Features, "rdseed", true);
2221 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002222 setFeatureEnabledImpl(Features, "lzcnt", true);
2223 setFeatureEnabledImpl(Features, "bmi", true);
2224 setFeatureEnabledImpl(Features, "bmi2", true);
2225 setFeatureEnabledImpl(Features, "rtm", true);
2226 setFeatureEnabledImpl(Features, "fma", true);
2227 setFeatureEnabledImpl(Features, "rdrnd", true);
2228 setFeatureEnabledImpl(Features, "f16c", true);
2229 setFeatureEnabledImpl(Features, "fsgsbase", true);
2230 setFeatureEnabledImpl(Features, "aes", true);
2231 setFeatureEnabledImpl(Features, "pclmul", true);
2232 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002233 break;
2234 case CK_K6_2:
2235 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002236 case CK_WinChip2:
2237 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002238 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002239 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002240 case CK_Athlon:
2241 case CK_AthlonThunderbird:
2242 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002243 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002244 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002245 case CK_Athlon4:
2246 case CK_AthlonXP:
2247 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002248 setFeatureEnabledImpl(Features, "sse", true);
2249 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002250 break;
2251 case CK_K8:
2252 case CK_Opteron:
2253 case CK_Athlon64:
2254 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002255 setFeatureEnabledImpl(Features, "sse2", true);
2256 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002257 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002258 case CK_AMDFAM10:
2259 setFeatureEnabledImpl(Features, "sse4a", true);
2260 setFeatureEnabledImpl(Features, "lzcnt", true);
2261 setFeatureEnabledImpl(Features, "popcnt", true);
2262 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002263 case CK_K8SSE3:
2264 case CK_OpteronSSE3:
2265 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002266 setFeatureEnabledImpl(Features, "sse3", true);
2267 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002268 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002269 case CK_BTVER2:
2270 setFeatureEnabledImpl(Features, "avx", true);
2271 setFeatureEnabledImpl(Features, "aes", true);
2272 setFeatureEnabledImpl(Features, "pclmul", true);
2273 setFeatureEnabledImpl(Features, "bmi", true);
2274 setFeatureEnabledImpl(Features, "f16c", true);
2275 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002276 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002277 setFeatureEnabledImpl(Features, "ssse3", true);
2278 setFeatureEnabledImpl(Features, "sse4a", true);
2279 setFeatureEnabledImpl(Features, "lzcnt", true);
2280 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002281 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002282 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002283 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002284 case CK_BDVER4:
2285 setFeatureEnabledImpl(Features, "avx2", true);
2286 setFeatureEnabledImpl(Features, "bmi2", true);
2287 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002288 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002289 setFeatureEnabledImpl(Features, "fsgsbase", true);
2290 // FALLTHROUGH
2291 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002292 setFeatureEnabledImpl(Features, "bmi", true);
2293 setFeatureEnabledImpl(Features, "fma", true);
2294 setFeatureEnabledImpl(Features, "f16c", true);
2295 setFeatureEnabledImpl(Features, "tbm", true);
2296 // FALLTHROUGH
2297 case CK_BDVER1:
2298 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002299 setFeatureEnabledImpl(Features, "xop", true);
2300 setFeatureEnabledImpl(Features, "lzcnt", true);
2301 setFeatureEnabledImpl(Features, "aes", true);
2302 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002303 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002304 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002305 break;
Eli Friedman33465822011-07-08 23:31:17 +00002306 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002307}
2308
Rafael Espindolae62e2792013-08-20 13:44:29 +00002309void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002310 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002311 if (Enabled) {
2312 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002313 case AVX512F:
2314 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002315 case AVX2:
2316 Features["avx2"] = true;
2317 case AVX:
2318 Features["avx"] = true;
2319 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002320 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002321 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002322 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002323 case SSSE3:
2324 Features["ssse3"] = true;
2325 case SSE3:
2326 Features["sse3"] = true;
2327 case SSE2:
2328 Features["sse2"] = true;
2329 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002330 Features["sse"] = true;
2331 case NoSSE:
2332 break;
2333 }
2334 return;
2335 }
2336
2337 switch (Level) {
2338 case NoSSE:
2339 case SSE1:
2340 Features["sse"] = false;
2341 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002342 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2343 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002344 case SSE3:
2345 Features["sse3"] = false;
2346 setXOPLevel(Features, NoXOP, false);
2347 case SSSE3:
2348 Features["ssse3"] = false;
2349 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002350 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002351 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002352 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002353 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002354 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002355 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002356 case AVX2:
2357 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002358 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002359 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2360 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2361 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002362 }
2363}
2364
2365void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002366 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002367 if (Enabled) {
2368 switch (Level) {
2369 case AMD3DNowAthlon:
2370 Features["3dnowa"] = true;
2371 case AMD3DNow:
2372 Features["3dnow"] = true;
2373 case MMX:
2374 Features["mmx"] = true;
2375 case NoMMX3DNow:
2376 break;
2377 }
2378 return;
2379 }
2380
2381 switch (Level) {
2382 case NoMMX3DNow:
2383 case MMX:
2384 Features["mmx"] = false;
2385 case AMD3DNow:
2386 Features["3dnow"] = false;
2387 case AMD3DNowAthlon:
2388 Features["3dnowa"] = false;
2389 }
2390}
2391
2392void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002393 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002394 if (Enabled) {
2395 switch (Level) {
2396 case XOP:
2397 Features["xop"] = true;
2398 case FMA4:
2399 Features["fma4"] = true;
2400 setSSELevel(Features, AVX, true);
2401 case SSE4A:
2402 Features["sse4a"] = true;
2403 setSSELevel(Features, SSE3, true);
2404 case NoXOP:
2405 break;
2406 }
2407 return;
2408 }
2409
2410 switch (Level) {
2411 case NoXOP:
2412 case SSE4A:
2413 Features["sse4a"] = false;
2414 case FMA4:
2415 Features["fma4"] = false;
2416 case XOP:
2417 Features["xop"] = false;
2418 }
2419}
2420
Craig Topper86d79ef2013-09-17 04:51:29 +00002421void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2422 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002423 // FIXME: This *really* should not be here. We need some way of translating
2424 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002425 if (Name == "sse4")
2426 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002427
Rafael Espindolae62e2792013-08-20 13:44:29 +00002428 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002429
Craig Topper29561122013-09-19 01:13:07 +00002430 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002431 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002432 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002433 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002434 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002435 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002436 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002438 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002439 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002440 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002441 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002442 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002443 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002444 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002445 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002446 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002447 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002448 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002449 if (Enabled)
2450 setSSELevel(Features, SSE2, Enabled);
2451 } else if (Name == "pclmul") {
2452 if (Enabled)
2453 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002454 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002455 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002456 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002457 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002458 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002459 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002460 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2461 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002462 if (Enabled)
2463 setSSELevel(Features, AVX512F, Enabled);
2464 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002465 if (Enabled)
2466 setSSELevel(Features, AVX, Enabled);
2467 } else if (Name == "fma4") {
2468 setXOPLevel(Features, FMA4, Enabled);
2469 } else if (Name == "xop") {
2470 setXOPLevel(Features, XOP, Enabled);
2471 } else if (Name == "sse4a") {
2472 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002473 } else if (Name == "f16c") {
2474 if (Enabled)
2475 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002476 } else if (Name == "sha") {
2477 if (Enabled)
2478 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002479 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002480}
2481
Eric Christopher3ff21b32013-10-16 21:26:26 +00002482/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002483/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002484bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002485 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002486 // Remember the maximum enabled sselevel.
2487 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2488 // Ignore disabled features.
2489 if (Features[i][0] == '-')
2490 continue;
2491
Benjamin Kramer27402c62012-03-05 15:10:44 +00002492 StringRef Feature = StringRef(Features[i]).substr(1);
2493
2494 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002495 HasAES = true;
2496 continue;
2497 }
2498
Craig Topper3f122a72012-05-31 05:18:48 +00002499 if (Feature == "pclmul") {
2500 HasPCLMUL = true;
2501 continue;
2502 }
2503
Benjamin Kramer27402c62012-03-05 15:10:44 +00002504 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002505 HasLZCNT = true;
2506 continue;
2507 }
2508
Rafael Espindola89049822013-08-23 20:21:37 +00002509 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002510 HasRDRND = true;
2511 continue;
2512 }
2513
Craig Topper8c7f2512014-11-03 06:51:41 +00002514 if (Feature == "fsgsbase") {
2515 HasFSGSBASE = true;
2516 continue;
2517 }
2518
Benjamin Kramer27402c62012-03-05 15:10:44 +00002519 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002520 HasBMI = true;
2521 continue;
2522 }
2523
Benjamin Kramer27402c62012-03-05 15:10:44 +00002524 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002525 HasBMI2 = true;
2526 continue;
2527 }
2528
Benjamin Kramer27402c62012-03-05 15:10:44 +00002529 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002530 HasPOPCNT = true;
2531 continue;
2532 }
2533
Michael Liao625a8752012-11-10 05:17:46 +00002534 if (Feature == "rtm") {
2535 HasRTM = true;
2536 continue;
2537 }
2538
Michael Liao74f4eaf2013-03-26 17:52:08 +00002539 if (Feature == "prfchw") {
2540 HasPRFCHW = true;
2541 continue;
2542 }
2543
Michael Liaoffaae352013-03-29 05:17:55 +00002544 if (Feature == "rdseed") {
2545 HasRDSEED = true;
2546 continue;
2547 }
2548
Robert Khasanov50e6f582014-09-19 09:53:48 +00002549 if (Feature == "adx") {
2550 HasADX = true;
2551 continue;
2552 }
2553
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002554 if (Feature == "tbm") {
2555 HasTBM = true;
2556 continue;
2557 }
2558
Craig Topperbba778b2012-06-03 21:46:30 +00002559 if (Feature == "fma") {
2560 HasFMA = true;
2561 continue;
2562 }
2563
Manman Rena45358c2012-10-11 00:59:55 +00002564 if (Feature == "f16c") {
2565 HasF16C = true;
2566 continue;
2567 }
2568
Craig Topper679b53a2013-08-21 05:29:10 +00002569 if (Feature == "avx512cd") {
2570 HasAVX512CD = true;
2571 continue;
2572 }
2573
2574 if (Feature == "avx512er") {
2575 HasAVX512ER = true;
2576 continue;
2577 }
2578
2579 if (Feature == "avx512pf") {
2580 HasAVX512PF = true;
2581 continue;
2582 }
2583
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002584 if (Feature == "avx512dq") {
2585 HasAVX512DQ = true;
2586 continue;
2587 }
2588
2589 if (Feature == "avx512bw") {
2590 HasAVX512BW = true;
2591 continue;
2592 }
2593
2594 if (Feature == "avx512vl") {
2595 HasAVX512VL = true;
2596 continue;
2597 }
2598
Ben Langmuir58078d02013-09-19 13:22:04 +00002599 if (Feature == "sha") {
2600 HasSHA = true;
2601 continue;
2602 }
2603
Nick Lewycky50e8f482013-10-05 20:14:27 +00002604 if (Feature == "cx16") {
2605 HasCX16 = true;
2606 continue;
2607 }
2608
Daniel Dunbar979586e2009-11-11 09:38:56 +00002609 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002610 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002611 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002612 .Case("avx2", AVX2)
2613 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002614 .Case("sse4.2", SSE42)
2615 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002616 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002617 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002618 .Case("sse2", SSE2)
2619 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002620 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002621 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002622
Eli Friedman33465822011-07-08 23:31:17 +00002623 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002624 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002625 .Case("3dnowa", AMD3DNowAthlon)
2626 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002627 .Case("mmx", MMX)
2628 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002629 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002630
2631 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2632 .Case("xop", XOP)
2633 .Case("fma4", FMA4)
2634 .Case("sse4a", SSE4A)
2635 .Default(NoXOP);
2636 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002637 }
Eli Friedman33465822011-07-08 23:31:17 +00002638
Craig Topper7481d8a2013-09-10 06:55:47 +00002639 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2640 // Can't do this earlier because we need to be able to explicitly enable
2641 // popcnt and still disable sse4.2.
2642 if (!HasPOPCNT && SSELevel >= SSE42 &&
2643 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2644 HasPOPCNT = true;
2645 Features.push_back("+popcnt");
2646 }
2647
Yunzhong Gao61089362013-10-16 19:07:02 +00002648 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2649 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2650 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2651 HasPRFCHW = true;
2652 Features.push_back("+prfchw");
2653 }
2654
Rafael Espindolaeb265472013-08-21 21:59:03 +00002655 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2656 // matches the selected sse level.
2657 if (FPMath == FP_SSE && SSELevel < SSE1) {
2658 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2659 return false;
2660 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2661 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2662 return false;
2663 }
2664
Eli Friedman33465822011-07-08 23:31:17 +00002665 // Don't tell the backend if we're turning off mmx; it will end up disabling
2666 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002667 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2668 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002669 std::vector<std::string>::iterator it;
2670 it = std::find(Features.begin(), Features.end(), "-mmx");
2671 if (it != Features.end())
2672 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002673 else if (SSELevel > NoSSE)
2674 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002675 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002676}
Chris Lattnerecd49032009-03-02 22:27:17 +00002677
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002678/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2679/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002680void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002681 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002682 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002683 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002684 Builder.defineMacro("__amd64__");
2685 Builder.defineMacro("__amd64");
2686 Builder.defineMacro("__x86_64");
2687 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002688 if (getTriple().getArchName() == "x86_64h") {
2689 Builder.defineMacro("__x86_64h");
2690 Builder.defineMacro("__x86_64h__");
2691 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002692 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002693 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002694 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002695
Chris Lattnerecd49032009-03-02 22:27:17 +00002696 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002697 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2698 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002699 switch (CPU) {
2700 case CK_Generic:
2701 break;
2702 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002703 // The rest are coming from the i386 define above.
2704 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002705 break;
2706 case CK_i486:
2707 case CK_WinChipC6:
2708 case CK_WinChip2:
2709 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002710 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002711 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002712 case CK_PentiumMMX:
2713 Builder.defineMacro("__pentium_mmx__");
2714 Builder.defineMacro("__tune_pentium_mmx__");
2715 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 case CK_i586:
2717 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002718 defineCPUMacros(Builder, "i586");
2719 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002720 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002721 case CK_Pentium3:
2722 case CK_Pentium3M:
2723 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002724 Builder.defineMacro("__tune_pentium3__");
2725 // Fallthrough
2726 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002727 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002728 Builder.defineMacro("__tune_pentium2__");
2729 // Fallthrough
2730 case CK_PentiumPro:
2731 Builder.defineMacro("__tune_i686__");
2732 Builder.defineMacro("__tune_pentiumpro__");
2733 // Fallthrough
2734 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002735 Builder.defineMacro("__i686");
2736 Builder.defineMacro("__i686__");
2737 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2738 Builder.defineMacro("__pentiumpro");
2739 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002740 break;
2741 case CK_Pentium4:
2742 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002743 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002744 break;
2745 case CK_Yonah:
2746 case CK_Prescott:
2747 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002748 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002749 break;
2750 case CK_Core2:
2751 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002752 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002753 break;
2754 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002755 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002756 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002757 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002758 defineCPUMacros(Builder, "slm");
2759 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002760 case CK_Corei7:
2761 case CK_Corei7AVX:
2762 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002763 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002764 case CK_Broadwell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002765 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002766 break;
Craig Topper449314e2013-08-20 07:09:39 +00002767 case CK_KNL:
2768 defineCPUMacros(Builder, "knl");
2769 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002770 case CK_SKX:
2771 defineCPUMacros(Builder, "skx");
2772 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002773 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002774 Builder.defineMacro("__k6_2__");
2775 Builder.defineMacro("__tune_k6_2__");
2776 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002777 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002778 if (CPU != CK_K6_2) { // In case of fallthrough
2779 // FIXME: GCC may be enabling these in cases where some other k6
2780 // architecture is specified but -m3dnow is explicitly provided. The
2781 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002782 Builder.defineMacro("__k6_3__");
2783 Builder.defineMacro("__tune_k6_3__");
2784 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002785 // Fallthrough
2786 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002787 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002788 break;
2789 case CK_Athlon:
2790 case CK_AthlonThunderbird:
2791 case CK_Athlon4:
2792 case CK_AthlonXP:
2793 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002794 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002795 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002796 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002797 Builder.defineMacro("__tune_athlon_sse__");
2798 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002799 break;
2800 case CK_K8:
2801 case CK_K8SSE3:
2802 case CK_x86_64:
2803 case CK_Opteron:
2804 case CK_OpteronSSE3:
2805 case CK_Athlon64:
2806 case CK_Athlon64SSE3:
2807 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002808 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002809 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002810 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002811 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002812 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002813 case CK_BTVER1:
2814 defineCPUMacros(Builder, "btver1");
2815 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002816 case CK_BTVER2:
2817 defineCPUMacros(Builder, "btver2");
2818 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002819 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002820 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002821 break;
2822 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002823 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002824 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002825 case CK_BDVER3:
2826 defineCPUMacros(Builder, "bdver3");
2827 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002828 case CK_BDVER4:
2829 defineCPUMacros(Builder, "bdver4");
2830 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002831 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002832 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002833 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002834 }
Chris Lattner96e43572009-03-02 22:40:39 +00002835
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002836 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002837 Builder.defineMacro("__REGISTER_PREFIX__", "");
2838
Chris Lattner6df41af2009-04-19 17:32:33 +00002839 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2840 // functions in glibc header files that use FP Stack inline asm which the
2841 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002842 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002843
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002844 if (HasAES)
2845 Builder.defineMacro("__AES__");
2846
Craig Topper3f122a72012-05-31 05:18:48 +00002847 if (HasPCLMUL)
2848 Builder.defineMacro("__PCLMUL__");
2849
Craig Topper22967d42011-12-25 05:06:45 +00002850 if (HasLZCNT)
2851 Builder.defineMacro("__LZCNT__");
2852
Benjamin Kramer1e250392012-07-07 09:39:18 +00002853 if (HasRDRND)
2854 Builder.defineMacro("__RDRND__");
2855
Craig Topper8c7f2512014-11-03 06:51:41 +00002856 if (HasFSGSBASE)
2857 Builder.defineMacro("__FSGSBASE__");
2858
Craig Topper22967d42011-12-25 05:06:45 +00002859 if (HasBMI)
2860 Builder.defineMacro("__BMI__");
2861
2862 if (HasBMI2)
2863 Builder.defineMacro("__BMI2__");
2864
Craig Topper1de83482011-12-29 16:10:46 +00002865 if (HasPOPCNT)
2866 Builder.defineMacro("__POPCNT__");
2867
Michael Liao625a8752012-11-10 05:17:46 +00002868 if (HasRTM)
2869 Builder.defineMacro("__RTM__");
2870
Michael Liao74f4eaf2013-03-26 17:52:08 +00002871 if (HasPRFCHW)
2872 Builder.defineMacro("__PRFCHW__");
2873
Michael Liaoffaae352013-03-29 05:17:55 +00002874 if (HasRDSEED)
2875 Builder.defineMacro("__RDSEED__");
2876
Robert Khasanov50e6f582014-09-19 09:53:48 +00002877 if (HasADX)
2878 Builder.defineMacro("__ADX__");
2879
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002880 if (HasTBM)
2881 Builder.defineMacro("__TBM__");
2882
Rafael Espindolae62e2792013-08-20 13:44:29 +00002883 switch (XOPLevel) {
2884 case XOP:
2885 Builder.defineMacro("__XOP__");
2886 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002887 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002888 case SSE4A:
2889 Builder.defineMacro("__SSE4A__");
2890 case NoXOP:
2891 break;
2892 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002893
Craig Topperbba778b2012-06-03 21:46:30 +00002894 if (HasFMA)
2895 Builder.defineMacro("__FMA__");
2896
Manman Rena45358c2012-10-11 00:59:55 +00002897 if (HasF16C)
2898 Builder.defineMacro("__F16C__");
2899
Craig Topper679b53a2013-08-21 05:29:10 +00002900 if (HasAVX512CD)
2901 Builder.defineMacro("__AVX512CD__");
2902 if (HasAVX512ER)
2903 Builder.defineMacro("__AVX512ER__");
2904 if (HasAVX512PF)
2905 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002906 if (HasAVX512DQ)
2907 Builder.defineMacro("__AVX512DQ__");
2908 if (HasAVX512BW)
2909 Builder.defineMacro("__AVX512BW__");
2910 if (HasAVX512VL)
2911 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002912
Ben Langmuir58078d02013-09-19 13:22:04 +00002913 if (HasSHA)
2914 Builder.defineMacro("__SHA__");
2915
Nick Lewycky50e8f482013-10-05 20:14:27 +00002916 if (HasCX16)
2917 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2918
Chris Lattner96e43572009-03-02 22:40:39 +00002919 // Each case falls through to the previous one here.
2920 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002921 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002922 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002923 case AVX2:
2924 Builder.defineMacro("__AVX2__");
2925 case AVX:
2926 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002927 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002928 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002929 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002930 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002931 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002932 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002933 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002934 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002935 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002936 Builder.defineMacro("__SSE2__");
2937 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002938 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002939 Builder.defineMacro("__SSE__");
2940 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002941 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002942 break;
2943 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002944
Derek Schuffc7dd7222012-10-11 15:52:22 +00002945 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002946 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002947 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002948 case AVX2:
2949 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002950 case SSE42:
2951 case SSE41:
2952 case SSSE3:
2953 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002954 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002955 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002956 break;
2957 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002958 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002959 break;
2960 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002961 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002962 }
2963 }
2964
Anders Carlssone437c682010-01-27 03:47:49 +00002965 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002966 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002967 case AMD3DNowAthlon:
2968 Builder.defineMacro("__3dNOW_A__");
2969 case AMD3DNow:
2970 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002971 case MMX:
2972 Builder.defineMacro("__MMX__");
2973 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002974 break;
2975 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002976
2977 if (CPU >= CK_i486) {
2978 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2979 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2980 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2981 }
2982 if (CPU >= CK_i586)
2983 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002984}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002985
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002986bool X86TargetInfo::hasFeature(StringRef Feature) const {
2987 return llvm::StringSwitch<bool>(Feature)
2988 .Case("aes", HasAES)
2989 .Case("avx", SSELevel >= AVX)
2990 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002991 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002992 .Case("avx512cd", HasAVX512CD)
2993 .Case("avx512er", HasAVX512ER)
2994 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002995 .Case("avx512dq", HasAVX512DQ)
2996 .Case("avx512bw", HasAVX512BW)
2997 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002998 .Case("bmi", HasBMI)
2999 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003000 .Case("cx16", HasCX16)
3001 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003002 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003003 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003004 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003005 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003006 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3007 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3008 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003009 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003010 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003011 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003012 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003013 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003014 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003015 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003016 .Case("sse", SSELevel >= SSE1)
3017 .Case("sse2", SSELevel >= SSE2)
3018 .Case("sse3", SSELevel >= SSE3)
3019 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003020 .Case("sse4.1", SSELevel >= SSE41)
3021 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003022 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003023 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003024 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003025 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3026 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003027 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003028 .Default(false);
3029}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003030
Eli Friedman3fd920a2008-08-20 02:34:37 +00003031bool
Anders Carlsson58436352009-02-28 17:11:49 +00003032X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003033 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003034 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003035 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003036 case 'Y': // first letter of a pair:
3037 switch (*(Name+1)) {
3038 default: return false;
3039 case '0': // First SSE register.
3040 case 't': // Any SSE register, when SSE2 is enabled.
3041 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3042 case 'm': // any MMX register, when inter-unit moves enabled.
3043 break; // falls through to setAllowsRegister.
3044 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003045 case 'f': // any x87 floating point stack register.
3046 // Constraint 'f' cannot be used for output operands.
3047 if (Info.ConstraintStr[0] == '=')
3048 return false;
3049
3050 Info.setAllowsRegister();
3051 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003052 case 'a': // eax.
3053 case 'b': // ebx.
3054 case 'c': // ecx.
3055 case 'd': // edx.
3056 case 'S': // esi.
3057 case 'D': // edi.
3058 case 'A': // edx:eax.
3059 case 't': // top of floating point stack.
3060 case 'u': // second from top of floating point stack.
3061 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003062 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003063 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003064 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003065 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3066 case 'l': // "Index" registers: any general register that can be used as an
3067 // index in a base+index memory access.
3068 Info.setAllowsRegister();
3069 return true;
3070 case 'C': // SSE floating point constant.
3071 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003072 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003073 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003074 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003075 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003076 return true;
3077 }
3078}
3079
Akira Hatanaka974131e2014-09-18 18:17:18 +00003080bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3081 unsigned Size) const {
3082 // Strip off constraint modifiers.
3083 while (Constraint[0] == '=' ||
3084 Constraint[0] == '+' ||
3085 Constraint[0] == '&')
3086 Constraint = Constraint.substr(1);
3087
3088 return validateOperandSize(Constraint, Size);
3089}
3090
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003091bool X86TargetInfo::validateInputSize(StringRef Constraint,
3092 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003093 return validateOperandSize(Constraint, Size);
3094}
3095
3096bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3097 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003098 switch (Constraint[0]) {
3099 default: break;
3100 case 'y':
3101 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003102 case 'f':
3103 case 't':
3104 case 'u':
3105 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003106 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003107 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003108 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003109 }
3110
3111 return true;
3112}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003113
Eli Friedman3fd920a2008-08-20 02:34:37 +00003114std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003115X86TargetInfo::convertConstraint(const char *&Constraint) const {
3116 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003117 case 'a': return std::string("{ax}");
3118 case 'b': return std::string("{bx}");
3119 case 'c': return std::string("{cx}");
3120 case 'd': return std::string("{dx}");
3121 case 'S': return std::string("{si}");
3122 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003123 case 'p': // address
3124 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003125 case 't': // top of floating point stack.
3126 return std::string("{st}");
3127 case 'u': // second from top of floating point stack.
3128 return std::string("{st(1)}"); // second from top of floating point stack.
3129 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003130 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003131 }
3132}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003133} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003134
3135namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003136// X86-32 generic target
3137class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003138public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003139 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003140 DoubleAlign = LongLongAlign = 32;
3141 LongDoubleWidth = 96;
3142 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003143 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003144 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003145 SizeType = UnsignedInt;
3146 PtrDiffType = SignedInt;
3147 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003148 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003149
3150 // Use fpret for all types.
3151 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3152 (1 << TargetInfo::Double) |
3153 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003154
3155 // x86-32 has atomics up to 8 bytes
3156 // FIXME: Check that we actually have cmpxchg8b before setting
3157 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003159 }
Craig Topper3164f332014-03-11 03:39:26 +00003160 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003161 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003162 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003163
Craig Topper3164f332014-03-11 03:39:26 +00003164 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003165 if (RegNo == 0) return 0;
3166 if (RegNo == 1) return 2;
3167 return -1;
3168 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003169 bool validateOperandSize(StringRef Constraint,
3170 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003171 switch (Constraint[0]) {
3172 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003173 case 'R':
3174 case 'q':
3175 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003176 case 'a':
3177 case 'b':
3178 case 'c':
3179 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003180 case 'S':
3181 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003182 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003183 case 'A':
3184 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003185 }
3186
Akira Hatanaka974131e2014-09-18 18:17:18 +00003187 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003188 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003189};
3190} // end anonymous namespace
3191
3192namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003193class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003195 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3196 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003197
Craig Topper3164f332014-03-11 03:39:26 +00003198 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003199 unsigned Major, Minor, Micro;
3200 getTriple().getOSVersion(Major, Minor, Micro);
3201 // New NetBSD uses the default rounding mode.
3202 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3203 return X86_32TargetInfo::getFloatEvalMethod();
3204 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003205 return 1;
3206 }
3207};
3208} // end anonymous namespace
3209
3210namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003211class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3212public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003213 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3214 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003215 SizeType = UnsignedLong;
3216 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003217 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003218 }
3219};
3220} // end anonymous namespace
3221
3222namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003223class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3224public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003225 BitrigI386TargetInfo(const llvm::Triple &Triple)
3226 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003227 SizeType = UnsignedLong;
3228 IntPtrType = SignedLong;
3229 PtrDiffType = SignedLong;
3230 }
3231};
3232} // end anonymous namespace
3233
3234namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003235class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003236public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003237 DarwinI386TargetInfo(const llvm::Triple &Triple)
3238 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003239 LongDoubleWidth = 128;
3240 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003241 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003242 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003243 SizeType = UnsignedLong;
3244 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003245 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003246 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003247 }
3248
Eli Friedman3fd920a2008-08-20 02:34:37 +00003249};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003250} // end anonymous namespace
3251
3252namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003253// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003254class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003256 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3257 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003258 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003259 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003260 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003261 }
Craig Topper3164f332014-03-11 03:39:26 +00003262 void getTargetDefines(const LangOptions &Opts,
3263 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003264 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3265 }
3266};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003267
3268// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003269class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003270public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003271 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003272 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003273 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003274 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3275 }
Craig Topper3164f332014-03-11 03:39:26 +00003276 void getTargetDefines(const LangOptions &Opts,
3277 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003278 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3279 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3280 // The value of the following reflects processor type.
3281 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3282 // We lost the original triple, so we use the default.
3283 Builder.defineMacro("_M_IX86", "600");
3284 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003285};
3286} // end anonymous namespace
3287
Reid Kleckner47606832014-04-21 20:58:00 +00003288static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3289 Builder.defineMacro("__MSVCRT__");
3290 Builder.defineMacro("__MINGW32__");
3291
3292 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3293 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3294 // macro anyway for pre-processor compatibility.
3295 if (Opts.MicrosoftExt)
3296 Builder.defineMacro("__declspec", "__declspec");
3297 else
3298 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3299
3300 if (!Opts.MicrosoftExt) {
3301 // Provide macros for all the calling convention keywords. Provide both
3302 // single and double underscore prefixed variants. These are available on
3303 // x64 as well as x86, even though they have no effect.
3304 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3305 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003306 std::string GCCSpelling = "__attribute__((__";
3307 GCCSpelling += CC;
3308 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003309 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3310 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3311 }
3312 }
3313}
3314
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003315namespace {
3316// x86-32 MinGW target
3317class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3318public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003319 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3320 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003321 void getTargetDefines(const LangOptions &Opts,
3322 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003323 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003324 DefineStd(Builder, "WIN32", Opts);
3325 DefineStd(Builder, "WINNT", Opts);
3326 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003327 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003328 }
3329};
3330} // end anonymous namespace
3331
3332namespace {
3333// x86-32 Cygwin target
3334class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3335public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003336 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3337 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003338 TLSSupported = false;
3339 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003340 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003341 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003342 }
Craig Topper3164f332014-03-11 03:39:26 +00003343 void getTargetDefines(const LangOptions &Opts,
3344 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003345 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003346 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003347 Builder.defineMacro("__CYGWIN__");
3348 Builder.defineMacro("__CYGWIN32__");
3349 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003350 if (Opts.CPlusPlus)
3351 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003352 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003353};
3354} // end anonymous namespace
3355
3356namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003357// x86-32 Haiku target
3358class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3359public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003360 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003361 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003362 IntPtrType = SignedLong;
3363 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003364 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003365 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003366 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003367 }
Craig Topper3164f332014-03-11 03:39:26 +00003368 void getTargetDefines(const LangOptions &Opts,
3369 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003370 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3371 Builder.defineMacro("__INTEL__");
3372 Builder.defineMacro("__HAIKU__");
3373 }
3374};
3375} // end anonymous namespace
3376
Douglas Gregor9fabd852011-07-01 22:41:14 +00003377// RTEMS Target
3378template<typename Target>
3379class RTEMSTargetInfo : public OSTargetInfo<Target> {
3380protected:
Craig Topper3164f332014-03-11 03:39:26 +00003381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3382 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003383 // RTEMS defines; list based off of gcc output
3384
Douglas Gregor9fabd852011-07-01 22:41:14 +00003385 Builder.defineMacro("__rtems__");
3386 Builder.defineMacro("__ELF__");
3387 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003388
Douglas Gregor9fabd852011-07-01 22:41:14 +00003389public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003390 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3391 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003392
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003393 switch (Triple.getArch()) {
3394 default:
3395 case llvm::Triple::x86:
3396 // this->MCountName = ".mcount";
3397 break;
3398 case llvm::Triple::mips:
3399 case llvm::Triple::mipsel:
3400 case llvm::Triple::ppc:
3401 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003402 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003403 // this->MCountName = "_mcount";
3404 break;
3405 case llvm::Triple::arm:
3406 // this->MCountName = "__mcount";
3407 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003408 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003409 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003410};
3411
3412namespace {
3413// x86-32 RTEMS target
3414class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3415public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003416 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003417 SizeType = UnsignedLong;
3418 IntPtrType = SignedLong;
3419 PtrDiffType = SignedLong;
3420 this->UserLabelPrefix = "";
3421 }
Craig Topper3164f332014-03-11 03:39:26 +00003422 void getTargetDefines(const LangOptions &Opts,
3423 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003424 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3425 Builder.defineMacro("__INTEL__");
3426 Builder.defineMacro("__rtems__");
3427 }
3428};
3429} // end anonymous namespace
3430
Chris Lattnerb986aba2010-04-11 19:29:39 +00003431namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003432// x86-64 generic target
3433class X86_64TargetInfo : public X86TargetInfo {
3434public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003435 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003436 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003437 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003438 LongDoubleWidth = 128;
3439 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003440 LargeArrayMinWidth = 128;
3441 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003442 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003443 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3444 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3445 IntPtrType = IsX32 ? SignedInt : SignedLong;
3446 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003447 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003448 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003449
Eric Christopher917e9522014-11-18 22:36:15 +00003450 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003451 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003452 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3453 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003454
3455 // Use fpret only for long double.
3456 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003457
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003458 // Use fp2ret for _Complex long double.
3459 ComplexLongDoubleUsesFP2Ret = true;
3460
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003461 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003462 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003463 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003464 }
Craig Topper3164f332014-03-11 03:39:26 +00003465 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003466 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003467 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003468
Craig Topper3164f332014-03-11 03:39:26 +00003469 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003470 if (RegNo == 0) return 0;
3471 if (RegNo == 1) return 1;
3472 return -1;
3473 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003474
Craig Topper3164f332014-03-11 03:39:26 +00003475 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003476 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003477 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003478 CC == CC_IntelOclBicc ||
3479 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003480 }
3481
Craig Topper3164f332014-03-11 03:39:26 +00003482 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003483 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003484 }
3485
Pavel Chupinfd223e12014-08-04 12:39:43 +00003486 // for x32 we need it here explicitly
3487 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003488};
3489} // end anonymous namespace
3490
3491namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003492// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003493class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003494public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003495 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3496 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003497 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003498 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003499 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003500 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003501 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003502 SizeType = UnsignedLongLong;
3503 PtrDiffType = SignedLongLong;
3504 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003505 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003506 }
Craig Topper3164f332014-03-11 03:39:26 +00003507 void getTargetDefines(const LangOptions &Opts,
3508 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003509 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003510 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003511 }
Craig Topper3164f332014-03-11 03:39:26 +00003512 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003513 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003514 }
Craig Topper3164f332014-03-11 03:39:26 +00003515 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003516 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003517 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003518 CC == CC_IntelOclBicc ||
3519 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3520 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003521};
3522} // end anonymous namespace
3523
3524namespace {
3525// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003526class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003527public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003528 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003529 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003530 LongDoubleWidth = LongDoubleAlign = 64;
3531 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003532 }
Craig Topper3164f332014-03-11 03:39:26 +00003533 void getTargetDefines(const LangOptions &Opts,
3534 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003535 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3536 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003537 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003538 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003539 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003540};
3541} // end anonymous namespace
3542
3543namespace {
3544// x86-64 MinGW target
3545class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3546public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003547 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3548 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003549 void getTargetDefines(const LangOptions &Opts,
3550 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003551 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003552 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003553 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003554 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003555
3556 // GCC defines this macro when it is using __gxx_personality_seh0.
3557 if (!Opts.SjLjExceptions)
3558 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003559 }
3560};
3561} // end anonymous namespace
3562
3563namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003564class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3565public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003566 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3567 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003568 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003569 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003570 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3571 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003572 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003573 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003574 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003575 }
3576};
3577} // end anonymous namespace
3578
3579namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003580class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003582 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3583 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003584 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003585 Int64Type = SignedLongLong;
3586 }
3587};
3588} // end anonymous namespace
3589
3590namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003591class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3592public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003593 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3594 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3595 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003596 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003597 }
3598};
Tim Northover9bb857a2013-01-31 12:13:10 +00003599}
3600
Eli Friedman9fa28852012-08-08 23:57:20 +00003601
3602namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003603class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003604 // Possible FPU choices.
3605 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003606 VFP2FPU = (1 << 0),
3607 VFP3FPU = (1 << 1),
3608 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003609 NeonFPU = (1 << 3),
3610 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003611 };
3612
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003613 // Possible HWDiv features.
3614 enum HWDivMode {
3615 HWDivThumb = (1 << 0),
3616 HWDivARM = (1 << 1)
3617 };
3618
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003619 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003620 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003621 }
3622
3623 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3624 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003625
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003626 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003627
Rafael Espindolaeb265472013-08-21 21:59:03 +00003628 enum {
3629 FP_Default,
3630 FP_VFP,
3631 FP_Neon
3632 } FPMath;
3633
Bernard Ogdenda13af32013-10-24 18:32:51 +00003634 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003635
Logan Chien57086ce2012-10-10 06:56:20 +00003636 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003637 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003638 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003639
3640 // Initialized via features.
3641 unsigned SoftFloat : 1;
3642 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003643
Bernard Ogden18b57012013-10-29 09:47:51 +00003644 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003645 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003646
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003647 // ACLE 6.5.1 Hardware floating point
3648 enum {
3649 HW_FP_HP = (1 << 1), /// half (16-bit)
3650 HW_FP_SP = (1 << 2), /// single (32-bit)
3651 HW_FP_DP = (1 << 3), /// double (64-bit)
3652 };
3653 uint32_t HW_FP;
3654
Chris Lattner5cc15e02010-03-03 19:03:45 +00003655 static const Builtin::Info BuiltinInfo[];
3656
Rafael Espindola101d5b92013-05-13 20:09:47 +00003657 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003658 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003659 if (T.getArch() == llvm::Triple::arm ||
3660 T.getArch() == llvm::Triple::armeb) {
3661 StringRef VersionStr;
3662 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003663 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003664 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003665 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003666 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003667 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003668 unsigned Version;
3669 if (VersionStr.getAsInteger(10, Version))
3670 return false;
3671 return Version >= 6;
3672 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003673 assert(T.getArch() == llvm::Triple::thumb ||
3674 T.getArch() == llvm::Triple::thumbeb);
3675 StringRef VersionStr;
3676 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003677 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003678 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003679 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003680 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003681 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003682 unsigned Version;
3683 if (VersionStr.getAsInteger(10, Version))
3684 return false;
3685 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003686 }
3687
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003688 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003689 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003690
3691 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003692 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003693
Tim Northover00853e52014-08-05 11:07:26 +00003694 // size_t is unsigned long on MachO-derived environments and NetBSD.
3695 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003696 SizeType = UnsignedLong;
3697 else
3698 SizeType = UnsignedInt;
3699
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003700 switch (T.getOS()) {
3701 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003702 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003703 break;
3704 case llvm::Triple::Win32:
3705 WCharType = UnsignedShort;
3706 break;
3707 case llvm::Triple::Linux:
3708 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003709 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3710 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003711 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003712 }
3713
3714 UseBitFieldTypeAlignment = true;
3715
3716 ZeroLengthBitfieldBoundary = 0;
3717
Tim Northover147cd2f2014-10-14 22:12:21 +00003718 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3719 // so set preferred for small types to 32.
3720 if (T.isOSBinFormatMachO()) {
3721 DescriptionString =
3722 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3723 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3724 } else if (T.isOSWindows()) {
3725 // FIXME: this is invalid for WindowsCE
3726 assert(!BigEndian && "Windows on ARM does not support big endian");
3727 DescriptionString = "e"
3728 "-m:e"
3729 "-p:32:32"
3730 "-i64:64"
3731 "-v128:64:128"
3732 "-a:0:32"
3733 "-n32"
3734 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003735 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003736 DescriptionString =
3737 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3738 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003739 }
3740
3741 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003742 }
3743
3744 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003745 const llvm::Triple &T = getTriple();
3746
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003747 IsAAPCS = false;
3748
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003749 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003750
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003751 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003752 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003753 SizeType = UnsignedInt;
3754 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003755 SizeType = UnsignedLong;
3756
3757 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3758 WCharType = SignedInt;
3759
3760 // Do not respect the alignment of bit-field types when laying out
3761 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3762 UseBitFieldTypeAlignment = false;
3763
3764 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3765 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3766 /// gcc.
3767 ZeroLengthBitfieldBoundary = 32;
3768
Tim Northover147cd2f2014-10-14 22:12:21 +00003769 if (T.isOSBinFormatMachO())
3770 DescriptionString =
3771 BigEndian
3772 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3773 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3774 else
3775 DescriptionString =
3776 BigEndian
3777 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3778 : "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 +00003779
3780 // FIXME: Override "preferred align" for double and long long.
3781 }
3782
Chris Lattner17df24e2008-04-21 18:56:49 +00003783public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003784 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003785 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003786 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003787 BigEndian = IsBigEndian;
3788
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003789 switch (getTriple().getOS()) {
3790 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003791 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003792 break;
3793 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003794 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003795 break;
3796 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003797
Chris Lattner1a8f3942010-04-23 16:29:58 +00003798 // {} in inline assembly are neon specifiers, not assembly variant
3799 // specifiers.
3800 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003801
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003802 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003803 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003804
3805 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003806
3807 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003808 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003809
3810 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003811 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003812 if (shouldUseInlineAtomic(getTriple()))
3813 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003814
3815 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003816 // the alignment of the zero-length bitfield is greater than the member
3817 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003818 // zero length bitfield.
3819 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003820 }
Alp Toker4925ba72014-06-07 23:30:42 +00003821 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003822 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003823 ABI = Name;
3824
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003825 // The defaults (above) are for AAPCS, check if we need to change them.
3826 //
3827 // FIXME: We need support for -meabi... we could just mangle it into the
3828 // name.
3829 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003830 setABIAPCS();
3831 return true;
3832 }
3833 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3834 setABIAAPCS();
3835 return true;
3836 }
3837 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003838 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003839
Craig Topper3164f332014-03-11 03:39:26 +00003840 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003841 if (IsAAPCS)
3842 Features["aapcs"] = true;
3843 else
3844 Features["apcs"] = true;
3845
Silviu Barangae5690462013-10-21 10:59:33 +00003846 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003847 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3848 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00003849 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00003850 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003851 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003852 }
3853 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003854 Features["vfp4"] = true;
3855 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003856 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3857 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003858 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003859 Features["vfp4"] = true;
3860 Features["neon"] = true;
3861 Features["hwdiv"] = true;
3862 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003863 } else if (CPU == "cyclone") {
3864 Features["v8fp"] = true;
3865 Features["neon"] = true;
3866 Features["hwdiv"] = true;
3867 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003868 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3869 Features["fp-armv8"] = true;
3870 Features["neon"] = true;
3871 Features["hwdiv"] = true;
3872 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003873 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003874 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003875 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003876 // Enable the hwdiv extension for all v8a AArch32 cores by
3877 // default.
3878 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003879 ArchName == "armebv8a" || ArchName == "armebv8" ||
3880 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3881 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003882 Features["hwdiv"] = true;
3883 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003884 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003885 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003886 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003887 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003888
Craig Topper3164f332014-03-11 03:39:26 +00003889 bool handleTargetFeatures(std::vector<std::string> &Features,
3890 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003891 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003892 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003893 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003894 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003895 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003896
3897 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003898 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003899 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003900 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003901 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003902 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003903 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003904 HW_FP = HW_FP_SP | HW_FP_DP;
3905 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003906 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003907 HW_FP = HW_FP_SP | HW_FP_DP;
3908 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003909 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003910 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3911 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003912 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003913 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3914 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003915 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003916 HW_FP = HW_FP_SP | HW_FP_DP;
3917 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003918 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003919 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003920 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003921 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003922 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003923 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003924 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003925 } else if (Feature == "+fp-only-sp") {
3926 HW_FP &= ~HW_FP_DP;
3927 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003928 }
3929
Rafael Espindolaeb265472013-08-21 21:59:03 +00003930 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3931 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3932 return false;
3933 }
3934
3935 if (FPMath == FP_Neon)
3936 Features.push_back("+neonfp");
3937 else if (FPMath == FP_VFP)
3938 Features.push_back("-neonfp");
3939
Daniel Dunbar893d4752009-12-19 04:15:38 +00003940 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003941 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3942 for (const auto &FEFeature : FrontEndFeatures) {
3943 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3944 if (Feature != Features.end())
3945 Features.erase(Feature);
3946 }
3947
Rafael Espindolaeb265472013-08-21 21:59:03 +00003948 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003949 }
3950
Craig Topper3164f332014-03-11 03:39:26 +00003951 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003952 return llvm::StringSwitch<bool>(Feature)
3953 .Case("arm", true)
3954 .Case("softfloat", SoftFloat)
3955 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003956 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003957 .Case("hwdiv", HWDiv & HWDivThumb)
3958 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003959 .Default(false);
3960 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003961 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003962 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00003963 return llvm::StringSwitch<const char *>(Name)
3964 .Cases("arm8", "arm810", "4")
3965 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
3966 "4")
3967 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3968 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3969 .Case("ep9312", "4T")
3970 .Cases("arm10tdmi", "arm1020t", "5T")
3971 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3972 .Case("arm926ej-s", "5TEJ")
3973 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3974 .Cases("xscale", "iwmmxt", "5TE")
3975 .Case("arm1136j-s", "6J")
3976 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
3977 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
3978 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
3979 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3980 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
3981 "7A")
3982 .Cases("cortex-r4", "cortex-r5", "7R")
3983 .Case("swift", "7S")
3984 .Case("cyclone", "8A")
3985 .Case("cortex-m3", "7M")
3986 .Cases("cortex-m4", "cortex-m7", "7EM")
3987 .Case("cortex-m0", "6M")
3988 .Cases("cortex-a53", "cortex-a57", "8A")
3989 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003990 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003991 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00003992 return llvm::StringSwitch<const char *>(Name)
3993 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
3994 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
3995 "A")
3996 .Cases("cortex-a53", "cortex-a57", "A")
3997 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
3998 .Cases("cortex-r4", "cortex-r5", "R")
3999 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004000 }
Craig Topper3164f332014-03-11 03:39:26 +00004001 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004002 if (!getCPUDefineSuffix(Name))
4003 return false;
4004
Tim Northovere8c37212014-07-09 09:24:43 +00004005 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4006 StringRef Profile = getCPUProfile(Name);
4007 if (Profile == "M" && MaxAtomicInlineWidth) {
4008 MaxAtomicPromoteWidth = 32;
4009 MaxAtomicInlineWidth = 32;
4010 }
4011
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004012 CPU = Name;
4013 return true;
4014 }
Craig Topper3164f332014-03-11 03:39:26 +00004015 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004016 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4017 unsigned CPUArchVer) const {
4018 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4019 (CPUArch.find('M') != StringRef::npos);
4020 }
4021 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4022 unsigned CPUArchVer) const {
4023 // We check both CPUArchVer and ArchName because when only triple is
4024 // specified, the default CPU is arm1136j-s.
4025 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4026 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4027 }
Craig Topper3164f332014-03-11 03:39:26 +00004028 void getTargetDefines(const LangOptions &Opts,
4029 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004030 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004031 Builder.defineMacro("__arm");
4032 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004033
Chris Lattnerecd49032009-03-02 22:27:17 +00004034 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004035 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004036
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004037 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004038 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004039 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004040 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004041 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004042
4043 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004044 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004045 StringRef ArchName = getTriple().getArchName();
4046
4047 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4048 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004049 if (CPUArch[0] >= '8') {
4050 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4051 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004052 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004053
4054 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4055 // is not defined for the M-profile.
4056 // NOTE that the deffault profile is assumed to be 'A'
4057 if (CPUProfile.empty() || CPUProfile != "M")
4058 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4059
4060 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4061 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4062 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4063 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4064 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4065 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4066 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4067
4068 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4069 // instruction set such as ARM or Thumb.
4070 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4071
4072 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4073
4074 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004075 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004076 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004077
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004078 // ACLE 6.5.1 Hardware Floating Point
4079 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004080 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004081
Yi Konga44c4d72014-06-27 21:25:42 +00004082 // ACLE predefines.
4083 Builder.defineMacro("__ARM_ACLE", "200");
4084
Mike Stump9d54bd72009-04-08 02:07:04 +00004085 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004086
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004087 // FIXME: It's more complicated than this and we don't really support
4088 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004089 // Windows on ARM does not "support" interworking
4090 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004091 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004092
David Tweed8f676532012-10-25 13:33:01 +00004093 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004094 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004095 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4096 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004097 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004098 Builder.defineMacro("__ARM_PCS", "1");
4099
David Tweed8f676532012-10-25 13:33:01 +00004100 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004101 Builder.defineMacro("__ARM_PCS_VFP", "1");
4102 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004103
Daniel Dunbar893d4752009-12-19 04:15:38 +00004104 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004105 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004106
4107 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004108 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004109
4110 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004111 Builder.defineMacro("__THUMBEL__");
4112 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004113 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004114 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004115 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004116 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4117 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004118
4119 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004120 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004121
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004122 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004123 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004124 if (FPU & VFP2FPU)
4125 Builder.defineMacro("__ARM_VFPV2__");
4126 if (FPU & VFP3FPU)
4127 Builder.defineMacro("__ARM_VFPV3__");
4128 if (FPU & VFP4FPU)
4129 Builder.defineMacro("__ARM_VFPV4__");
4130 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004131
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004132 // This only gets set when Neon instructions are actually available, unlike
4133 // the VFP define, hence the soft float and arch check. This is subtly
4134 // different from gcc, we follow the intent which was that it should be set
4135 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004136 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4137 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004138 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004139 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004140
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004141 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4142 Opts.ShortWChar ? "2" : "4");
4143
4144 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4145 Opts.ShortEnums ? "1" : "4");
4146
Bernard Ogden18b57012013-10-29 09:47:51 +00004147 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004148 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004149
Tim Northover02e38602014-02-03 17:28:04 +00004150 if (Crypto)
4151 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4152
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004153 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004154 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4155 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4156 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4157 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4158 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004159
4160 bool is5EOrAbove = (CPUArchVer >= 6 ||
4161 (CPUArchVer == 5 &&
4162 CPUArch.find('E') != StringRef::npos));
4163 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4164 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4165 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004166 }
Craig Topper3164f332014-03-11 03:39:26 +00004167 void getTargetBuiltins(const Builtin::Info *&Records,
4168 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004169 Records = BuiltinInfo;
4170 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004171 }
Craig Topper3164f332014-03-11 03:39:26 +00004172 bool isCLZForZeroUndef() const override { return false; }
4173 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004174 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004175 }
Craig Topper3164f332014-03-11 03:39:26 +00004176 void getGCCRegNames(const char * const *&Names,
4177 unsigned &NumNames) const override;
4178 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4179 unsigned &NumAliases) const override;
4180 bool validateAsmConstraint(const char *&Name,
4181 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004182 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004183 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004184 case 'l': // r0-r7
4185 case 'h': // r8-r15
4186 case 'w': // VFP Floating point register single precision
4187 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004188 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004189 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004190 case 'Q': // A memory address that is a single base register.
4191 Info.setAllowsMemory();
4192 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004193 case 'U': // a memory reference...
4194 switch (Name[1]) {
4195 case 'q': // ...ARMV4 ldrsb
4196 case 'v': // ...VFP load/store (reg+constant offset)
4197 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004198 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004199 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004200 case 'n': // valid address for Neon doubleword vector load/store
4201 case 'm': // valid address for Neon element and structure load/store
4202 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004203 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004204 Info.setAllowsMemory();
4205 Name++;
4206 return true;
4207 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004208 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004209 return false;
4210 }
Craig Topper3164f332014-03-11 03:39:26 +00004211 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004212 std::string R;
4213 switch (*Constraint) {
4214 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004215 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004216 Constraint++;
4217 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004218 case 'p': // 'p' should be translated to 'r' by default.
4219 R = std::string("r");
4220 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004221 default:
4222 return std::string(1, *Constraint);
4223 }
4224 return R;
4225 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004226 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004227 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004228 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004229 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004230 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004231
Bill Wendling9d1ee112012-10-25 23:28:48 +00004232 // Strip off constraint modifiers.
4233 while (Constraint[0] == '=' ||
4234 Constraint[0] == '+' ||
4235 Constraint[0] == '&')
4236 Constraint = Constraint.substr(1);
4237
4238 switch (Constraint[0]) {
4239 default: break;
4240 case 'r': {
4241 switch (Modifier) {
4242 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004243 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004244 case 'q':
4245 // A register of size 32 cannot fit a vector type.
4246 return false;
4247 }
4248 }
4249 }
4250
4251 return true;
4252 }
Craig Topper3164f332014-03-11 03:39:26 +00004253 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004254 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004255 return "";
4256 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004257
Craig Topper3164f332014-03-11 03:39:26 +00004258 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004259 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4260 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004261
Craig Topper3164f332014-03-11 03:39:26 +00004262 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004263 if (RegNo == 0) return 0;
4264 if (RegNo == 1) return 1;
4265 return -1;
4266 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004267};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004268
Rafael Espindolaeb265472013-08-21 21:59:03 +00004269bool ARMTargetInfo::setFPMath(StringRef Name) {
4270 if (Name == "neon") {
4271 FPMath = FP_Neon;
4272 return true;
4273 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4274 Name == "vfp4") {
4275 FPMath = FP_VFP;
4276 return true;
4277 }
4278 return false;
4279}
4280
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004281const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004282 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004283 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004284 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4285
4286 // Float registers
4287 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4288 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4289 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004290 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004291
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004292 // Double registers
4293 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4294 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004295 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4296 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004297
4298 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004299 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4300 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004301};
4302
4303void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004304 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004305 Names = GCCRegNames;
4306 NumNames = llvm::array_lengthof(GCCRegNames);
4307}
4308
4309const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004310 { { "a1" }, "r0" },
4311 { { "a2" }, "r1" },
4312 { { "a3" }, "r2" },
4313 { { "a4" }, "r3" },
4314 { { "v1" }, "r4" },
4315 { { "v2" }, "r5" },
4316 { { "v3" }, "r6" },
4317 { { "v4" }, "r7" },
4318 { { "v5" }, "r8" },
4319 { { "v6", "rfp" }, "r9" },
4320 { { "sl" }, "r10" },
4321 { { "fp" }, "r11" },
4322 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004323 { { "r13" }, "sp" },
4324 { { "r14" }, "lr" },
4325 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004326 // The S, D and Q registers overlap, but aren't really aliases; we
4327 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004328};
4329
4330void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4331 unsigned &NumAliases) const {
4332 Aliases = GCCRegAliases;
4333 NumAliases = llvm::array_lengthof(GCCRegAliases);
4334}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004335
4336const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004337#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004338#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004339 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004340#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004341
4342#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004343#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004344#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4345 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004346#include "clang/Basic/BuiltinsARM.def"
4347};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004348
4349class ARMleTargetInfo : public ARMTargetInfo {
4350public:
4351 ARMleTargetInfo(const llvm::Triple &Triple)
4352 : ARMTargetInfo(Triple, false) { }
4353 virtual void getTargetDefines(const LangOptions &Opts,
4354 MacroBuilder &Builder) const {
4355 Builder.defineMacro("__ARMEL__");
4356 ARMTargetInfo::getTargetDefines(Opts, Builder);
4357 }
4358};
4359
4360class ARMbeTargetInfo : public ARMTargetInfo {
4361public:
4362 ARMbeTargetInfo(const llvm::Triple &Triple)
4363 : ARMTargetInfo(Triple, true) { }
4364 virtual void getTargetDefines(const LangOptions &Opts,
4365 MacroBuilder &Builder) const {
4366 Builder.defineMacro("__ARMEB__");
4367 Builder.defineMacro("__ARM_BIG_ENDIAN");
4368 ARMTargetInfo::getTargetDefines(Opts, Builder);
4369 }
4370};
Chris Lattner17df24e2008-04-21 18:56:49 +00004371} // end anonymous namespace.
4372
Eli Friedmanf05b7722008-08-20 07:44:10 +00004373namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004374class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4375 const llvm::Triple Triple;
4376public:
4377 WindowsARMTargetInfo(const llvm::Triple &Triple)
4378 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4379 TLSSupported = false;
4380 WCharType = UnsignedShort;
4381 SizeType = UnsignedInt;
4382 UserLabelPrefix = "";
4383 }
4384 void getVisualStudioDefines(const LangOptions &Opts,
4385 MacroBuilder &Builder) const {
4386 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4387
4388 // FIXME: this is invalid for WindowsCE
4389 Builder.defineMacro("_M_ARM_NT", "1");
4390 Builder.defineMacro("_M_ARMT", "_M_ARM");
4391 Builder.defineMacro("_M_THUMB", "_M_ARM");
4392
4393 assert((Triple.getArch() == llvm::Triple::arm ||
4394 Triple.getArch() == llvm::Triple::thumb) &&
4395 "invalid architecture for Windows ARM target info");
4396 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4397 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4398
4399 // TODO map the complete set of values
4400 // 31: VFPv3 40: VFPv4
4401 Builder.defineMacro("_M_ARM_FP", "31");
4402 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004403 BuiltinVaListKind getBuiltinVaListKind() const override {
4404 return TargetInfo::CharPtrBuiltinVaList;
4405 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004406};
4407
4408// Windows ARM + Itanium C++ ABI Target
4409class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4410public:
4411 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4412 : WindowsARMTargetInfo(Triple) {
4413 TheCXXABI.set(TargetCXXABI::GenericARM);
4414 }
4415
4416 void getTargetDefines(const LangOptions &Opts,
4417 MacroBuilder &Builder) const override {
4418 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4419
4420 if (Opts.MSVCCompat)
4421 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4422 }
4423};
4424
4425// Windows ARM, MS (C++) ABI
4426class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4427public:
4428 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4429 : WindowsARMTargetInfo(Triple) {
4430 TheCXXABI.set(TargetCXXABI::Microsoft);
4431 }
4432
4433 void getTargetDefines(const LangOptions &Opts,
4434 MacroBuilder &Builder) const override {
4435 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4436 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4437 }
4438};
4439}
4440
4441
4442namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004443class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004444 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004445protected:
Craig Topper3164f332014-03-11 03:39:26 +00004446 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4447 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004448 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004449 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004450
Torok Edwinb2b37c62009-06-30 17:10:35 +00004451public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004452 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004453 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004454 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004455 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004456 // FIXME: This should be based off of the target features in
4457 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004458 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004459
4460 // Darwin on iOS uses a variant of the ARM C++ ABI.
4461 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004462 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004463};
4464} // end anonymous namespace.
4465
Tony Linthicum76329bf2011-12-12 21:14:55 +00004466
4467namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004468class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004469 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004470 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4471 static const char *const GCCRegNames[];
4472
James Molloy75f5f9e2014-04-16 15:33:48 +00004473 enum FPUModeEnum {
4474 FPUMode,
4475 NeonMode
4476 };
4477
4478 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004479 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004480 unsigned Crypto;
4481
Tim Northovera2ee4332014-03-29 15:09:45 +00004482 static const Builtin::Info BuiltinInfo[];
4483
4484 std::string ABI;
4485
4486public:
Tim Northover573cbee2014-05-24 12:52:07 +00004487 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004488 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004489
4490 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4491 WCharType = SignedInt;
4492
4493 // NetBSD apparently prefers consistency across ARM targets to consistency
4494 // across 64-bit targets.
4495 Int64Type = SignedLongLong;
4496 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004497 } else {
4498 WCharType = UnsignedInt;
4499 Int64Type = SignedLong;
4500 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004501 }
4502
Tim Northovera2ee4332014-03-29 15:09:45 +00004503 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004504 MaxVectorAlign = 128;
4505 RegParmMax = 8;
4506 MaxAtomicInlineWidth = 128;
4507 MaxAtomicPromoteWidth = 128;
4508
4509 LongDoubleWidth = LongDoubleAlign = 128;
4510 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4511
Tim Northovera2ee4332014-03-29 15:09:45 +00004512 // {} in inline assembly are neon specifiers, not assembly variant
4513 // specifiers.
4514 NoAsmVariants = true;
4515
Tim Northover573cbee2014-05-24 12:52:07 +00004516 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004517 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4518 }
4519
Alp Toker4925ba72014-06-07 23:30:42 +00004520 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004521 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004522 if (Name != "aapcs" && Name != "darwinpcs")
4523 return false;
4524
4525 ABI = Name;
4526 return true;
4527 }
4528
David Blaikie1cbb9712014-11-14 19:09:44 +00004529 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004530 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004531 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004532 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004533 .Case("cyclone", true)
4534 .Default(false);
4535 return CPUKnown;
4536 }
4537
4538 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004539 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004540 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004541 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004542
4543 // Target properties.
4544 Builder.defineMacro("_LP64");
4545 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004546
4547 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4548 Builder.defineMacro("__ARM_ACLE", "200");
4549 Builder.defineMacro("__ARM_ARCH", "8");
4550 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4551
4552 Builder.defineMacro("__ARM_64BIT_STATE");
4553 Builder.defineMacro("__ARM_PCS_AAPCS64");
4554 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4555
4556 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4557 Builder.defineMacro("__ARM_FEATURE_CLZ");
4558 Builder.defineMacro("__ARM_FEATURE_FMA");
4559 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004560 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4561 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4562 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4563 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004564
4565 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4566
4567 // 0xe implies support for half, single and double precision operations.
4568 Builder.defineMacro("__ARM_FP", "0xe");
4569
4570 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4571 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4572 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4573
4574 if (Opts.FastMath || Opts.FiniteMathOnly)
4575 Builder.defineMacro("__ARM_FP_FAST");
4576
Richard Smithab506ad2014-10-20 23:26:58 +00004577 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004578 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4579
4580 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4581
4582 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4583 Opts.ShortEnums ? "1" : "4");
4584
James Molloy75f5f9e2014-04-16 15:33:48 +00004585 if (FPU == NeonMode) {
4586 Builder.defineMacro("__ARM_NEON");
4587 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004588 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004589 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004590
Bradley Smith418c5932014-05-02 15:17:51 +00004591 if (CRC)
4592 Builder.defineMacro("__ARM_FEATURE_CRC32");
4593
James Molloy75f5f9e2014-04-16 15:33:48 +00004594 if (Crypto)
4595 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004596 }
4597
4598 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004599 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004600 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004601 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004602 }
4603
David Blaikie1cbb9712014-11-14 19:09:44 +00004604 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004605 return Feature == "aarch64" ||
4606 Feature == "arm64" ||
4607 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004608 }
4609
James Molloy5e73df52014-04-16 15:06:20 +00004610 bool handleTargetFeatures(std::vector<std::string> &Features,
4611 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004612 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004613 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004614 Crypto = 0;
4615 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4616 if (Features[i] == "+neon")
4617 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004618 if (Features[i] == "+crc")
4619 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004620 if (Features[i] == "+crypto")
4621 Crypto = 1;
4622 }
4623
James Molloy5e73df52014-04-16 15:06:20 +00004624 setDescriptionString();
4625
4626 return true;
4627 }
4628
David Blaikie1cbb9712014-11-14 19:09:44 +00004629 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004630
David Blaikie1cbb9712014-11-14 19:09:44 +00004631 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004632 return TargetInfo::AArch64ABIBuiltinVaList;
4633 }
4634
4635 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004636 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004637 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004638 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004639
Eric Christopher917e9522014-11-18 22:36:15 +00004640 virtual bool
4641 validateAsmConstraint(const char *&Name,
4642 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004643 switch (*Name) {
4644 default:
4645 return false;
4646 case 'w': // Floating point and SIMD registers (V0-V31)
4647 Info.setAllowsRegister();
4648 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004649 case 'I': // Constant that can be used with an ADD instruction
4650 case 'J': // Constant that can be used with a SUB instruction
4651 case 'K': // Constant that can be used with a 32-bit logical instruction
4652 case 'L': // Constant that can be used with a 64-bit logical instruction
4653 case 'M': // Constant that can be used as a 32-bit MOV immediate
4654 case 'N': // Constant that can be used as a 64-bit MOV immediate
4655 case 'Y': // Floating point constant zero
4656 case 'Z': // Integer constant zero
4657 return true;
4658 case 'Q': // A memory reference with base register and no offset
4659 Info.setAllowsMemory();
4660 return true;
4661 case 'S': // A symbolic address
4662 Info.setAllowsRegister();
4663 return true;
4664 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004665 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4666 // Utf: A memory address suitable for ldp/stp in TF mode.
4667 // Usa: An absolute symbolic address.
4668 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4669 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004670 case 'z': // Zero register, wzr or xzr
4671 Info.setAllowsRegister();
4672 return true;
4673 case 'x': // Floating point and SIMD registers (V0-V15)
4674 Info.setAllowsRegister();
4675 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004676 }
4677 return false;
4678 }
4679
Akira Hatanaka987f1862014-08-22 06:05:21 +00004680 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004681 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004682 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004683 // Strip off constraint modifiers.
4684 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4685 Constraint = Constraint.substr(1);
4686
4687 switch (Constraint[0]) {
4688 default:
4689 return true;
4690 case 'z':
4691 case 'r': {
4692 switch (Modifier) {
4693 case 'x':
4694 case 'w':
4695 // For now assume that the person knows what they're
4696 // doing with the modifier.
4697 return true;
4698 default:
4699 // By default an 'r' constraint will be in the 'x'
4700 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004701 if (Size == 64)
4702 return true;
4703
4704 SuggestedModifier = "w";
4705 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004706 }
4707 }
4708 }
4709 }
4710
David Blaikie1cbb9712014-11-14 19:09:44 +00004711 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004712
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004713 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004714 if (RegNo == 0)
4715 return 0;
4716 if (RegNo == 1)
4717 return 1;
4718 return -1;
4719 }
4720};
4721
Tim Northover573cbee2014-05-24 12:52:07 +00004722const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004723 // 32-bit Integer registers
4724 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4725 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4726 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4727
4728 // 64-bit Integer registers
4729 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4730 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4731 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4732
4733 // 32-bit floating point regsisters
4734 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4735 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4736 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4737
4738 // 64-bit floating point regsisters
4739 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4740 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4741 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4742
4743 // Vector registers
4744 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4745 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4746 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4747};
4748
Tim Northover573cbee2014-05-24 12:52:07 +00004749void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004750 unsigned &NumNames) const {
4751 Names = GCCRegNames;
4752 NumNames = llvm::array_lengthof(GCCRegNames);
4753}
4754
Tim Northover573cbee2014-05-24 12:52:07 +00004755const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004756 { { "w31" }, "wsp" },
4757 { { "x29" }, "fp" },
4758 { { "x30" }, "lr" },
4759 { { "x31" }, "sp" },
4760 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4761 // don't want to substitute one of these for a different-sized one.
4762};
4763
Tim Northover573cbee2014-05-24 12:52:07 +00004764void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004765 unsigned &NumAliases) const {
4766 Aliases = GCCRegAliases;
4767 NumAliases = llvm::array_lengthof(GCCRegAliases);
4768}
4769
Tim Northover573cbee2014-05-24 12:52:07 +00004770const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004771#define BUILTIN(ID, TYPE, ATTRS) \
4772 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4773#include "clang/Basic/BuiltinsNEON.def"
4774
4775#define BUILTIN(ID, TYPE, ATTRS) \
4776 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004777#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004778};
James Molloy5e73df52014-04-16 15:06:20 +00004779
Tim Northover573cbee2014-05-24 12:52:07 +00004780class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004781 void setDescriptionString() override {
4782 if (getTriple().isOSBinFormatMachO())
4783 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4784 else
4785 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4786 }
4787
4788public:
Tim Northover573cbee2014-05-24 12:52:07 +00004789 AArch64leTargetInfo(const llvm::Triple &Triple)
4790 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004791 BigEndian = false;
4792 }
4793 void getTargetDefines(const LangOptions &Opts,
4794 MacroBuilder &Builder) const override {
4795 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004796 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004797 }
4798};
4799
Tim Northover573cbee2014-05-24 12:52:07 +00004800class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004801 void setDescriptionString() override {
4802 assert(!getTriple().isOSBinFormatMachO());
4803 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4804 }
4805
4806public:
Tim Northover573cbee2014-05-24 12:52:07 +00004807 AArch64beTargetInfo(const llvm::Triple &Triple)
4808 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004809 void getTargetDefines(const LangOptions &Opts,
4810 MacroBuilder &Builder) const override {
4811 Builder.defineMacro("__AARCH64EB__");
4812 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4813 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004814 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004815 }
4816};
Tim Northovera2ee4332014-03-29 15:09:45 +00004817} // end anonymous namespace.
4818
4819namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004820class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004821protected:
4822 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4823 MacroBuilder &Builder) const override {
4824 Builder.defineMacro("__AARCH64_SIMD__");
4825 Builder.defineMacro("__ARM64_ARCH_8__");
4826 Builder.defineMacro("__ARM_NEON__");
4827 Builder.defineMacro("__LITTLE_ENDIAN__");
4828 Builder.defineMacro("__REGISTER_PREFIX__", "");
4829 Builder.defineMacro("__arm64", "1");
4830 Builder.defineMacro("__arm64__", "1");
4831
4832 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4833 }
4834
Tim Northovera2ee4332014-03-29 15:09:45 +00004835public:
Tim Northover573cbee2014-05-24 12:52:07 +00004836 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4837 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004838 Int64Type = SignedLongLong;
4839 WCharType = SignedInt;
4840 UseSignedCharForObjCBool = false;
4841
4842 LongDoubleWidth = LongDoubleAlign = 64;
4843 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4844
4845 TheCXXABI.set(TargetCXXABI::iOS64);
4846 }
4847
David Blaikie1cbb9712014-11-14 19:09:44 +00004848 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004849 return TargetInfo::CharPtrBuiltinVaList;
4850 }
4851};
4852} // end anonymous namespace
4853
4854namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004855// Hexagon abstract base class
4856class HexagonTargetInfo : public TargetInfo {
4857 static const Builtin::Info BuiltinInfo[];
4858 static const char * const GCCRegNames[];
4859 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4860 std::string CPU;
4861public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004862 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004863 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004864 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004865
4866 // {} in inline assembly are packet specifiers, not assembly variant
4867 // specifiers.
4868 NoAsmVariants = true;
4869 }
4870
Craig Topper3164f332014-03-11 03:39:26 +00004871 void getTargetBuiltins(const Builtin::Info *&Records,
4872 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004873 Records = BuiltinInfo;
4874 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4875 }
4876
Craig Topper3164f332014-03-11 03:39:26 +00004877 bool validateAsmConstraint(const char *&Name,
4878 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004879 return true;
4880 }
4881
Craig Topper3164f332014-03-11 03:39:26 +00004882 void getTargetDefines(const LangOptions &Opts,
4883 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004884
Craig Topper3164f332014-03-11 03:39:26 +00004885 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004886 return Feature == "hexagon";
4887 }
Craig Topper3164f332014-03-11 03:39:26 +00004888
4889 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004890 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004891 }
Craig Topper3164f332014-03-11 03:39:26 +00004892 void getGCCRegNames(const char * const *&Names,
4893 unsigned &NumNames) const override;
4894 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4895 unsigned &NumAliases) const override;
4896 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004897 return "";
4898 }
Sebastian Pop86500282012-01-13 20:37:10 +00004899
4900 static const char *getHexagonCPUSuffix(StringRef Name) {
4901 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004902 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004903 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004904 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004905 }
4906
Craig Topper3164f332014-03-11 03:39:26 +00004907 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004908 if (!getHexagonCPUSuffix(Name))
4909 return false;
4910
Tony Linthicum76329bf2011-12-12 21:14:55 +00004911 CPU = Name;
4912 return true;
4913 }
4914};
4915
4916void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4917 MacroBuilder &Builder) const {
4918 Builder.defineMacro("qdsp6");
4919 Builder.defineMacro("__qdsp6", "1");
4920 Builder.defineMacro("__qdsp6__", "1");
4921
4922 Builder.defineMacro("hexagon");
4923 Builder.defineMacro("__hexagon", "1");
4924 Builder.defineMacro("__hexagon__", "1");
4925
4926 if(CPU == "hexagonv1") {
4927 Builder.defineMacro("__HEXAGON_V1__");
4928 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4929 if(Opts.HexagonQdsp6Compat) {
4930 Builder.defineMacro("__QDSP6_V1__");
4931 Builder.defineMacro("__QDSP6_ARCH__", "1");
4932 }
4933 }
4934 else if(CPU == "hexagonv2") {
4935 Builder.defineMacro("__HEXAGON_V2__");
4936 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4937 if(Opts.HexagonQdsp6Compat) {
4938 Builder.defineMacro("__QDSP6_V2__");
4939 Builder.defineMacro("__QDSP6_ARCH__", "2");
4940 }
4941 }
4942 else if(CPU == "hexagonv3") {
4943 Builder.defineMacro("__HEXAGON_V3__");
4944 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4945 if(Opts.HexagonQdsp6Compat) {
4946 Builder.defineMacro("__QDSP6_V3__");
4947 Builder.defineMacro("__QDSP6_ARCH__", "3");
4948 }
4949 }
4950 else if(CPU == "hexagonv4") {
4951 Builder.defineMacro("__HEXAGON_V4__");
4952 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4953 if(Opts.HexagonQdsp6Compat) {
4954 Builder.defineMacro("__QDSP6_V4__");
4955 Builder.defineMacro("__QDSP6_ARCH__", "4");
4956 }
4957 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004958 else if(CPU == "hexagonv5") {
4959 Builder.defineMacro("__HEXAGON_V5__");
4960 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4961 if(Opts.HexagonQdsp6Compat) {
4962 Builder.defineMacro("__QDSP6_V5__");
4963 Builder.defineMacro("__QDSP6_ARCH__", "5");
4964 }
4965 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004966}
4967
4968const char * const HexagonTargetInfo::GCCRegNames[] = {
4969 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4970 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4971 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4972 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4973 "p0", "p1", "p2", "p3",
4974 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4975};
4976
4977void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4978 unsigned &NumNames) const {
4979 Names = GCCRegNames;
4980 NumNames = llvm::array_lengthof(GCCRegNames);
4981}
4982
4983
4984const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4985 { { "sp" }, "r29" },
4986 { { "fp" }, "r30" },
4987 { { "lr" }, "r31" },
4988 };
4989
4990void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4991 unsigned &NumAliases) const {
4992 Aliases = GCCRegAliases;
4993 NumAliases = llvm::array_lengthof(GCCRegAliases);
4994}
4995
4996
4997const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4998#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4999#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5000 ALL_LANGUAGES },
5001#include "clang/Basic/BuiltinsHexagon.def"
5002};
5003}
5004
5005
Chris Lattner5ba61f02006-10-14 07:39:34 +00005006namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005007// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5008class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005009 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5010 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005011 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005012public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005013 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005014
Craig Topper3164f332014-03-11 03:39:26 +00005015 bool handleTargetFeatures(std::vector<std::string> &Features,
5016 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005017 SoftFloat = false;
5018 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5019 if (Features[i] == "+soft-float")
5020 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005021 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005022 }
Craig Topper3164f332014-03-11 03:39:26 +00005023 void getTargetDefines(const LangOptions &Opts,
5024 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005025 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005026 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005027
5028 if (SoftFloat)
5029 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005030 }
Craig Topper3164f332014-03-11 03:39:26 +00005031
5032 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005033 return llvm::StringSwitch<bool>(Feature)
5034 .Case("softfloat", SoftFloat)
5035 .Case("sparc", true)
5036 .Default(false);
5037 }
Craig Topper3164f332014-03-11 03:39:26 +00005038
5039 void getTargetBuiltins(const Builtin::Info *&Records,
5040 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005041 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005042 }
Craig Topper3164f332014-03-11 03:39:26 +00005043 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005044 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005045 }
Craig Topper3164f332014-03-11 03:39:26 +00005046 void getGCCRegNames(const char * const *&Names,
5047 unsigned &NumNames) const override;
5048 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5049 unsigned &NumAliases) const override;
5050 bool validateAsmConstraint(const char *&Name,
5051 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005052 // FIXME: Implement!
5053 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005054 }
Craig Topper3164f332014-03-11 03:39:26 +00005055 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005056 // FIXME: Implement!
5057 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005058 }
5059};
5060
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005061const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005062 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5063 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5064 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5065 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5066};
5067
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005068void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5069 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005070 Names = GCCRegNames;
5071 NumNames = llvm::array_lengthof(GCCRegNames);
5072}
5073
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005074const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005075 { { "g0" }, "r0" },
5076 { { "g1" }, "r1" },
5077 { { "g2" }, "r2" },
5078 { { "g3" }, "r3" },
5079 { { "g4" }, "r4" },
5080 { { "g5" }, "r5" },
5081 { { "g6" }, "r6" },
5082 { { "g7" }, "r7" },
5083 { { "o0" }, "r8" },
5084 { { "o1" }, "r9" },
5085 { { "o2" }, "r10" },
5086 { { "o3" }, "r11" },
5087 { { "o4" }, "r12" },
5088 { { "o5" }, "r13" },
5089 { { "o6", "sp" }, "r14" },
5090 { { "o7" }, "r15" },
5091 { { "l0" }, "r16" },
5092 { { "l1" }, "r17" },
5093 { { "l2" }, "r18" },
5094 { { "l3" }, "r19" },
5095 { { "l4" }, "r20" },
5096 { { "l5" }, "r21" },
5097 { { "l6" }, "r22" },
5098 { { "l7" }, "r23" },
5099 { { "i0" }, "r24" },
5100 { { "i1" }, "r25" },
5101 { { "i2" }, "r26" },
5102 { { "i3" }, "r27" },
5103 { { "i4" }, "r28" },
5104 { { "i5" }, "r29" },
5105 { { "i6", "fp" }, "r30" },
5106 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005107};
5108
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005109void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5110 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005111 Aliases = GCCRegAliases;
5112 NumAliases = llvm::array_lengthof(GCCRegAliases);
5113}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005114
5115// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5116class SparcV8TargetInfo : public SparcTargetInfo {
5117public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005118 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005119 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005120 }
5121
Craig Topper3164f332014-03-11 03:39:26 +00005122 void getTargetDefines(const LangOptions &Opts,
5123 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005124 SparcTargetInfo::getTargetDefines(Opts, Builder);
5125 Builder.defineMacro("__sparcv8");
5126 }
5127};
5128
5129// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5130class SparcV9TargetInfo : public SparcTargetInfo {
5131public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005132 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005133 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005134 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005135 // This is an LP64 platform.
5136 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005137
5138 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005139 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005140 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005141 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005142 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005143 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005144
5145 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5146 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5147 LongDoubleWidth = 128;
5148 LongDoubleAlign = 128;
5149 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005150 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005151 }
5152
Craig Topper3164f332014-03-11 03:39:26 +00005153 void getTargetDefines(const LangOptions &Opts,
5154 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005155 SparcTargetInfo::getTargetDefines(Opts, Builder);
5156 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005157 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005158 // Solaris doesn't need these variants, but the BSDs do.
5159 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005160 Builder.defineMacro("__sparc64__");
5161 Builder.defineMacro("__sparc_v9__");
5162 Builder.defineMacro("__sparcv9__");
5163 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005164 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005165
Craig Topper3164f332014-03-11 03:39:26 +00005166 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005167 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5168 .Case("v9", true)
5169 .Case("ultrasparc", true)
5170 .Case("ultrasparc3", true)
5171 .Case("niagara", true)
5172 .Case("niagara2", true)
5173 .Case("niagara3", true)
5174 .Case("niagara4", true)
5175 .Default(false);
5176
5177 // No need to store the CPU yet. There aren't any CPU-specific
5178 // macros to define.
5179 return CPUKnown;
5180 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005181};
5182
Gabor Greif49991682008-02-21 16:29:08 +00005183} // end anonymous namespace.
5184
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005185namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005186class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005188 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5189 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005190 SizeType = UnsignedInt;
5191 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005192 }
5193};
5194} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005195
Chris Lattnerb781dc792008-05-08 05:58:21 +00005196namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005197class SystemZTargetInfo : public TargetInfo {
5198 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005199
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005200public:
5201 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5202 TLSSupported = true;
5203 IntWidth = IntAlign = 32;
5204 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5205 PointerWidth = PointerAlign = 64;
5206 LongDoubleWidth = 128;
5207 LongDoubleAlign = 64;
5208 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5209 MinGlobalAlign = 16;
5210 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5211 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5212 }
5213 void getTargetDefines(const LangOptions &Opts,
5214 MacroBuilder &Builder) const override {
5215 Builder.defineMacro("__s390__");
5216 Builder.defineMacro("__s390x__");
5217 Builder.defineMacro("__zarch__");
5218 Builder.defineMacro("__LONG_DOUBLE_128__");
5219 }
5220 void getTargetBuiltins(const Builtin::Info *&Records,
5221 unsigned &NumRecords) const override {
5222 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005223 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005224 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005225 }
5226
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005227 void getGCCRegNames(const char *const *&Names,
5228 unsigned &NumNames) const override;
5229 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5230 unsigned &NumAliases) const override {
5231 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005232 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005233 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005234 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005235 bool validateAsmConstraint(const char *&Name,
5236 TargetInfo::ConstraintInfo &info) const override;
5237 const char *getClobbers() const override {
5238 // FIXME: Is this really right?
5239 return "";
5240 }
5241 BuiltinVaListKind getBuiltinVaListKind() const override {
5242 return TargetInfo::SystemZBuiltinVaList;
5243 }
5244 bool setCPU(const std::string &Name) override {
5245 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5246 .Case("z10", true)
5247 .Case("z196", true)
5248 .Case("zEC12", true)
5249 .Default(false);
5250
5251 // No need to store the CPU yet. There aren't any CPU-specific
5252 // macros to define.
5253 return CPUKnown;
5254 }
5255};
5256
5257const char *const SystemZTargetInfo::GCCRegNames[] = {
5258 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5259 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5260 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5261 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5262};
5263
5264void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5265 unsigned &NumNames) const {
5266 Names = GCCRegNames;
5267 NumNames = llvm::array_lengthof(GCCRegNames);
5268}
5269
5270bool SystemZTargetInfo::
5271validateAsmConstraint(const char *&Name,
5272 TargetInfo::ConstraintInfo &Info) const {
5273 switch (*Name) {
5274 default:
5275 return false;
5276
5277 case 'a': // Address register
5278 case 'd': // Data register (equivalent to 'r')
5279 case 'f': // Floating-point register
5280 Info.setAllowsRegister();
5281 return true;
5282
5283 case 'I': // Unsigned 8-bit constant
5284 case 'J': // Unsigned 12-bit constant
5285 case 'K': // Signed 16-bit constant
5286 case 'L': // Signed 20-bit displacement (on all targets we support)
5287 case 'M': // 0x7fffffff
5288 return true;
5289
5290 case 'Q': // Memory with base and unsigned 12-bit displacement
5291 case 'R': // Likewise, plus an index
5292 case 'S': // Memory with base and signed 20-bit displacement
5293 case 'T': // Likewise, plus an index
5294 Info.setAllowsMemory();
5295 return true;
5296 }
5297}
Ulrich Weigand47445072013-05-06 16:26:41 +00005298}
5299
5300namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005301 class MSP430TargetInfo : public TargetInfo {
5302 static const char * const GCCRegNames[];
5303 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005304 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005305 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005306 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005307 IntWidth = 16; IntAlign = 16;
5308 LongWidth = 32; LongLongWidth = 64;
5309 LongAlign = LongLongAlign = 16;
5310 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005311 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005312 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005313 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005314 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005315 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005316 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005317 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005318 }
5319 void getTargetDefines(const LangOptions &Opts,
5320 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005321 Builder.defineMacro("MSP430");
5322 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005323 // FIXME: defines for different 'flavours' of MCU
5324 }
Craig Topper3164f332014-03-11 03:39:26 +00005325 void getTargetBuiltins(const Builtin::Info *&Records,
5326 unsigned &NumRecords) const override {
5327 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005328 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005329 NumRecords = 0;
5330 }
Craig Topper3164f332014-03-11 03:39:26 +00005331 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005332 return Feature == "msp430";
5333 }
Craig Topper3164f332014-03-11 03:39:26 +00005334 void getGCCRegNames(const char * const *&Names,
5335 unsigned &NumNames) const override;
5336 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5337 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005338 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005339 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005340 NumAliases = 0;
5341 }
Eric Christopher917e9522014-11-18 22:36:15 +00005342 bool
5343 validateAsmConstraint(const char *&Name,
5344 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005345 // No target constraints for now.
5346 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005347 }
Craig Topper3164f332014-03-11 03:39:26 +00005348 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005349 // FIXME: Is this really right?
5350 return "";
5351 }
Craig Topper3164f332014-03-11 03:39:26 +00005352 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005353 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005354 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005355 }
5356 };
5357
5358 const char * const MSP430TargetInfo::GCCRegNames[] = {
5359 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5360 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5361 };
5362
5363 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5364 unsigned &NumNames) const {
5365 Names = GCCRegNames;
5366 NumNames = llvm::array_lengthof(GCCRegNames);
5367 }
5368}
5369
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005370namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005371
Mike Stump11289f42009-09-09 15:08:12 +00005372 // LLVM and Clang cannot be used directly to output native binaries for
5373 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005374 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005375 //
5376 // TCE uses the llvm bitcode as input and uses it for generating customized
5377 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005378 // publicly available in http://tce.cs.tut.fi
5379
Eli Friedman1f191002011-10-07 19:51:42 +00005380 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5381 3, // opencl_global
5382 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005383 5, // opencl_constant
5384 0, // cuda_device
5385 0, // cuda_constant
5386 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005387 };
5388
Eli Friedmana9c3d712009-08-19 20:47:07 +00005389 class TCETargetInfo : public TargetInfo{
5390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005391 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005392 TLSSupported = false;
5393 IntWidth = 32;
5394 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005395 PointerWidth = 32;
5396 IntAlign = 32;
5397 LongAlign = LongLongAlign = 32;
5398 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005399 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005400 SizeType = UnsignedInt;
5401 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005402 IntPtrType = SignedInt;
5403 PtrDiffType = SignedInt;
5404 FloatWidth = 32;
5405 FloatAlign = 32;
5406 DoubleWidth = 32;
5407 DoubleAlign = 32;
5408 LongDoubleWidth = 32;
5409 LongDoubleAlign = 32;
5410 FloatFormat = &llvm::APFloat::IEEEsingle;
5411 DoubleFormat = &llvm::APFloat::IEEEsingle;
5412 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005413 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5414 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005415 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005416 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005417 }
5418
Craig Topper3164f332014-03-11 03:39:26 +00005419 void getTargetDefines(const LangOptions &Opts,
5420 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005421 DefineStd(Builder, "tce", Opts);
5422 Builder.defineMacro("__TCE__");
5423 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005424 }
Craig Topper3164f332014-03-11 03:39:26 +00005425 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005426 return Feature == "tce";
5427 }
Craig Topper3164f332014-03-11 03:39:26 +00005428
5429 void getTargetBuiltins(const Builtin::Info *&Records,
5430 unsigned &NumRecords) const override {}
5431 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005432 return "";
5433 }
Craig Topper3164f332014-03-11 03:39:26 +00005434 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005435 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005436 }
Craig Topper3164f332014-03-11 03:39:26 +00005437 void getGCCRegNames(const char * const *&Names,
5438 unsigned &NumNames) const override {}
5439 bool validateAsmConstraint(const char *&Name,
5440 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005441 return true;
5442 }
Craig Topper3164f332014-03-11 03:39:26 +00005443 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5444 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005445 };
5446}
5447
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005448namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005449class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005450 virtual void setDescriptionString() = 0;
5451
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005452 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005453 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005454 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005455 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005456 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005457 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005458 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005459 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005460 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005461 enum DspRevEnum {
5462 NoDSP, DSP1, DSP2
5463 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005464 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005465
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005466protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005467 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005468 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005469
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005470public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005471 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5472 const std::string &CPUStr)
5473 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005474 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005475 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005476
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005477 bool isNaN2008Default() const {
5478 return CPU == "mips32r6" || CPU == "mips64r6";
5479 }
5480
5481 bool isFP64Default() const {
5482 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5483 }
5484
Alp Toker4925ba72014-06-07 23:30:42 +00005485 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005486 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005487 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5488 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005489 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005490 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005491 .Case("mips1", IsMips32)
5492 .Case("mips2", IsMips32)
5493 .Case("mips3", true)
5494 .Case("mips4", true)
5495 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005496 .Case("mips32", IsMips32)
5497 .Case("mips32r2", IsMips32)
5498 .Case("mips32r6", IsMips32)
5499 .Case("mips64", true)
5500 .Case("mips64r2", true)
5501 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005502 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005503 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005504 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005505 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005506 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005507 // The backend enables certain ABI's by default according to the
5508 // architecture.
5509 // Disable both possible defaults so that we don't end up with multiple
5510 // ABI's selected and trigger an assertion.
5511 Features["o32"] = false;
5512 Features["n64"] = false;
5513
Eric Christopher0b26a612010-03-02 02:41:08 +00005514 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005515 if (CPU == "octeon")
5516 Features["mips64r2"] = Features["cnmips"] = true;
5517 else
5518 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005519 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005520
Craig Topper3164f332014-03-11 03:39:26 +00005521 void getTargetDefines(const LangOptions &Opts,
5522 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005523 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005524 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005525 if (Opts.GNUMode)
5526 Builder.defineMacro("mips");
5527
Simon Atanasyan683535b2012-08-29 19:14:58 +00005528 Builder.defineMacro("__REGISTER_PREFIX__", "");
5529
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005530 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005531 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005532 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005533 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005534 case SoftFloat:
5535 Builder.defineMacro("__mips_soft_float", Twine(1));
5536 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005537 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005538
Simon Atanasyan16071912013-04-14 14:07:30 +00005539 if (IsSingleFloat)
5540 Builder.defineMacro("__mips_single_float", Twine(1));
5541
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005542 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5543 Builder.defineMacro("_MIPS_FPSET",
5544 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5545
Simon Atanasyan72244b62012-07-05 16:06:06 +00005546 if (IsMips16)
5547 Builder.defineMacro("__mips16", Twine(1));
5548
Simon Atanasyan60777612013-04-14 14:07:51 +00005549 if (IsMicromips)
5550 Builder.defineMacro("__mips_micromips", Twine(1));
5551
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005552 if (IsNan2008)
5553 Builder.defineMacro("__mips_nan2008", Twine(1));
5554
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005555 switch (DspRev) {
5556 default:
5557 break;
5558 case DSP1:
5559 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5560 Builder.defineMacro("__mips_dsp", Twine(1));
5561 break;
5562 case DSP2:
5563 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5564 Builder.defineMacro("__mips_dspr2", Twine(1));
5565 Builder.defineMacro("__mips_dsp", Twine(1));
5566 break;
5567 }
5568
Jack Carter44ff1e52013-08-12 17:20:29 +00005569 if (HasMSA)
5570 Builder.defineMacro("__mips_msa", Twine(1));
5571
Simon Atanasyan26f19672012-04-05 19:28:31 +00005572 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5573 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5574 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005575
5576 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5577 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005578 }
5579
Craig Topper3164f332014-03-11 03:39:26 +00005580 void getTargetBuiltins(const Builtin::Info *&Records,
5581 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005582 Records = BuiltinInfo;
5583 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005584 }
Craig Topper3164f332014-03-11 03:39:26 +00005585 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005586 return llvm::StringSwitch<bool>(Feature)
5587 .Case("mips", true)
5588 .Case("fp64", HasFP64)
5589 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005590 }
Craig Topper3164f332014-03-11 03:39:26 +00005591 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005592 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005593 }
Craig Topper3164f332014-03-11 03:39:26 +00005594 void getGCCRegNames(const char * const *&Names,
5595 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005596 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005597 // CPU register names
5598 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005599 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5600 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5601 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005602 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5603 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005604 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5605 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5606 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5607 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005608 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005609 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005610 "$fcc5","$fcc6","$fcc7",
5611 // MSA register names
5612 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5613 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5614 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5615 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5616 // MSA control register names
5617 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5618 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005619 };
5620 Names = GCCRegNames;
5621 NumNames = llvm::array_lengthof(GCCRegNames);
5622 }
Craig Topper3164f332014-03-11 03:39:26 +00005623 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5624 unsigned &NumAliases) const override = 0;
5625 bool validateAsmConstraint(const char *&Name,
5626 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005627 switch (*Name) {
5628 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005629 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005630 case 'r': // CPU registers.
5631 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005632 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005633 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005634 case 'c': // $25 for indirect jumps
5635 case 'l': // lo register
5636 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005637 Info.setAllowsRegister();
5638 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005639 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005640 Info.setAllowsMemory();
5641 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005642 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005643 }
5644
Craig Topper3164f332014-03-11 03:39:26 +00005645 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005646 // FIXME: Implement!
5647 return "";
5648 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005649
Craig Topper3164f332014-03-11 03:39:26 +00005650 bool handleTargetFeatures(std::vector<std::string> &Features,
5651 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005652 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005653 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005654 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005655 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005656 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005657 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005658 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005659
5660 for (std::vector<std::string>::iterator it = Features.begin(),
5661 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005662 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005663 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005664 else if (*it == "+soft-float")
5665 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005666 else if (*it == "+mips16")
5667 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005668 else if (*it == "+micromips")
5669 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005670 else if (*it == "+dsp")
5671 DspRev = std::max(DspRev, DSP1);
5672 else if (*it == "+dspr2")
5673 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005674 else if (*it == "+msa")
5675 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005676 else if (*it == "+fp64")
5677 HasFP64 = true;
5678 else if (*it == "-fp64")
5679 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005680 else if (*it == "+nan2008")
5681 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005682 else if (*it == "-nan2008")
5683 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005684 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005685
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005686 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005687 std::vector<std::string>::iterator it =
5688 std::find(Features.begin(), Features.end(), "+soft-float");
5689 if (it != Features.end())
5690 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005691
Akira Hatanaka9064e362013-10-29 18:30:33 +00005692 setDescriptionString();
5693
Rafael Espindolaeb265472013-08-21 21:59:03 +00005694 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005695 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005696
Craig Topper3164f332014-03-11 03:39:26 +00005697 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005698 if (RegNo == 0) return 4;
5699 if (RegNo == 1) return 5;
5700 return -1;
5701 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005702
5703 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005704};
5705
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005706const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5707#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5708#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5709 ALL_LANGUAGES },
5710#include "clang/Basic/BuiltinsMips.def"
5711};
5712
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005713class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005714public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005715 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005716 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005717 SizeType = UnsignedInt;
5718 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005719 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005720 }
Craig Topper3164f332014-03-11 03:39:26 +00005721 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005722 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005723 ABI = Name;
5724 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005725 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005726 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005727 }
Craig Topper3164f332014-03-11 03:39:26 +00005728 void getTargetDefines(const LangOptions &Opts,
5729 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005730 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005731
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005732 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005733 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5734
5735 const std::string& CPUStr = getCPU();
5736 if (CPUStr == "mips32")
5737 Builder.defineMacro("__mips_isa_rev", "1");
5738 else if (CPUStr == "mips32r2")
5739 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005740
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005741 if (ABI == "o32") {
5742 Builder.defineMacro("__mips_o32");
5743 Builder.defineMacro("_ABIO32", "1");
5744 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5745 }
5746 else if (ABI == "eabi")
5747 Builder.defineMacro("__mips_eabi");
5748 else
David Blaikie83d382b2011-09-23 05:06:16 +00005749 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005750 }
Craig Topper3164f332014-03-11 03:39:26 +00005751 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5752 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005753 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5754 { { "at" }, "$1" },
5755 { { "v0" }, "$2" },
5756 { { "v1" }, "$3" },
5757 { { "a0" }, "$4" },
5758 { { "a1" }, "$5" },
5759 { { "a2" }, "$6" },
5760 { { "a3" }, "$7" },
5761 { { "t0" }, "$8" },
5762 { { "t1" }, "$9" },
5763 { { "t2" }, "$10" },
5764 { { "t3" }, "$11" },
5765 { { "t4" }, "$12" },
5766 { { "t5" }, "$13" },
5767 { { "t6" }, "$14" },
5768 { { "t7" }, "$15" },
5769 { { "s0" }, "$16" },
5770 { { "s1" }, "$17" },
5771 { { "s2" }, "$18" },
5772 { { "s3" }, "$19" },
5773 { { "s4" }, "$20" },
5774 { { "s5" }, "$21" },
5775 { { "s6" }, "$22" },
5776 { { "s7" }, "$23" },
5777 { { "t8" }, "$24" },
5778 { { "t9" }, "$25" },
5779 { { "k0" }, "$26" },
5780 { { "k1" }, "$27" },
5781 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005782 { { "sp","$sp" }, "$29" },
5783 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005784 { { "ra" }, "$31" }
5785 };
5786 Aliases = GCCRegAliases;
5787 NumAliases = llvm::array_lengthof(GCCRegAliases);
5788 }
5789};
5790
5791class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005792 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005793 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005794 }
5795
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005796public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005797 Mips32EBTargetInfo(const llvm::Triple &Triple)
5798 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +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, "MIPSEB", Opts);
5803 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005804 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005805 }
5806};
5807
5808class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005809 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005810 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005811 }
5812
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005813public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005814 Mips32ELTargetInfo(const llvm::Triple &Triple)
5815 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005816 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005817 }
Craig Topper3164f332014-03-11 03:39:26 +00005818 void getTargetDefines(const LangOptions &Opts,
5819 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005820 DefineStd(Builder, "MIPSEL", Opts);
5821 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005822 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005823 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005824};
Akira Hatanakabef17452011-09-20 19:21:49 +00005825
5826class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005827public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005828 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005829 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005830 LongDoubleWidth = LongDoubleAlign = 128;
5831 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005832 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5833 LongDoubleWidth = LongDoubleAlign = 64;
5834 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5835 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005836 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005837 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005838 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005839 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005840
5841 void setN64ABITypes() {
5842 LongWidth = LongAlign = 64;
5843 PointerWidth = PointerAlign = 64;
5844 SizeType = UnsignedLong;
5845 PtrDiffType = SignedLong;
5846 }
5847
5848 void setN32ABITypes() {
5849 LongWidth = LongAlign = 32;
5850 PointerWidth = PointerAlign = 32;
5851 SizeType = UnsignedInt;
5852 PtrDiffType = SignedInt;
5853 }
5854
Craig Topper3164f332014-03-11 03:39:26 +00005855 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005856 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005857 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005858 ABI = Name;
5859 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005860 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005861 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005862 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005863 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005864 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005865 }
5866 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005867 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005868
Craig Topper3164f332014-03-11 03:39:26 +00005869 void getTargetDefines(const LangOptions &Opts,
5870 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005871 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005872
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005873 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005874 Builder.defineMacro("__mips64");
5875 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005876 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5877
5878 const std::string& CPUStr = getCPU();
5879 if (CPUStr == "mips64")
5880 Builder.defineMacro("__mips_isa_rev", "1");
5881 else if (CPUStr == "mips64r2")
5882 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005883
Akira Hatanakabef17452011-09-20 19:21:49 +00005884 if (ABI == "n32") {
5885 Builder.defineMacro("__mips_n32");
5886 Builder.defineMacro("_ABIN32", "2");
5887 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5888 }
5889 else if (ABI == "n64") {
5890 Builder.defineMacro("__mips_n64");
5891 Builder.defineMacro("_ABI64", "3");
5892 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5893 }
5894 else
David Blaikie83d382b2011-09-23 05:06:16 +00005895 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005896 }
Craig Topper3164f332014-03-11 03:39:26 +00005897 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5898 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005899 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5900 { { "at" }, "$1" },
5901 { { "v0" }, "$2" },
5902 { { "v1" }, "$3" },
5903 { { "a0" }, "$4" },
5904 { { "a1" }, "$5" },
5905 { { "a2" }, "$6" },
5906 { { "a3" }, "$7" },
5907 { { "a4" }, "$8" },
5908 { { "a5" }, "$9" },
5909 { { "a6" }, "$10" },
5910 { { "a7" }, "$11" },
5911 { { "t0" }, "$12" },
5912 { { "t1" }, "$13" },
5913 { { "t2" }, "$14" },
5914 { { "t3" }, "$15" },
5915 { { "s0" }, "$16" },
5916 { { "s1" }, "$17" },
5917 { { "s2" }, "$18" },
5918 { { "s3" }, "$19" },
5919 { { "s4" }, "$20" },
5920 { { "s5" }, "$21" },
5921 { { "s6" }, "$22" },
5922 { { "s7" }, "$23" },
5923 { { "t8" }, "$24" },
5924 { { "t9" }, "$25" },
5925 { { "k0" }, "$26" },
5926 { { "k1" }, "$27" },
5927 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005928 { { "sp","$sp" }, "$29" },
5929 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005930 { { "ra" }, "$31" }
5931 };
5932 Aliases = GCCRegAliases;
5933 NumAliases = llvm::array_lengthof(GCCRegAliases);
5934 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005935
5936 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005937};
5938
5939class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005940 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005941 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005942 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 +00005943 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005944 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005945
Akira Hatanakabef17452011-09-20 19:21:49 +00005946 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005947
Akira Hatanakabef17452011-09-20 19:21:49 +00005948public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005949 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005950 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005951 void getTargetDefines(const LangOptions &Opts,
5952 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005953 DefineStd(Builder, "MIPSEB", Opts);
5954 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005955 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005956 }
5957};
5958
5959class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005960 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005961 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005962 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 +00005963 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005964 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005965 }
5966public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005967 Mips64ELTargetInfo(const llvm::Triple &Triple)
5968 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005969 // Default ABI is n64.
5970 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005971 }
Craig Topper3164f332014-03-11 03:39:26 +00005972 void getTargetDefines(const LangOptions &Opts,
5973 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005974 DefineStd(Builder, "MIPSEL", Opts);
5975 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005976 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005977 }
5978};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005979} // end anonymous namespace.
5980
Ivan Krasindd7403e2011-08-24 20:22:22 +00005981namespace {
5982class PNaClTargetInfo : public TargetInfo {
5983public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005984 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005985 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005986 this->UserLabelPrefix = "";
5987 this->LongAlign = 32;
5988 this->LongWidth = 32;
5989 this->PointerAlign = 32;
5990 this->PointerWidth = 32;
5991 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005992 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005993 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005994 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005995 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005996 this->SizeType = TargetInfo::UnsignedInt;
5997 this->PtrDiffType = TargetInfo::SignedInt;
5998 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005999 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006000 }
6001
Craig Topper3164f332014-03-11 03:39:26 +00006002 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006003 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006004 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006005 Builder.defineMacro("__le32__");
6006 Builder.defineMacro("__pnacl__");
6007 }
Craig Topper3164f332014-03-11 03:39:26 +00006008 void getTargetDefines(const LangOptions &Opts,
6009 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006010 getArchDefines(Opts, Builder);
6011 }
Craig Topper3164f332014-03-11 03:39:26 +00006012 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006013 return Feature == "pnacl";
6014 }
Craig Topper3164f332014-03-11 03:39:26 +00006015 void getTargetBuiltins(const Builtin::Info *&Records,
6016 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006017 }
Craig Topper3164f332014-03-11 03:39:26 +00006018 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006019 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006020 }
Craig Topper3164f332014-03-11 03:39:26 +00006021 void getGCCRegNames(const char * const *&Names,
6022 unsigned &NumNames) const override;
6023 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6024 unsigned &NumAliases) const override;
6025 bool validateAsmConstraint(const char *&Name,
6026 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006027 return false;
6028 }
6029
Craig Topper3164f332014-03-11 03:39:26 +00006030 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006031 return "";
6032 }
6033};
6034
6035void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6036 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006037 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006038 NumNames = 0;
6039}
6040
6041void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6042 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006043 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006044 NumAliases = 0;
6045}
6046} // end anonymous namespace.
6047
Guy Benyeib798fc92012-12-11 21:38:14 +00006048namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006049class Le64TargetInfo : public TargetInfo {
6050 static const Builtin::Info BuiltinInfo[];
6051
6052public:
6053 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6054 BigEndian = false;
6055 NoAsmVariants = true;
6056 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6057 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6058 DescriptionString =
6059 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6060 }
6061
6062 void getTargetDefines(const LangOptions &Opts,
6063 MacroBuilder &Builder) const override {
6064 DefineStd(Builder, "unix", Opts);
6065 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6066 Builder.defineMacro("__ELF__");
6067 }
6068 void getTargetBuiltins(const Builtin::Info *&Records,
6069 unsigned &NumRecords) const override {
6070 Records = BuiltinInfo;
6071 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6072 }
6073 BuiltinVaListKind getBuiltinVaListKind() const override {
6074 return TargetInfo::PNaClABIBuiltinVaList;
6075 }
6076 const char *getClobbers() const override { return ""; }
6077 void getGCCRegNames(const char *const *&Names,
6078 unsigned &NumNames) const override {
6079 Names = nullptr;
6080 NumNames = 0;
6081 }
6082 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6083 unsigned &NumAliases) const override {
6084 Aliases = nullptr;
6085 NumAliases = 0;
6086 }
6087 bool validateAsmConstraint(const char *&Name,
6088 TargetInfo::ConstraintInfo &Info) const override {
6089 return false;
6090 }
6091
6092 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006093};
6094} // end anonymous namespace.
6095
6096const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6097#define BUILTIN(ID, TYPE, ATTRS) \
6098 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6099#include "clang/Basic/BuiltinsLe64.def"
6100};
6101
6102namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006103 static const unsigned SPIRAddrSpaceMap[] = {
6104 1, // opencl_global
6105 3, // opencl_local
6106 2, // opencl_constant
6107 0, // cuda_device
6108 0, // cuda_constant
6109 0 // cuda_shared
6110 };
6111 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006112 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006113 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006114 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6115 "SPIR target must use unknown OS");
6116 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6117 "SPIR target must use unknown environment type");
6118 BigEndian = false;
6119 TLSSupported = false;
6120 LongWidth = LongAlign = 64;
6121 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006122 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006123 // Define available target features
6124 // These must be defined in sorted order!
6125 NoAsmVariants = true;
6126 }
Craig Topper3164f332014-03-11 03:39:26 +00006127 void getTargetDefines(const LangOptions &Opts,
6128 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006129 DefineStd(Builder, "SPIR", Opts);
6130 }
Craig Topper3164f332014-03-11 03:39:26 +00006131 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006132 return Feature == "spir";
6133 }
Craig Topper3164f332014-03-11 03:39:26 +00006134
6135 void getTargetBuiltins(const Builtin::Info *&Records,
6136 unsigned &NumRecords) const override {}
6137 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006138 return "";
6139 }
Craig Topper3164f332014-03-11 03:39:26 +00006140 void getGCCRegNames(const char * const *&Names,
6141 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006142 bool
6143 validateAsmConstraint(const char *&Name,
6144 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006145 return true;
6146 }
Craig Topper3164f332014-03-11 03:39:26 +00006147 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6148 unsigned &NumAliases) const override {}
6149 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006150 return TargetInfo::VoidPtrBuiltinVaList;
6151 }
6152 };
6153
6154
6155 class SPIR32TargetInfo : public SPIRTargetInfo {
6156 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006157 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006158 PointerWidth = PointerAlign = 32;
6159 SizeType = TargetInfo::UnsignedInt;
6160 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6161 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006162 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6163 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006164 }
Craig Topper3164f332014-03-11 03:39:26 +00006165 void getTargetDefines(const LangOptions &Opts,
6166 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006167 DefineStd(Builder, "SPIR32", Opts);
6168 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006169 };
6170
6171 class SPIR64TargetInfo : public SPIRTargetInfo {
6172 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006173 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006174 PointerWidth = PointerAlign = 64;
6175 SizeType = TargetInfo::UnsignedLong;
6176 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006177 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6178 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006179 }
Craig Topper3164f332014-03-11 03:39:26 +00006180 void getTargetDefines(const LangOptions &Opts,
6181 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006182 DefineStd(Builder, "SPIR64", Opts);
6183 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006184 };
6185}
6186
Robert Lytton0e076492013-08-13 09:43:10 +00006187namespace {
6188class XCoreTargetInfo : public TargetInfo {
6189 static const Builtin::Info BuiltinInfo[];
6190public:
6191 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6192 BigEndian = false;
6193 NoAsmVariants = true;
6194 LongLongAlign = 32;
6195 SuitableAlign = 32;
6196 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006197 SizeType = UnsignedInt;
6198 PtrDiffType = SignedInt;
6199 IntPtrType = SignedInt;
6200 WCharType = UnsignedChar;
6201 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006202 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006203 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 +00006204 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006205 }
Craig Topper3164f332014-03-11 03:39:26 +00006206 void getTargetDefines(const LangOptions &Opts,
6207 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006208 Builder.defineMacro("__XS1B__");
6209 }
Craig Topper3164f332014-03-11 03:39:26 +00006210 void getTargetBuiltins(const Builtin::Info *&Records,
6211 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006212 Records = BuiltinInfo;
6213 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6214 }
Craig Topper3164f332014-03-11 03:39:26 +00006215 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006216 return TargetInfo::VoidPtrBuiltinVaList;
6217 }
Craig Topper3164f332014-03-11 03:39:26 +00006218 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006219 return "";
6220 }
Craig Topper3164f332014-03-11 03:39:26 +00006221 void getGCCRegNames(const char * const *&Names,
6222 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006223 static const char * const GCCRegNames[] = {
6224 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6225 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6226 };
6227 Names = GCCRegNames;
6228 NumNames = llvm::array_lengthof(GCCRegNames);
6229 }
Craig Topper3164f332014-03-11 03:39:26 +00006230 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6231 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006232 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006233 NumAliases = 0;
6234 }
Craig Topper3164f332014-03-11 03:39:26 +00006235 bool validateAsmConstraint(const char *&Name,
6236 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006237 return false;
6238 }
Craig Topper3164f332014-03-11 03:39:26 +00006239 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006240 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6241 return (RegNo < 2)? RegNo : -1;
6242 }
Robert Lytton0e076492013-08-13 09:43:10 +00006243};
6244
6245const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6246#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6247#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6248 ALL_LANGUAGES },
6249#include "clang/Basic/BuiltinsXCore.def"
6250};
6251} // end anonymous namespace.
6252
Ivan Krasindd7403e2011-08-24 20:22:22 +00006253
Chris Lattner5ba61f02006-10-14 07:39:34 +00006254//===----------------------------------------------------------------------===//
6255// Driver code
6256//===----------------------------------------------------------------------===//
6257
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006258static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006259 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006260
Daniel Dunbar52322032009-08-18 05:47:58 +00006261 switch (Triple.getArch()) {
6262 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006263 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006264
Tim Northover2a0783d2014-05-30 14:14:07 +00006265 case llvm::Triple::xcore:
6266 return new XCoreTargetInfo(Triple);
6267
6268 case llvm::Triple::hexagon:
6269 return new HexagonTargetInfo(Triple);
6270
6271 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006272 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006273 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006274
6275 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006276 case llvm::Triple::FreeBSD:
6277 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006278 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006279 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006280 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006281 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006282 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006283 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006284 }
6285
Christian Pirker9b019ae2014-02-25 13:51:00 +00006286 case llvm::Triple::aarch64_be:
6287 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006288 case llvm::Triple::FreeBSD:
6289 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006290 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006291 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006292 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006293 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006294 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006295 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006296 }
6297
Daniel Dunbar52322032009-08-18 05:47:58 +00006298 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006299 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006300 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006301 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006302
Daniel Dunbar52322032009-08-18 05:47:58 +00006303 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006304 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006305 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006306 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006307 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006308 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006309 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006310 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006311 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006312 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006313 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006314 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006315 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006316 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006317 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006318 case llvm::Triple::Win32:
6319 switch (Triple.getEnvironment()) {
6320 default:
6321 return new ARMleTargetInfo(Triple);
6322 case llvm::Triple::Itanium:
6323 return new ItaniumWindowsARMleTargetInfo(Triple);
6324 case llvm::Triple::MSVC:
6325 return new MicrosoftARMleTargetInfo(Triple);
6326 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006327 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006328 return new ARMleTargetInfo(Triple);
6329 }
6330
6331 case llvm::Triple::armeb:
6332 case llvm::Triple::thumbeb:
6333 if (Triple.isOSDarwin())
6334 return new DarwinARMTargetInfo(Triple);
6335
6336 switch (os) {
6337 case llvm::Triple::Linux:
6338 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6339 case llvm::Triple::FreeBSD:
6340 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6341 case llvm::Triple::NetBSD:
6342 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6343 case llvm::Triple::OpenBSD:
6344 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6345 case llvm::Triple::Bitrig:
6346 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6347 case llvm::Triple::RTEMS:
6348 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6349 case llvm::Triple::NaCl:
6350 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6351 default:
6352 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006353 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006354
Daniel Dunbar52322032009-08-18 05:47:58 +00006355 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006356 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006357
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006358 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006359 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006360 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006361 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006362 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006363 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006364 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006365 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006366 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006367 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006368 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006369 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006370 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006371
6372 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006373 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006374 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006375 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006376 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006377 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006378 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006379 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006380 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006381 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006382 case llvm::Triple::NaCl:
6383 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006384 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006385 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006386 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006387
Akira Hatanakabef17452011-09-20 19:21:49 +00006388 case llvm::Triple::mips64:
6389 switch (os) {
6390 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006391 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006392 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006393 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006394 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006395 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006396 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006397 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006398 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006399 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006400 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006401 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006402 }
6403
6404 case llvm::Triple::mips64el:
6405 switch (os) {
6406 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006407 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006408 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006409 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006410 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006411 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006412 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006413 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006414 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006415 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006416 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006417 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006418 }
6419
Ivan Krasindd7403e2011-08-24 20:22:22 +00006420 case llvm::Triple::le32:
6421 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006422 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006423 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006424 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006425 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006426 }
6427
JF Bastien643817d2014-09-12 17:52:47 +00006428 case llvm::Triple::le64:
6429 return new Le64TargetInfo(Triple);
6430
Daniel Dunbar52322032009-08-18 05:47:58 +00006431 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006432 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006433 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006434 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006435 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006436 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006437 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006438 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006439 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006440 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006441 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006442 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006443 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006444 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006445 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006446 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006447 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006448
6449 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006450 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006451 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006452 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006453 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006454 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006455 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006456 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006457 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006459 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006460 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006461 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006462 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006463 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006464
Bill Schmidt778d3872013-07-26 01:36:11 +00006465 case llvm::Triple::ppc64le:
6466 switch (os) {
6467 case llvm::Triple::Linux:
6468 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6469 default:
6470 return new PPC64TargetInfo(Triple);
6471 }
6472
Peter Collingbournec947aae2012-05-20 23:28:41 +00006473 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006474 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006475 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006476 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006477
Eli Friedmand13b41e2012-10-12 23:32:00 +00006478 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006479 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006480
Daniel Dunbar52322032009-08-18 05:47:58 +00006481 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006482 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006483 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006484 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006485 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006486 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006487 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006488 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006489 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006490 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006491 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006492 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006493 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006494 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006495 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006496
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006497 case llvm::Triple::sparcv9:
6498 switch (os) {
6499 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006500 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006501 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006502 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006503 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006504 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006505 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006506 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006507 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006508 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006509 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006510 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006511 }
6512
Ulrich Weigand47445072013-05-06 16:26:41 +00006513 case llvm::Triple::systemz:
6514 switch (os) {
6515 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006516 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006517 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006518 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006519 }
6520
Eli Friedmana9c3d712009-08-19 20:47:07 +00006521 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006522 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006523
Daniel Dunbar52322032009-08-18 05:47:58 +00006524 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006525 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006526 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006527
Daniel Dunbar52322032009-08-18 05:47:58 +00006528 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006529 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006530 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006531 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006532 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006533 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006534 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006535 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006537 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006538 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006539 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006540 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006541 case llvm::Triple::KFreeBSD:
6542 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006543 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006544 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006545 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006546 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006547 case llvm::Triple::Win32: {
6548 switch (Triple.getEnvironment()) {
6549 default:
6550 return new X86_32TargetInfo(Triple);
6551 case llvm::Triple::Cygnus:
6552 return new CygwinX86_32TargetInfo(Triple);
6553 case llvm::Triple::GNU:
6554 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006555 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006556 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006557 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006558 }
6559 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006560 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006561 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006562 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006563 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006564 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006565 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006566 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006568 }
6569
6570 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006571 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006572 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006573
Daniel Dunbar52322032009-08-18 05:47:58 +00006574 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006575 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006576 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006577 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006578 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006579 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006580 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006581 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006582 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006583 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006584 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006585 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006586 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006587 case llvm::Triple::KFreeBSD:
6588 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006589 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006590 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006591 case llvm::Triple::Win32: {
6592 switch (Triple.getEnvironment()) {
6593 default:
6594 return new X86_64TargetInfo(Triple);
6595 case llvm::Triple::GNU:
6596 return new MinGWX86_64TargetInfo(Triple);
6597 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006598 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006599 }
6600 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006601 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006602 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006603 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006604 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006605 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006606
6607 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006608 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006609 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006610 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006611 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006612 }
6613 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006614 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006615 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006616 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006617 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006618 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006619 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006620}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006621
6622/// CreateTargetInfo - Return the target info object for the specified target
6623/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006624TargetInfo *
6625TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6626 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006627 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006628
6629 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006630 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006631 if (!Target) {
6632 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006633 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006634 }
Alp Toker80758082014-07-06 05:26:44 +00006635 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006636
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006637 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006638 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6639 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006640 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006641 }
6642
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006643 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006644 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6645 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006646 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006647 }
6648
Rafael Espindolaeb265472013-08-21 21:59:03 +00006649 // Set the fp math unit.
6650 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6651 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006652 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006653 }
6654
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006655 // Compute the default target features, we need the target to handle this
6656 // because features may have dependencies on one another.
6657 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006658 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006659
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006660 // Apply the user specified deltas.
6661 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6662 I < N; ++I) {
6663 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006664 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006665 bool Enabled = Name[0] == '+';
6666 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006667 }
6668
6669 // Add the features to the compile options.
6670 //
6671 // FIXME: If we are completely confident that we have the right set, we only
6672 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006673 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006674 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6675 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006676 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006677 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006678 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006679
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006680 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006681}