blob: ae3ba6567b48b4e7cc4f9d69bc621f640fc7f405 [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.
Richard Smith00a4a852015-01-13 01:47:45 +0000276 //
277 // FIXME: This is wrong; the macro refers to the numerical values
278 // of wchar_t *literals*, which are not locale-dependent. However,
279 // FreeBSD systems apparently depend on us getting this wrong, and
280 // setting this to 1 is conforming even if all the basic source
281 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000282 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 }
284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
286 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000287
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000288 switch (Triple.getArch()) {
289 default:
290 case llvm::Triple::x86:
291 case llvm::Triple::x86_64:
292 this->MCountName = ".mcount";
293 break;
294 case llvm::Triple::mips:
295 case llvm::Triple::mipsel:
296 case llvm::Triple::ppc:
297 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000298 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 this->MCountName = "_mcount";
300 break;
301 case llvm::Triple::arm:
302 this->MCountName = "__mcount";
303 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000304 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000305 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306};
307
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308// GNU/kFreeBSD Target
309template<typename Target>
310class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
311protected:
Craig Topper3164f332014-03-11 03:39:26 +0000312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000314 // GNU/kFreeBSD defines; list based off of gcc output
315
316 DefineStd(Builder, "unix", Opts);
317 Builder.defineMacro("__FreeBSD_kernel__");
318 Builder.defineMacro("__GLIBC__");
319 Builder.defineMacro("__ELF__");
320 if (Opts.POSIXThreads)
321 Builder.defineMacro("_REENTRANT");
322 if (Opts.CPlusPlus)
323 Builder.defineMacro("_GNU_SOURCE");
324 }
325public:
Eric Christopher917e9522014-11-18 22:36:15 +0000326 KFreeBSDTargetInfo(const llvm::Triple &Triple)
327 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000328 this->UserLabelPrefix = "";
329 }
330};
331
Chris Lattner3e2ee142010-07-07 16:01:42 +0000332// Minix Target
333template<typename Target>
334class MinixTargetInfo : public OSTargetInfo<Target> {
335protected:
Craig Topper3164f332014-03-11 03:39:26 +0000336 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
337 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000338 // Minix defines
339
340 Builder.defineMacro("__minix", "3");
341 Builder.defineMacro("_EM_WSIZE", "4");
342 Builder.defineMacro("_EM_PSIZE", "4");
343 Builder.defineMacro("_EM_SSIZE", "2");
344 Builder.defineMacro("_EM_LSIZE", "4");
345 Builder.defineMacro("_EM_FSIZE", "4");
346 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000347 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000348 DefineStd(Builder, "unix", Opts);
349 }
350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000351 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
352 this->UserLabelPrefix = "";
353 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000354};
355
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356// Linux target
357template<typename Target>
358class LinuxTargetInfo : public OSTargetInfo<Target> {
359protected:
Craig Topper3164f332014-03-11 03:39:26 +0000360 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
361 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000362 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000363 DefineStd(Builder, "unix", Opts);
364 DefineStd(Builder, "linux", Opts);
365 Builder.defineMacro("__gnu_linux__");
366 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000367 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000368 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000369 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000370 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000371 if (Opts.CPlusPlus)
372 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373 }
374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000375 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000376 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000377 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000378
379 switch (Triple.getArch()) {
380 default:
381 break;
382 case llvm::Triple::ppc:
383 case llvm::Triple::ppc64:
384 case llvm::Triple::ppc64le:
385 this->MCountName = "_mcount";
386 break;
387 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000388 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000389
Craig Topper3164f332014-03-11 03:39:26 +0000390 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000391 return ".text.startup";
392 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000393};
394
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000395// NetBSD Target
396template<typename Target>
397class NetBSDTargetInfo : public OSTargetInfo<Target> {
398protected:
Craig Topper3164f332014-03-11 03:39:26 +0000399 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
400 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000401 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000402 Builder.defineMacro("__NetBSD__");
403 Builder.defineMacro("__unix__");
404 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000405 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000406 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000407
408 switch (Triple.getArch()) {
409 default:
410 break;
411 case llvm::Triple::arm:
412 case llvm::Triple::armeb:
413 case llvm::Triple::thumb:
414 case llvm::Triple::thumbeb:
415 Builder.defineMacro("__ARM_DWARF_EH__");
416 break;
417 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000418 }
419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000420 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000423};
424
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425// OpenBSD Target
426template<typename Target>
427class OpenBSDTargetInfo : public OSTargetInfo<Target> {
428protected:
Craig Topper3164f332014-03-11 03:39:26 +0000429 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
430 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431 // OpenBSD defines; list based off of gcc output
432
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000433 Builder.defineMacro("__OpenBSD__");
434 DefineStd(Builder, "unix", Opts);
435 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000436 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000437 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438 }
439public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000440 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
441 this->UserLabelPrefix = "";
442 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000443
Eli Friedman3715d1f2011-12-15 02:15:56 +0000444 switch (Triple.getArch()) {
445 default:
446 case llvm::Triple::x86:
447 case llvm::Triple::x86_64:
448 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000449 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000450 this->MCountName = "__mcount";
451 break;
452 case llvm::Triple::mips64:
453 case llvm::Triple::mips64el:
454 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000455 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000456 this->MCountName = "_mcount";
457 break;
458 }
459 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000460};
461
Eli Friedman9fa28852012-08-08 23:57:20 +0000462// Bitrig Target
463template<typename Target>
464class BitrigTargetInfo : public OSTargetInfo<Target> {
465protected:
Craig Topper3164f332014-03-11 03:39:26 +0000466 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
467 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000468 // Bitrig defines; list based off of gcc output
469
470 Builder.defineMacro("__Bitrig__");
471 DefineStd(Builder, "unix", Opts);
472 Builder.defineMacro("__ELF__");
473 if (Opts.POSIXThreads)
474 Builder.defineMacro("_REENTRANT");
475 }
476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000477 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
478 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000479 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000480 }
481};
482
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000483// PSP Target
484template<typename Target>
485class PSPTargetInfo : public OSTargetInfo<Target> {
486protected:
Craig Topper3164f332014-03-11 03:39:26 +0000487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
488 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000489 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000490 Builder.defineMacro("PSP");
491 Builder.defineMacro("_PSP");
492 Builder.defineMacro("__psp__");
493 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000494 }
495public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000496 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000497 this->UserLabelPrefix = "";
498 }
499};
500
John Thompsone467e192009-11-19 17:18:50 +0000501// PS3 PPU Target
502template<typename Target>
503class PS3PPUTargetInfo : public OSTargetInfo<Target> {
504protected:
Craig Topper3164f332014-03-11 03:39:26 +0000505 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
506 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000507 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000508 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__PPU__");
510 Builder.defineMacro("__CELLOS_LV2__");
511 Builder.defineMacro("__ELF__");
512 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000513 Builder.defineMacro("_ARCH_PPC64");
514 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000515 }
516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000518 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000519 this->LongWidth = this->LongAlign = 32;
520 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000521 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000522 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000523 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000524 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000525 }
526};
527
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000528template <typename Target>
529class PS4OSTargetInfo : public OSTargetInfo<Target> {
530protected:
531 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
532 MacroBuilder &Builder) const override {
533 Builder.defineMacro("__FreeBSD__", "9");
534 Builder.defineMacro("__FreeBSD_cc_version", "900001");
535 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 Builder.defineMacro("__PS4__");
539 }
540public:
541 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
542 this->WCharType = this->UnsignedShort;
543
544 this->UserLabelPrefix = "";
545
546 switch (Triple.getArch()) {
547 default:
548 case llvm::Triple::x86_64:
549 this->MCountName = ".mcount";
550 break;
551 }
552 }
553};
554
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555// Solaris target
556template<typename Target>
557class SolarisTargetInfo : public OSTargetInfo<Target> {
558protected:
Craig Topper3164f332014-03-11 03:39:26 +0000559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
560 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000561 DefineStd(Builder, "sun", Opts);
562 DefineStd(Builder, "unix", Opts);
563 Builder.defineMacro("__ELF__");
564 Builder.defineMacro("__svr4__");
565 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000566 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
567 // newer, but to 500 for everything else. feature_test.h has a check to
568 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000569 // with a new version.
570 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000571 Builder.defineMacro("_XOPEN_SOURCE", "600");
572 else
573 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000574 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000575 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000576 Builder.defineMacro("_LARGEFILE_SOURCE");
577 Builder.defineMacro("_LARGEFILE64_SOURCE");
578 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000579 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000580 }
581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000582 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000583 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000584 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000585 // FIXME: WIntType should be SignedLong
586 }
587};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000588
589// Windows target
590template<typename Target>
591class WindowsTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000595 Builder.defineMacro("_WIN32");
596 }
597 void getVisualStudioDefines(const LangOptions &Opts,
598 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000599 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000600 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601 Builder.defineMacro("_CPPRTTI");
602
Reid Kleckner16514352015-01-30 21:42:55 +0000603 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000604 Builder.defineMacro("_CPPUNWIND");
605 }
606
607 if (!Opts.CharIsSigned)
608 Builder.defineMacro("_CHAR_UNSIGNED");
609
610 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
611 // but it works for now.
612 if (Opts.POSIXThreads)
613 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000614
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000615 if (Opts.MSCompatibilityVersion) {
616 Builder.defineMacro("_MSC_VER",
617 Twine(Opts.MSCompatibilityVersion / 100000));
618 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000619 // FIXME We cannot encode the revision information into 32-bits
620 Builder.defineMacro("_MSC_BUILD", Twine(1));
621 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000622
623 if (Opts.MicrosoftExt) {
624 Builder.defineMacro("_MSC_EXTENSIONS");
625
626 if (Opts.CPlusPlus11) {
627 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
628 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
629 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
630 }
631 }
632
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000633 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000634 }
635
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000636public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000637 WindowsTargetInfo(const llvm::Triple &Triple)
638 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639};
640
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000641template <typename Target>
642class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000643protected:
Craig Topper3164f332014-03-11 03:39:26 +0000644 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
645 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000646 if (Opts.POSIXThreads)
647 Builder.defineMacro("_REENTRANT");
648 if (Opts.CPlusPlus)
649 Builder.defineMacro("_GNU_SOURCE");
650
651 DefineStd(Builder, "unix", Opts);
652 Builder.defineMacro("__ELF__");
653 Builder.defineMacro("__native_client__");
654 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000655
656public:
657 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000658 this->UserLabelPrefix = "";
659 this->LongAlign = 32;
660 this->LongWidth = 32;
661 this->PointerAlign = 32;
662 this->PointerWidth = 32;
663 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000664 this->Int64Type = TargetInfo::SignedLongLong;
665 this->DoubleAlign = 64;
666 this->LongDoubleWidth = 64;
667 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000668 this->LongLongWidth = 64;
669 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000670 this->SizeType = TargetInfo::UnsignedInt;
671 this->PtrDiffType = TargetInfo::SignedInt;
672 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000673 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000674 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000675 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000676 this->DescriptionString =
677 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000678 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000679 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000680 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000681 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000682 } else if (Triple.getArch() == llvm::Triple::mipsel) {
683 // Handled on mips' setDescriptionString.
684 } else {
685 assert(Triple.getArch() == llvm::Triple::le32);
686 this->DescriptionString = "e-p:32:32-i64:64";
687 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000688 }
689};
Mike Stump11289f42009-09-09 15:08:12 +0000690} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000691
Chris Lattner09d98f52008-10-05 21:50:58 +0000692//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000693// Specific target implementations.
694//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000695
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000696namespace {
697// PPC abstract base class
698class PPCTargetInfo : public TargetInfo {
699 static const Builtin::Info BuiltinInfo[];
700 static const char * const GCCRegNames[];
701 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000702 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000703
704 // Target cpu features.
705 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000706 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000707
Ulrich Weigand8afad612014-07-28 13:17:52 +0000708protected:
709 std::string ABI;
710
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000711public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000712 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000713 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000714 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000715 LongDoubleWidth = LongDoubleAlign = 128;
716 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
717 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000718
Hal Finkel6b984f02012-07-03 16:51:04 +0000719 /// \brief Flags for architecture specific defines.
720 typedef enum {
721 ArchDefineNone = 0,
722 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
723 ArchDefinePpcgr = 1 << 1,
724 ArchDefinePpcsq = 1 << 2,
725 ArchDefine440 = 1 << 3,
726 ArchDefine603 = 1 << 4,
727 ArchDefine604 = 1 << 5,
728 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000729 ArchDefinePwr5 = 1 << 7,
730 ArchDefinePwr5x = 1 << 8,
731 ArchDefinePwr6 = 1 << 9,
732 ArchDefinePwr6x = 1 << 10,
733 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000734 ArchDefinePwr8 = 1 << 12,
735 ArchDefineA2 = 1 << 13,
736 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000737 } ArchDefineTypes;
738
Bill Schmidt38378a02013-02-01 20:23:10 +0000739 // Note: GCC recognizes the following additional cpus:
740 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
741 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
742 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000743 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000744 bool CPUKnown = llvm::StringSwitch<bool>(Name)
745 .Case("generic", true)
746 .Case("440", true)
747 .Case("450", true)
748 .Case("601", true)
749 .Case("602", true)
750 .Case("603", true)
751 .Case("603e", true)
752 .Case("603ev", true)
753 .Case("604", true)
754 .Case("604e", true)
755 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000756 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000757 .Case("g3", true)
758 .Case("7400", true)
759 .Case("g4", true)
760 .Case("7450", true)
761 .Case("g4+", true)
762 .Case("750", true)
763 .Case("970", true)
764 .Case("g5", true)
765 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000766 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000767 .Case("e500mc", true)
768 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000769 .Case("power3", true)
770 .Case("pwr3", true)
771 .Case("power4", true)
772 .Case("pwr4", true)
773 .Case("power5", true)
774 .Case("pwr5", true)
775 .Case("power5x", true)
776 .Case("pwr5x", true)
777 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000778 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000779 .Case("power6x", true)
780 .Case("pwr6x", true)
781 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000782 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000783 .Case("power8", true)
784 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000785 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000786 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000787 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000788 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000789 .Case("powerpc64le", true)
790 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000791 .Default(false);
792
793 if (CPUKnown)
794 CPU = Name;
795
796 return CPUKnown;
797 }
798
Ulrich Weigand8afad612014-07-28 13:17:52 +0000799
800 StringRef getABI() const override { return ABI; }
801
Craig Topper3164f332014-03-11 03:39:26 +0000802 void getTargetBuiltins(const Builtin::Info *&Records,
803 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000804 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000805 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000806 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000807
Craig Topper3164f332014-03-11 03:39:26 +0000808 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000809
Craig Topper3164f332014-03-11 03:39:26 +0000810 void getTargetDefines(const LangOptions &Opts,
811 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000812
Craig Topper3164f332014-03-11 03:39:26 +0000813 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000814
Craig Topper3164f332014-03-11 03:39:26 +0000815 bool handleTargetFeatures(std::vector<std::string> &Features,
816 DiagnosticsEngine &Diags) override;
817 bool hasFeature(StringRef Feature) const override;
818
819 void getGCCRegNames(const char * const *&Names,
820 unsigned &NumNames) const override;
821 void getGCCRegAliases(const GCCRegAlias *&Aliases,
822 unsigned &NumAliases) const override;
823 bool validateAsmConstraint(const char *&Name,
824 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000825 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000826 default: return false;
827 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000828 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000829 case 'b': // Base register
830 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000831 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000832 break;
833 // FIXME: The following are added to allow parsing.
834 // I just took a guess at what the actions should be.
835 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000836 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000837 case 'v': // Altivec vector register
838 Info.setAllowsRegister();
839 break;
840 case 'w':
841 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 case 'd':// VSX vector register to hold vector double data
843 case 'f':// VSX vector register to hold vector float data
844 case 's':// VSX vector register to hold scalar float data
845 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000846 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000847 break;
848 default:
849 return false;
850 }
851 Info.setAllowsRegister();
852 Name++; // Skip over 'w'.
853 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 case 'h': // `MQ', `CTR', or `LINK' register
855 case 'q': // `MQ' register
856 case 'c': // `CTR' register
857 case 'l': // `LINK' register
858 case 'x': // `CR' register (condition register) number 0
859 case 'y': // `CR' register (condition register)
860 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000861 Info.setAllowsRegister();
862 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000863 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000864 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000865 // (use `L' instead for SImode constants)
866 case 'K': // Unsigned 16-bit constant
867 case 'L': // Signed 16-bit constant shifted left 16 bits
868 case 'M': // Constant larger than 31
869 case 'N': // Exact power of 2
870 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000871 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000873 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000874 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000875 break;
876 case 'm': // Memory operand. Note that on PowerPC targets, m can
877 // include addresses that update the base register. It
878 // is therefore only safe to use `m' in an asm statement
879 // if that asm statement accesses the operand exactly once.
880 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000881 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000883 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000884 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000885 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
886 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000887 // register to be updated.
888 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000889 if (Name[1] != 's')
890 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000891 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000892 // include any automodification of the base register. Unlike
893 // `m', this constraint can be used in asm statements that
894 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000895 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000896 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000897 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000898 break;
899 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000900 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000901 case 'Z': // Memory operand that is an indexed or indirect from a
902 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000903 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000904 Info.setAllowsMemory();
905 Info.setAllowsRegister();
906 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000907 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000908 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000909 // register (`p' is preferable for asm statements)
910 case 'S': // Constant suitable as a 64-bit mask operand
911 case 'T': // Constant suitable as a 32-bit mask operand
912 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000913 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000914 // instructions
915 case 'W': // Vector constant that does not require memory
916 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000917 break;
918 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000919 }
John Thompson07a61a42010-06-24 22:44:13 +0000920 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000921 }
Craig Topper3164f332014-03-11 03:39:26 +0000922 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000923 std::string R;
924 switch (*Constraint) {
925 case 'e':
926 case 'w':
927 // Two-character constraint; add "^" hint for later parsing.
928 R = std::string("^") + std::string(Constraint, 2);
929 Constraint++;
930 break;
931 default:
932 return TargetInfo::convertConstraint(Constraint);
933 }
934 return R;
935 }
Craig Topper3164f332014-03-11 03:39:26 +0000936 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000937 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000938 }
Craig Topper3164f332014-03-11 03:39:26 +0000939 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000940 if (RegNo == 0) return 3;
941 if (RegNo == 1) return 4;
942 return -1;
943 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000944};
Anders Carlssonf511f642007-11-27 04:11:28 +0000945
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000946const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000947#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000948#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000949 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000950#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000951};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952
Eric Christopher917e9522014-11-18 22:36:15 +0000953/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000954/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000955bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000956 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000957 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
958 // Ignore disabled features.
959 if (Features[i][0] == '-')
960 continue;
961
962 StringRef Feature = StringRef(Features[i]).substr(1);
963
964 if (Feature == "vsx") {
965 HasVSX = true;
966 continue;
967 }
968
Bill Schmidt59eb7672014-10-10 15:09:43 +0000969 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000970 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000971 continue;
972 }
973
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000974 // TODO: Finish this list and add an assert that we've handled them
975 // all.
976 }
977
978 return true;
979}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000980
Chris Lattnerecd49032009-03-02 22:27:17 +0000981/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
982/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000983void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000984 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000985 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000986 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000987 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000988 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000989 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000990 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000991 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000992 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000993 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000994 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000995 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000996 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000997
Chris Lattnerecd49032009-03-02 22:27:17 +0000998 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000999 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1000 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001001 } else {
1002 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1003 getTriple().getOS() != llvm::Triple::OpenBSD)
1004 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001005 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001006
Ulrich Weigand8afad612014-07-28 13:17:52 +00001007 // ABI options.
1008 if (ABI == "elfv1")
1009 Builder.defineMacro("_CALL_ELF", "1");
1010 if (ABI == "elfv2")
1011 Builder.defineMacro("_CALL_ELF", "2");
1012
Chris Lattnerecd49032009-03-02 22:27:17 +00001013 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001014 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1015 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001016
Chris Lattnerecd49032009-03-02 22:27:17 +00001017 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001018 if (LongDoubleWidth == 128)
1019 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001020
John Thompsone467e192009-11-19 17:18:50 +00001021 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001022 Builder.defineMacro("__VEC__", "10206");
1023 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001024 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001025
1026 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001027 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1028 .Case("440", ArchDefineName)
1029 .Case("450", ArchDefineName | ArchDefine440)
1030 .Case("601", ArchDefineName)
1031 .Case("602", ArchDefineName | ArchDefinePpcgr)
1032 .Case("603", ArchDefineName | ArchDefinePpcgr)
1033 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1034 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1035 .Case("604", ArchDefineName | ArchDefinePpcgr)
1036 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1037 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001038 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001039 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1040 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1041 .Case("750", ArchDefineName | ArchDefinePpcgr)
1042 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1043 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001044 .Case("a2", ArchDefineA2)
1045 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001046 .Case("pwr3", ArchDefinePpcgr)
1047 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1048 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1049 | ArchDefinePpcsq)
1050 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1051 | ArchDefinePpcgr | ArchDefinePpcsq)
1052 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1053 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1054 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1055 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1056 | ArchDefinePpcsq)
1057 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1058 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001059 | ArchDefinePpcgr | ArchDefinePpcsq)
1060 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1061 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1062 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001063 .Case("power3", ArchDefinePpcgr)
1064 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1065 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1066 | ArchDefinePpcsq)
1067 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1068 | ArchDefinePpcgr | ArchDefinePpcsq)
1069 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1070 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1071 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1072 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1073 | ArchDefinePpcsq)
1074 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1075 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001076 | ArchDefinePpcgr | ArchDefinePpcsq)
1077 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1078 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1079 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001080 .Default(ArchDefineNone);
1081
1082 if (defs & ArchDefineName)
1083 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1084 if (defs & ArchDefinePpcgr)
1085 Builder.defineMacro("_ARCH_PPCGR");
1086 if (defs & ArchDefinePpcsq)
1087 Builder.defineMacro("_ARCH_PPCSQ");
1088 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001089 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001090 if (defs & ArchDefine603)
1091 Builder.defineMacro("_ARCH_603");
1092 if (defs & ArchDefine604)
1093 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001094 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001095 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001096 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001097 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001098 if (defs & ArchDefinePwr5x)
1099 Builder.defineMacro("_ARCH_PWR5X");
1100 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001101 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001102 if (defs & ArchDefinePwr6x)
1103 Builder.defineMacro("_ARCH_PWR6X");
1104 if (defs & ArchDefinePwr7)
1105 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001106 if (defs & ArchDefinePwr8)
1107 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001108 if (defs & ArchDefineA2)
1109 Builder.defineMacro("_ARCH_A2");
1110 if (defs & ArchDefineA2q) {
1111 Builder.defineMacro("_ARCH_A2Q");
1112 Builder.defineMacro("_ARCH_QP");
1113 }
1114
1115 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1116 Builder.defineMacro("__bg__");
1117 Builder.defineMacro("__THW_BLUEGENE__");
1118 Builder.defineMacro("__bgq__");
1119 Builder.defineMacro("__TOS_BGQ__");
1120 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001121
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001122 if (HasVSX)
1123 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001124 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001125 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001126
Bill Schmidt38378a02013-02-01 20:23:10 +00001127 // FIXME: The following are not yet generated here by Clang, but are
1128 // generated by GCC:
1129 //
1130 // _SOFT_FLOAT_
1131 // __RECIP_PRECISION__
1132 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001133 // __RECIP__
1134 // __RECIPF__
1135 // __RSQRTE__
1136 // __RSQRTEF__
1137 // _SOFT_DOUBLE_
1138 // __NO_LWSYNC__
1139 // __HAVE_BSWAP__
1140 // __LONGDOUBLE128
1141 // __CMODEL_MEDIUM__
1142 // __CMODEL_LARGE__
1143 // _CALL_SYSV
1144 // _CALL_DARWIN
1145 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001146}
1147
1148void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1149 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1150 .Case("7400", true)
1151 .Case("g4", true)
1152 .Case("7450", true)
1153 .Case("g4+", true)
1154 .Case("970", true)
1155 .Case("g5", true)
1156 .Case("pwr6", true)
1157 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001158 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001159 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001160 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001161 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001162
1163 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001164
1165 if (!ABI.empty())
1166 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001167}
1168
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001169bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001170 return llvm::StringSwitch<bool>(Feature)
1171 .Case("powerpc", true)
1172 .Case("vsx", HasVSX)
1173 .Case("power8-vector", HasP8Vector)
1174 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001175}
Chris Lattner17df24e2008-04-21 18:56:49 +00001176
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001177const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001178 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1179 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1180 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1181 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1182 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1183 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1184 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1185 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001186 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001187 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001188 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001189 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1190 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1191 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1192 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001193 "vrsave", "vscr",
1194 "spe_acc", "spefscr",
1195 "sfp"
1196};
Chris Lattner10a5b382007-01-29 05:24:35 +00001197
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001198void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001199 unsigned &NumNames) const {
1200 Names = GCCRegNames;
1201 NumNames = llvm::array_lengthof(GCCRegNames);
1202}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001203
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001204const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1205 // While some of these aliases do map to different registers
1206 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001207 { { "0" }, "r0" },
1208 { { "1"}, "r1" },
1209 { { "2" }, "r2" },
1210 { { "3" }, "r3" },
1211 { { "4" }, "r4" },
1212 { { "5" }, "r5" },
1213 { { "6" }, "r6" },
1214 { { "7" }, "r7" },
1215 { { "8" }, "r8" },
1216 { { "9" }, "r9" },
1217 { { "10" }, "r10" },
1218 { { "11" }, "r11" },
1219 { { "12" }, "r12" },
1220 { { "13" }, "r13" },
1221 { { "14" }, "r14" },
1222 { { "15" }, "r15" },
1223 { { "16" }, "r16" },
1224 { { "17" }, "r17" },
1225 { { "18" }, "r18" },
1226 { { "19" }, "r19" },
1227 { { "20" }, "r20" },
1228 { { "21" }, "r21" },
1229 { { "22" }, "r22" },
1230 { { "23" }, "r23" },
1231 { { "24" }, "r24" },
1232 { { "25" }, "r25" },
1233 { { "26" }, "r26" },
1234 { { "27" }, "r27" },
1235 { { "28" }, "r28" },
1236 { { "29" }, "r29" },
1237 { { "30" }, "r30" },
1238 { { "31" }, "r31" },
1239 { { "fr0" }, "f0" },
1240 { { "fr1" }, "f1" },
1241 { { "fr2" }, "f2" },
1242 { { "fr3" }, "f3" },
1243 { { "fr4" }, "f4" },
1244 { { "fr5" }, "f5" },
1245 { { "fr6" }, "f6" },
1246 { { "fr7" }, "f7" },
1247 { { "fr8" }, "f8" },
1248 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001249 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001250 { { "fr11" }, "f11" },
1251 { { "fr12" }, "f12" },
1252 { { "fr13" }, "f13" },
1253 { { "fr14" }, "f14" },
1254 { { "fr15" }, "f15" },
1255 { { "fr16" }, "f16" },
1256 { { "fr17" }, "f17" },
1257 { { "fr18" }, "f18" },
1258 { { "fr19" }, "f19" },
1259 { { "fr20" }, "f20" },
1260 { { "fr21" }, "f21" },
1261 { { "fr22" }, "f22" },
1262 { { "fr23" }, "f23" },
1263 { { "fr24" }, "f24" },
1264 { { "fr25" }, "f25" },
1265 { { "fr26" }, "f26" },
1266 { { "fr27" }, "f27" },
1267 { { "fr28" }, "f28" },
1268 { { "fr29" }, "f29" },
1269 { { "fr30" }, "f30" },
1270 { { "fr31" }, "f31" },
1271 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001272};
1273
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001274void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001275 unsigned &NumAliases) const {
1276 Aliases = GCCRegAliases;
1277 NumAliases = llvm::array_lengthof(GCCRegAliases);
1278}
1279} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001280
Chris Lattner5ba61f02006-10-14 07:39:34 +00001281namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001282class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001283public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001284 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001285 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001286
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001287 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001288 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001289 case llvm::Triple::FreeBSD:
1290 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001291 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001292 PtrDiffType = SignedInt;
1293 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001294 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001295 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001296 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001297 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001298
Roman Divacky3ffe7462012-03-13 19:20:17 +00001299 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1300 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001301 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001302 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001303
1304 // PPC32 supports atomics up to 4 bytes.
1305 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001306 }
1307
Craig Topper3164f332014-03-11 03:39:26 +00001308 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001309 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001310 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001311 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001312};
1313} // end anonymous namespace.
1314
Bill Schmidt778d3872013-07-26 01:36:11 +00001315// Note: ABI differences may eventually require us to have a separate
1316// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001317namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001318class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001319public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001320 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001321 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001322 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001323 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001324
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001325 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1326 DescriptionString = "e-m:e-i64:64-n32:64";
1327 ABI = "elfv2";
1328 } else {
1329 DescriptionString = "E-m:e-i64:64-n32:64";
1330 ABI = "elfv1";
1331 }
1332
1333 switch (getTriple().getOS()) {
1334 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001335 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001336 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001337 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001338 case llvm::Triple::NetBSD:
1339 IntMaxType = SignedLongLong;
1340 Int64Type = SignedLongLong;
1341 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001342 default:
1343 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001344 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001345
1346 // PPC64 supports atomics up to 8 bytes.
1347 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001348 }
Craig Topper3164f332014-03-11 03:39:26 +00001349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001350 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001351 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001352 // PPC64 Linux-specifc ABI options.
1353 bool setABI(const std::string &Name) override {
1354 if (Name == "elfv1" || Name == "elfv2") {
1355 ABI = Name;
1356 return true;
1357 }
1358 return false;
1359 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001360};
1361} // end anonymous namespace.
1362
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001363
1364namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001365class DarwinPPC32TargetInfo :
1366 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001367public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001368 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1369 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001370 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001371 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001372 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001373 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001374 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001375 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001376 }
Craig Topper3164f332014-03-11 03:39:26 +00001377 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001378 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001379 }
1380};
1381
1382class DarwinPPC64TargetInfo :
1383 public DarwinTargetInfo<PPC64TargetInfo> {
1384public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001385 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1386 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001387 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001388 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001389 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001390 }
1391};
1392} // end anonymous namespace.
1393
Chris Lattner5ba61f02006-10-14 07:39:34 +00001394namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 static const unsigned NVPTXAddrSpaceMap[] = {
1396 1, // opencl_global
1397 3, // opencl_local
1398 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001399 // FIXME: generic has to be added to the target
1400 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001401 1, // cuda_device
1402 4, // cuda_constant
1403 3, // cuda_shared
1404 };
1405 class NVPTXTargetInfo : public TargetInfo {
1406 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001407 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001408
1409 // The GPU profiles supported by the NVPTX backend
1410 enum GPUKind {
1411 GK_NONE,
1412 GK_SM20,
1413 GK_SM21,
1414 GK_SM30,
1415 GK_SM35,
1416 } GPU;
1417
Peter Collingbournec947aae2012-05-20 23:28:41 +00001418 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001419 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001420 BigEndian = false;
1421 TLSSupported = false;
1422 LongWidth = LongAlign = 64;
1423 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001424 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001425 // Define available target features
1426 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001427 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001428 // Set the default GPU to sm20
1429 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001430 }
Craig Topper3164f332014-03-11 03:39:26 +00001431 void getTargetDefines(const LangOptions &Opts,
1432 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001433 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001434 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001435 if (Opts.CUDAIsDevice) {
1436 // Set __CUDA_ARCH__ for the GPU specified.
1437 std::string CUDAArchCode;
1438 switch (GPU) {
1439 case GK_SM20:
1440 CUDAArchCode = "200";
1441 break;
1442 case GK_SM21:
1443 CUDAArchCode = "210";
1444 break;
1445 case GK_SM30:
1446 CUDAArchCode = "300";
1447 break;
1448 case GK_SM35:
1449 CUDAArchCode = "350";
1450 break;
1451 default:
1452 llvm_unreachable("Unhandled target CPU");
1453 }
1454 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1455 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001456 }
Craig Topper3164f332014-03-11 03:39:26 +00001457 void getTargetBuiltins(const Builtin::Info *&Records,
1458 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001459 Records = BuiltinInfo;
1460 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001461 }
Craig Topper3164f332014-03-11 03:39:26 +00001462 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001463 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001464 }
Craig Topper3164f332014-03-11 03:39:26 +00001465
1466 void getGCCRegNames(const char * const *&Names,
1467 unsigned &NumNames) const override;
1468 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1469 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001470 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001471 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001472 NumAliases = 0;
1473 }
Eric Christopher917e9522014-11-18 22:36:15 +00001474 bool
1475 validateAsmConstraint(const char *&Name,
1476 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001477 switch (*Name) {
1478 default: return false;
1479 case 'c':
1480 case 'h':
1481 case 'r':
1482 case 'l':
1483 case 'f':
1484 case 'd':
1485 Info.setAllowsRegister();
1486 return true;
1487 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001488 }
Craig Topper3164f332014-03-11 03:39:26 +00001489 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001490 // FIXME: Is this really right?
1491 return "";
1492 }
Craig Topper3164f332014-03-11 03:39:26 +00001493 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001494 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001495 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001496 }
Craig Topper3164f332014-03-11 03:39:26 +00001497 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001498 GPU = llvm::StringSwitch<GPUKind>(Name)
1499 .Case("sm_20", GK_SM20)
1500 .Case("sm_21", GK_SM21)
1501 .Case("sm_30", GK_SM30)
1502 .Case("sm_35", GK_SM35)
1503 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001504
Reid Klecknerbbc01782014-12-03 21:53:36 +00001505 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001506 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001507 };
1508
1509 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1510#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1511#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1512 ALL_LANGUAGES },
1513#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001514 };
1515
1516 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1517 "r0"
1518 };
1519
1520 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1521 unsigned &NumNames) const {
1522 Names = GCCRegNames;
1523 NumNames = llvm::array_lengthof(GCCRegNames);
1524 }
1525
1526 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1527 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001528 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001529 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001530 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1531 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001532 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001533 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001534 };
1535
1536 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1537 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001538 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001539 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001540 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1541 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001542 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001543 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001544 };
1545}
1546
1547namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001548
1549static const unsigned R600AddrSpaceMap[] = {
1550 1, // opencl_global
1551 3, // opencl_local
1552 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001553 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001554 1, // cuda_device
1555 2, // cuda_constant
1556 3 // cuda_shared
1557};
1558
Tom Stellarda96344b2014-08-21 13:58:40 +00001559// If you edit the description strings, make sure you update
1560// getPointerWidthV().
1561
Tom Stellardc74b1e02013-03-04 17:40:53 +00001562static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001563 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1564 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001565
1566static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001567 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1568 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001569
1570static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001571 "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 +00001572 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1573 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001574
Eli Friedmand13b41e2012-10-12 23:32:00 +00001575class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001576 static const Builtin::Info BuiltinInfo[];
1577
Tom Stellardc74b1e02013-03-04 17:40:53 +00001578 /// \brief The GPU profiles supported by the R600 target.
1579 enum GPUKind {
1580 GK_NONE,
1581 GK_R600,
1582 GK_R600_DOUBLE_OPS,
1583 GK_R700,
1584 GK_R700_DOUBLE_OPS,
1585 GK_EVERGREEN,
1586 GK_EVERGREEN_DOUBLE_OPS,
1587 GK_NORTHERN_ISLANDS,
1588 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001589 GK_SOUTHERN_ISLANDS,
1590 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001591 } GPU;
1592
Eli Friedmand13b41e2012-10-12 23:32:00 +00001593public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001594 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001595 : TargetInfo(Triple) {
1596
1597 if (Triple.getArch() == llvm::Triple::amdgcn) {
1598 DescriptionString = DescriptionStringSI;
1599 GPU = GK_SOUTHERN_ISLANDS;
1600 } else {
1601 DescriptionString = DescriptionStringR600;
1602 GPU = GK_R600;
1603 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001604 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001605 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001606 }
1607
Tom Stellarda96344b2014-08-21 13:58:40 +00001608 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1609 if (GPU <= GK_CAYMAN)
1610 return 32;
1611
1612 switch(AddrSpace) {
1613 default:
1614 return 64;
1615 case 0:
1616 case 3:
1617 case 5:
1618 return 32;
1619 }
1620 }
1621
Craig Topper3164f332014-03-11 03:39:26 +00001622 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001623 return "";
1624 }
1625
Craig Topper3164f332014-03-11 03:39:26 +00001626 void getGCCRegNames(const char * const *&Names,
1627 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001628 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001629 numNames = 0;
1630 }
1631
Craig Topper3164f332014-03-11 03:39:26 +00001632 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1633 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001634 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001635 NumAliases = 0;
1636 }
1637
Craig Topper3164f332014-03-11 03:39:26 +00001638 bool validateAsmConstraint(const char *&Name,
1639 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001640 return true;
1641 }
1642
Craig Topper3164f332014-03-11 03:39:26 +00001643 void getTargetBuiltins(const Builtin::Info *&Records,
1644 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001645 Records = BuiltinInfo;
1646 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001647 }
1648
Craig Topper3164f332014-03-11 03:39:26 +00001649 void getTargetDefines(const LangOptions &Opts,
1650 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001651 Builder.defineMacro("__R600__");
1652 }
1653
Craig Topper3164f332014-03-11 03:39:26 +00001654 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001655 return TargetInfo::CharPtrBuiltinVaList;
1656 }
1657
Craig Topper3164f332014-03-11 03:39:26 +00001658 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001659 GPU = llvm::StringSwitch<GPUKind>(Name)
1660 .Case("r600" , GK_R600)
1661 .Case("rv610", GK_R600)
1662 .Case("rv620", GK_R600)
1663 .Case("rv630", GK_R600)
1664 .Case("rv635", GK_R600)
1665 .Case("rs780", GK_R600)
1666 .Case("rs880", GK_R600)
1667 .Case("rv670", GK_R600_DOUBLE_OPS)
1668 .Case("rv710", GK_R700)
1669 .Case("rv730", GK_R700)
1670 .Case("rv740", GK_R700_DOUBLE_OPS)
1671 .Case("rv770", GK_R700_DOUBLE_OPS)
1672 .Case("palm", GK_EVERGREEN)
1673 .Case("cedar", GK_EVERGREEN)
1674 .Case("sumo", GK_EVERGREEN)
1675 .Case("sumo2", GK_EVERGREEN)
1676 .Case("redwood", GK_EVERGREEN)
1677 .Case("juniper", GK_EVERGREEN)
1678 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1679 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1680 .Case("barts", GK_NORTHERN_ISLANDS)
1681 .Case("turks", GK_NORTHERN_ISLANDS)
1682 .Case("caicos", GK_NORTHERN_ISLANDS)
1683 .Case("cayman", GK_CAYMAN)
1684 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001685 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001686 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1687 .Case("verde", GK_SOUTHERN_ISLANDS)
1688 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001689 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001690 .Case("bonaire", GK_SEA_ISLANDS)
1691 .Case("kabini", GK_SEA_ISLANDS)
1692 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001693 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001694 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001695 .Default(GK_NONE);
1696
1697 if (GPU == GK_NONE) {
1698 return false;
1699 }
1700
1701 // Set the correct data layout
1702 switch (GPU) {
1703 case GK_NONE:
1704 case GK_R600:
1705 case GK_R700:
1706 case GK_EVERGREEN:
1707 case GK_NORTHERN_ISLANDS:
1708 DescriptionString = DescriptionStringR600;
1709 break;
1710 case GK_R600_DOUBLE_OPS:
1711 case GK_R700_DOUBLE_OPS:
1712 case GK_EVERGREEN_DOUBLE_OPS:
1713 case GK_CAYMAN:
1714 DescriptionString = DescriptionStringR600DoubleOps;
1715 break;
1716 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001717 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001718 DescriptionString = DescriptionStringSI;
1719 break;
1720 }
1721
1722 return true;
1723 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001724};
1725
Matt Arsenault56f008d2014-06-24 20:45:01 +00001726const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1727#define BUILTIN(ID, TYPE, ATTRS) \
1728 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1729#include "clang/Basic/BuiltinsR600.def"
1730};
1731
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732} // end anonymous namespace
1733
1734namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001735// Namespace for x86 abstract base class
1736const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001737#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001738#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001739 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001740#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001741};
Eli Friedmanb5366062008-05-20 14:21:01 +00001742
Nuno Lopescfca1f02009-12-23 17:49:57 +00001743static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001744 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1745 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001746 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001747 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1748 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1749 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001750 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001751 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1752 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001753};
1754
Eric Christophercdd36352011-06-21 00:05:20 +00001755const TargetInfo::AddlRegName AddlRegNames[] = {
1756 { { "al", "ah", "eax", "rax" }, 0 },
1757 { { "bl", "bh", "ebx", "rbx" }, 3 },
1758 { { "cl", "ch", "ecx", "rcx" }, 2 },
1759 { { "dl", "dh", "edx", "rdx" }, 1 },
1760 { { "esi", "rsi" }, 4 },
1761 { { "edi", "rdi" }, 5 },
1762 { { "esp", "rsp" }, 7 },
1763 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001764};
1765
1766// X86 target abstract base class; x86-32 and x86-64 are very close, so
1767// most of the implementation can be shared.
1768class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001769 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001770 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001771 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001772 enum MMX3DNowEnum {
1773 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1774 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001775 enum XOPEnum {
1776 NoXOP,
1777 SSE4A,
1778 FMA4,
1779 XOP
1780 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001781
Eric Christophere1ddaf92010-04-02 23:50:19 +00001782 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001783 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001784 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001785 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001786 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001787 bool HasBMI;
1788 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001789 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001790 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001791 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001792 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001793 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001794 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001795 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001796 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001797 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1798 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001799 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001800 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001801
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001802 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1803 ///
1804 /// Each enumeration represents a particular CPU supported by Clang. These
1805 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1806 enum CPUKind {
1807 CK_Generic,
1808
1809 /// \name i386
1810 /// i386-generation processors.
1811 //@{
1812 CK_i386,
1813 //@}
1814
1815 /// \name i486
1816 /// i486-generation processors.
1817 //@{
1818 CK_i486,
1819 CK_WinChipC6,
1820 CK_WinChip2,
1821 CK_C3,
1822 //@}
1823
1824 /// \name i586
1825 /// i586-generation processors, P5 microarchitecture based.
1826 //@{
1827 CK_i586,
1828 CK_Pentium,
1829 CK_PentiumMMX,
1830 //@}
1831
1832 /// \name i686
1833 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1834 //@{
1835 CK_i686,
1836 CK_PentiumPro,
1837 CK_Pentium2,
1838 CK_Pentium3,
1839 CK_Pentium3M,
1840 CK_PentiumM,
1841 CK_C3_2,
1842
1843 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1844 /// Clang however has some logic to suport this.
1845 // FIXME: Warn, deprecate, and potentially remove this.
1846 CK_Yonah,
1847 //@}
1848
1849 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001850 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001851 //@{
1852 CK_Pentium4,
1853 CK_Pentium4M,
1854 CK_Prescott,
1855 CK_Nocona,
1856 //@}
1857
1858 /// \name Core
1859 /// Core microarchitecture based processors.
1860 //@{
1861 CK_Core2,
1862
1863 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1864 /// codename which GCC no longer accepts as an option to -march, but Clang
1865 /// has some logic for recognizing it.
1866 // FIXME: Warn, deprecate, and potentially remove this.
1867 CK_Penryn,
1868 //@}
1869
1870 /// \name Atom
1871 /// Atom processors
1872 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001873 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001874 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001875 //@}
1876
1877 /// \name Nehalem
1878 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001879 CK_Nehalem,
1880
1881 /// \name Westmere
1882 /// Westmere microarchitecture based processors.
1883 CK_Westmere,
1884
1885 /// \name Sandy Bridge
1886 /// Sandy Bridge microarchitecture based processors.
1887 CK_SandyBridge,
1888
1889 /// \name Ivy Bridge
1890 /// Ivy Bridge microarchitecture based processors.
1891 CK_IvyBridge,
1892
1893 /// \name Haswell
1894 /// Haswell microarchitecture based processors.
1895 CK_Haswell,
1896
1897 /// \name Broadwell
1898 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001899 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001900
1901 /// \name Skylake
1902 /// Skylake microarchitecture based processors.
1903 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001904
Craig Topper449314e2013-08-20 07:09:39 +00001905 /// \name Knights Landing
1906 /// Knights Landing processor.
1907 CK_KNL,
1908
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001909 /// \name K6
1910 /// K6 architecture processors.
1911 //@{
1912 CK_K6,
1913 CK_K6_2,
1914 CK_K6_3,
1915 //@}
1916
1917 /// \name K7
1918 /// K7 architecture processors.
1919 //@{
1920 CK_Athlon,
1921 CK_AthlonThunderbird,
1922 CK_Athlon4,
1923 CK_AthlonXP,
1924 CK_AthlonMP,
1925 //@}
1926
1927 /// \name K8
1928 /// K8 architecture processors.
1929 //@{
1930 CK_Athlon64,
1931 CK_Athlon64SSE3,
1932 CK_AthlonFX,
1933 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001934 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001935 CK_Opteron,
1936 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001937 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001938 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001939
Benjamin Kramer569f2152012-01-10 11:50:18 +00001940 /// \name Bobcat
1941 /// Bobcat architecture processors.
1942 //@{
1943 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001944 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001945 //@}
1946
1947 /// \name Bulldozer
1948 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001949 //@{
1950 CK_BDVER1,
1951 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001952 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001953 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001954 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001955
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001956 /// This specification is deprecated and will be removed in the future.
1957 /// Users should prefer \see CK_K8.
1958 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001959 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001960 CK_x86_64,
1961 //@}
1962
1963 /// \name Geode
1964 /// Geode processors.
1965 //@{
1966 CK_Geode
1967 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001968 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001969
Rafael Espindolaeb265472013-08-21 21:59:03 +00001970 enum FPMathKind {
1971 FP_Default,
1972 FP_SSE,
1973 FP_387
1974 } FPMath;
1975
Eli Friedman3fd920a2008-08-20 02:34:37 +00001976public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001977 X86TargetInfo(const llvm::Triple &Triple)
1978 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001979 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001980 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1981 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1982 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1983 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1984 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1985 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001986 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001987 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001988 }
Craig Topper3164f332014-03-11 03:39:26 +00001989 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001990 // X87 evaluates with 80 bits "long double" precision.
1991 return SSELevel == NoSSE ? 2 : 0;
1992 }
Craig Topper3164f332014-03-11 03:39:26 +00001993 void getTargetBuiltins(const Builtin::Info *&Records,
1994 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001995 Records = BuiltinInfo;
1996 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001997 }
Craig Topper3164f332014-03-11 03:39:26 +00001998 void getGCCRegNames(const char * const *&Names,
1999 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002000 Names = GCCRegNames;
2001 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002002 }
Craig Topper3164f332014-03-11 03:39:26 +00002003 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2004 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002005 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002006 NumAliases = 0;
2007 }
Craig Topper3164f332014-03-11 03:39:26 +00002008 void getGCCAddlRegNames(const AddlRegName *&Names,
2009 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002010 Names = AddlRegNames;
2011 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002012 }
Craig Topper3164f332014-03-11 03:39:26 +00002013 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002014 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002015
Akira Hatanaka974131e2014-09-18 18:17:18 +00002016 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2017
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002018 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2019
Akira Hatanaka974131e2014-09-18 18:17:18 +00002020 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2021
Craig Topper3164f332014-03-11 03:39:26 +00002022 std::string convertConstraint(const char *&Constraint) const override;
2023 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002024 return "~{dirflag},~{fpsr},~{flags}";
2025 }
Craig Topper3164f332014-03-11 03:39:26 +00002026 void getTargetDefines(const LangOptions &Opts,
2027 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002028 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2029 bool Enabled);
2030 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2031 bool Enabled);
2032 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2033 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002034 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2035 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002036 setFeatureEnabledImpl(Features, Name, Enabled);
2037 }
2038 // This exists purely to cut down on the number of virtual calls in
2039 // getDefaultFeatures which calls this repeatedly.
2040 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2041 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002042 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2043 bool hasFeature(StringRef Feature) const override;
2044 bool handleTargetFeatures(std::vector<std::string> &Features,
2045 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002046 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002047 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002048 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002049 else if (getTriple().getArch() == llvm::Triple::x86 &&
2050 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002051 return "no-mmx";
2052 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002053 }
Craig Topper3164f332014-03-11 03:39:26 +00002054 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002055 CPU = llvm::StringSwitch<CPUKind>(Name)
2056 .Case("i386", CK_i386)
2057 .Case("i486", CK_i486)
2058 .Case("winchip-c6", CK_WinChipC6)
2059 .Case("winchip2", CK_WinChip2)
2060 .Case("c3", CK_C3)
2061 .Case("i586", CK_i586)
2062 .Case("pentium", CK_Pentium)
2063 .Case("pentium-mmx", CK_PentiumMMX)
2064 .Case("i686", CK_i686)
2065 .Case("pentiumpro", CK_PentiumPro)
2066 .Case("pentium2", CK_Pentium2)
2067 .Case("pentium3", CK_Pentium3)
2068 .Case("pentium3m", CK_Pentium3M)
2069 .Case("pentium-m", CK_PentiumM)
2070 .Case("c3-2", CK_C3_2)
2071 .Case("yonah", CK_Yonah)
2072 .Case("pentium4", CK_Pentium4)
2073 .Case("pentium4m", CK_Pentium4M)
2074 .Case("prescott", CK_Prescott)
2075 .Case("nocona", CK_Nocona)
2076 .Case("core2", CK_Core2)
2077 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002078 .Case("bonnell", CK_Bonnell)
2079 .Case("atom", CK_Bonnell) // Legacy name.
2080 .Case("silvermont", CK_Silvermont)
2081 .Case("slm", CK_Silvermont) // Legacy name.
2082 .Case("nehalem", CK_Nehalem)
2083 .Case("corei7", CK_Nehalem) // Legacy name.
2084 .Case("westmere", CK_Westmere)
2085 .Case("sandybridge", CK_SandyBridge)
2086 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2087 .Case("ivybridge", CK_IvyBridge)
2088 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2089 .Case("haswell", CK_Haswell)
2090 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002091 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002092 .Case("skylake", CK_Skylake)
2093 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002094 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002095 .Case("k6", CK_K6)
2096 .Case("k6-2", CK_K6_2)
2097 .Case("k6-3", CK_K6_3)
2098 .Case("athlon", CK_Athlon)
2099 .Case("athlon-tbird", CK_AthlonThunderbird)
2100 .Case("athlon-4", CK_Athlon4)
2101 .Case("athlon-xp", CK_AthlonXP)
2102 .Case("athlon-mp", CK_AthlonMP)
2103 .Case("athlon64", CK_Athlon64)
2104 .Case("athlon64-sse3", CK_Athlon64SSE3)
2105 .Case("athlon-fx", CK_AthlonFX)
2106 .Case("k8", CK_K8)
2107 .Case("k8-sse3", CK_K8SSE3)
2108 .Case("opteron", CK_Opteron)
2109 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002110 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002111 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002112 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002113 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002114 .Case("bdver1", CK_BDVER1)
2115 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002116 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002117 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002118 .Case("x86-64", CK_x86_64)
2119 .Case("geode", CK_Geode)
2120 .Default(CK_Generic);
2121
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002122 // Perform any per-CPU checks necessary to determine if this CPU is
2123 // acceptable.
2124 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2125 // invalid without explaining *why*.
2126 switch (CPU) {
2127 case CK_Generic:
2128 // No processor selected!
2129 return false;
2130
2131 case CK_i386:
2132 case CK_i486:
2133 case CK_WinChipC6:
2134 case CK_WinChip2:
2135 case CK_C3:
2136 case CK_i586:
2137 case CK_Pentium:
2138 case CK_PentiumMMX:
2139 case CK_i686:
2140 case CK_PentiumPro:
2141 case CK_Pentium2:
2142 case CK_Pentium3:
2143 case CK_Pentium3M:
2144 case CK_PentiumM:
2145 case CK_Yonah:
2146 case CK_C3_2:
2147 case CK_Pentium4:
2148 case CK_Pentium4M:
2149 case CK_Prescott:
2150 case CK_K6:
2151 case CK_K6_2:
2152 case CK_K6_3:
2153 case CK_Athlon:
2154 case CK_AthlonThunderbird:
2155 case CK_Athlon4:
2156 case CK_AthlonXP:
2157 case CK_AthlonMP:
2158 case CK_Geode:
2159 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002160 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002161 return false;
2162
2163 // Fallthrough
2164 case CK_Nocona:
2165 case CK_Core2:
2166 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002167 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002168 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002169 case CK_Nehalem:
2170 case CK_Westmere:
2171 case CK_SandyBridge:
2172 case CK_IvyBridge:
2173 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002174 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002175 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002176 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002177 case CK_Athlon64:
2178 case CK_Athlon64SSE3:
2179 case CK_AthlonFX:
2180 case CK_K8:
2181 case CK_K8SSE3:
2182 case CK_Opteron:
2183 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002184 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002185 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002186 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002187 case CK_BDVER1:
2188 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002189 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002190 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002191 case CK_x86_64:
2192 return true;
2193 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002194 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002195 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002196
Craig Topper3164f332014-03-11 03:39:26 +00002197 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002198
Craig Topper3164f332014-03-11 03:39:26 +00002199 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002200 // We accept all non-ARM calling conventions
2201 return (CC == CC_X86ThisCall ||
2202 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002203 CC == CC_X86StdCall ||
2204 CC == CC_X86VectorCall ||
2205 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002206 CC == CC_X86Pascal ||
2207 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002208 }
2209
Craig Topper3164f332014-03-11 03:39:26 +00002210 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002211 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002212 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002213};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002214
Rafael Espindolaeb265472013-08-21 21:59:03 +00002215bool X86TargetInfo::setFPMath(StringRef Name) {
2216 if (Name == "387") {
2217 FPMath = FP_387;
2218 return true;
2219 }
2220 if (Name == "sse") {
2221 FPMath = FP_SSE;
2222 return true;
2223 }
2224 return false;
2225}
2226
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002227void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002228 // FIXME: This *really* should not be here.
2229
2230 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002231 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002232 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002233
Chandler Carruth212334f2011-09-28 08:55:37 +00002234 switch (CPU) {
2235 case CK_Generic:
2236 case CK_i386:
2237 case CK_i486:
2238 case CK_i586:
2239 case CK_Pentium:
2240 case CK_i686:
2241 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002242 break;
2243 case CK_PentiumMMX:
2244 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002245 case CK_K6:
2246 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002247 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002248 break;
2249 case CK_Pentium3:
2250 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002251 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002252 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002253 break;
2254 case CK_PentiumM:
2255 case CK_Pentium4:
2256 case CK_Pentium4M:
2257 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002258 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002259 break;
2260 case CK_Yonah:
2261 case CK_Prescott:
2262 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002263 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002264 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002265 break;
2266 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002267 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002268 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002269 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002270 break;
2271 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002272 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002273 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002274 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002275 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002276 setFeatureEnabledImpl(Features, "avx512f", true);
2277 setFeatureEnabledImpl(Features, "avx512cd", true);
2278 setFeatureEnabledImpl(Features, "avx512dq", true);
2279 setFeatureEnabledImpl(Features, "avx512bw", true);
2280 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002281 // FALLTHROUGH
2282 case CK_Broadwell:
2283 setFeatureEnabledImpl(Features, "rdseed", true);
2284 setFeatureEnabledImpl(Features, "adx", true);
2285 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002286 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002287 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002288 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002289 setFeatureEnabledImpl(Features, "bmi", true);
2290 setFeatureEnabledImpl(Features, "bmi2", true);
2291 setFeatureEnabledImpl(Features, "rtm", true);
2292 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002293 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002294 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002295 setFeatureEnabledImpl(Features, "rdrnd", true);
2296 setFeatureEnabledImpl(Features, "f16c", true);
2297 setFeatureEnabledImpl(Features, "fsgsbase", true);
2298 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002299 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002300 setFeatureEnabledImpl(Features, "avx", true);
2301 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002302 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002303 case CK_Silvermont:
2304 setFeatureEnabledImpl(Features, "aes", true);
2305 setFeatureEnabledImpl(Features, "pclmul", true);
2306 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002307 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002308 setFeatureEnabledImpl(Features, "sse4.2", true);
2309 setFeatureEnabledImpl(Features, "cx16", true);
2310 break;
2311 case CK_KNL:
2312 setFeatureEnabledImpl(Features, "avx512f", true);
2313 setFeatureEnabledImpl(Features, "avx512cd", true);
2314 setFeatureEnabledImpl(Features, "avx512er", true);
2315 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002316 setFeatureEnabledImpl(Features, "rdseed", true);
2317 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002318 setFeatureEnabledImpl(Features, "lzcnt", true);
2319 setFeatureEnabledImpl(Features, "bmi", true);
2320 setFeatureEnabledImpl(Features, "bmi2", true);
2321 setFeatureEnabledImpl(Features, "rtm", true);
2322 setFeatureEnabledImpl(Features, "fma", true);
2323 setFeatureEnabledImpl(Features, "rdrnd", true);
2324 setFeatureEnabledImpl(Features, "f16c", true);
2325 setFeatureEnabledImpl(Features, "fsgsbase", true);
2326 setFeatureEnabledImpl(Features, "aes", true);
2327 setFeatureEnabledImpl(Features, "pclmul", true);
2328 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002329 break;
2330 case CK_K6_2:
2331 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002332 case CK_WinChip2:
2333 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002334 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002335 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002336 case CK_Athlon:
2337 case CK_AthlonThunderbird:
2338 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002339 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002340 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002341 case CK_Athlon4:
2342 case CK_AthlonXP:
2343 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002344 setFeatureEnabledImpl(Features, "sse", true);
2345 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002346 break;
2347 case CK_K8:
2348 case CK_Opteron:
2349 case CK_Athlon64:
2350 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002351 setFeatureEnabledImpl(Features, "sse2", true);
2352 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002353 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002354 case CK_AMDFAM10:
2355 setFeatureEnabledImpl(Features, "sse4a", true);
2356 setFeatureEnabledImpl(Features, "lzcnt", true);
2357 setFeatureEnabledImpl(Features, "popcnt", true);
2358 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002359 case CK_K8SSE3:
2360 case CK_OpteronSSE3:
2361 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002362 setFeatureEnabledImpl(Features, "sse3", true);
2363 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002364 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002365 case CK_BTVER2:
2366 setFeatureEnabledImpl(Features, "avx", true);
2367 setFeatureEnabledImpl(Features, "aes", true);
2368 setFeatureEnabledImpl(Features, "pclmul", true);
2369 setFeatureEnabledImpl(Features, "bmi", true);
2370 setFeatureEnabledImpl(Features, "f16c", true);
2371 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002372 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002373 setFeatureEnabledImpl(Features, "ssse3", true);
2374 setFeatureEnabledImpl(Features, "sse4a", true);
2375 setFeatureEnabledImpl(Features, "lzcnt", true);
2376 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002377 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002378 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002379 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002380 case CK_BDVER4:
2381 setFeatureEnabledImpl(Features, "avx2", true);
2382 setFeatureEnabledImpl(Features, "bmi2", true);
2383 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002384 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002385 setFeatureEnabledImpl(Features, "fsgsbase", true);
2386 // FALLTHROUGH
2387 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002388 setFeatureEnabledImpl(Features, "bmi", true);
2389 setFeatureEnabledImpl(Features, "fma", true);
2390 setFeatureEnabledImpl(Features, "f16c", true);
2391 setFeatureEnabledImpl(Features, "tbm", true);
2392 // FALLTHROUGH
2393 case CK_BDVER1:
2394 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002395 setFeatureEnabledImpl(Features, "xop", true);
2396 setFeatureEnabledImpl(Features, "lzcnt", true);
2397 setFeatureEnabledImpl(Features, "aes", true);
2398 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002399 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002400 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002401 break;
Eli Friedman33465822011-07-08 23:31:17 +00002402 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002403}
2404
Rafael Espindolae62e2792013-08-20 13:44:29 +00002405void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002406 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002407 if (Enabled) {
2408 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002409 case AVX512F:
2410 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002411 case AVX2:
2412 Features["avx2"] = true;
2413 case AVX:
2414 Features["avx"] = true;
2415 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002416 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002417 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002418 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002419 case SSSE3:
2420 Features["ssse3"] = true;
2421 case SSE3:
2422 Features["sse3"] = true;
2423 case SSE2:
2424 Features["sse2"] = true;
2425 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002426 Features["sse"] = true;
2427 case NoSSE:
2428 break;
2429 }
2430 return;
2431 }
2432
2433 switch (Level) {
2434 case NoSSE:
2435 case SSE1:
2436 Features["sse"] = false;
2437 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002438 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2439 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002440 case SSE3:
2441 Features["sse3"] = false;
2442 setXOPLevel(Features, NoXOP, false);
2443 case SSSE3:
2444 Features["ssse3"] = false;
2445 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002446 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002447 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002448 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002449 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002450 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002451 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002452 case AVX2:
2453 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002454 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002455 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002456 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2457 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002458 }
2459}
2460
2461void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002462 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002463 if (Enabled) {
2464 switch (Level) {
2465 case AMD3DNowAthlon:
2466 Features["3dnowa"] = true;
2467 case AMD3DNow:
2468 Features["3dnow"] = true;
2469 case MMX:
2470 Features["mmx"] = true;
2471 case NoMMX3DNow:
2472 break;
2473 }
2474 return;
2475 }
2476
2477 switch (Level) {
2478 case NoMMX3DNow:
2479 case MMX:
2480 Features["mmx"] = false;
2481 case AMD3DNow:
2482 Features["3dnow"] = false;
2483 case AMD3DNowAthlon:
2484 Features["3dnowa"] = false;
2485 }
2486}
2487
2488void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002489 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002490 if (Enabled) {
2491 switch (Level) {
2492 case XOP:
2493 Features["xop"] = true;
2494 case FMA4:
2495 Features["fma4"] = true;
2496 setSSELevel(Features, AVX, true);
2497 case SSE4A:
2498 Features["sse4a"] = true;
2499 setSSELevel(Features, SSE3, true);
2500 case NoXOP:
2501 break;
2502 }
2503 return;
2504 }
2505
2506 switch (Level) {
2507 case NoXOP:
2508 case SSE4A:
2509 Features["sse4a"] = false;
2510 case FMA4:
2511 Features["fma4"] = false;
2512 case XOP:
2513 Features["xop"] = false;
2514 }
2515}
2516
Craig Topper86d79ef2013-09-17 04:51:29 +00002517void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2518 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002519 // FIXME: This *really* should not be here. We need some way of translating
2520 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002521 if (Name == "sse4")
2522 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002523
Rafael Espindolae62e2792013-08-20 13:44:29 +00002524 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002525
Craig Topper29561122013-09-19 01:13:07 +00002526 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002527 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002528 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002529 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002530 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002531 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002532 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002533 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002534 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002535 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002536 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002537 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002538 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002539 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002540 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002541 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002542 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002543 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002544 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002545 if (Enabled)
2546 setSSELevel(Features, SSE2, Enabled);
2547 } else if (Name == "pclmul") {
2548 if (Enabled)
2549 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002550 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002551 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002552 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002553 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002554 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002555 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002556 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2557 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002558 if (Enabled)
2559 setSSELevel(Features, AVX512F, Enabled);
2560 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002561 if (Enabled)
2562 setSSELevel(Features, AVX, Enabled);
2563 } else if (Name == "fma4") {
2564 setXOPLevel(Features, FMA4, Enabled);
2565 } else if (Name == "xop") {
2566 setXOPLevel(Features, XOP, Enabled);
2567 } else if (Name == "sse4a") {
2568 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002569 } else if (Name == "f16c") {
2570 if (Enabled)
2571 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002572 } else if (Name == "sha") {
2573 if (Enabled)
2574 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002575 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002576}
2577
Eric Christopher3ff21b32013-10-16 21:26:26 +00002578/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002579/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002580bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002581 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002582 // Remember the maximum enabled sselevel.
2583 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2584 // Ignore disabled features.
2585 if (Features[i][0] == '-')
2586 continue;
2587
Benjamin Kramer27402c62012-03-05 15:10:44 +00002588 StringRef Feature = StringRef(Features[i]).substr(1);
2589
2590 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002591 HasAES = true;
2592 continue;
2593 }
2594
Craig Topper3f122a72012-05-31 05:18:48 +00002595 if (Feature == "pclmul") {
2596 HasPCLMUL = true;
2597 continue;
2598 }
2599
Benjamin Kramer27402c62012-03-05 15:10:44 +00002600 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002601 HasLZCNT = true;
2602 continue;
2603 }
2604
Rafael Espindola89049822013-08-23 20:21:37 +00002605 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002606 HasRDRND = true;
2607 continue;
2608 }
2609
Craig Topper8c7f2512014-11-03 06:51:41 +00002610 if (Feature == "fsgsbase") {
2611 HasFSGSBASE = true;
2612 continue;
2613 }
2614
Benjamin Kramer27402c62012-03-05 15:10:44 +00002615 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002616 HasBMI = true;
2617 continue;
2618 }
2619
Benjamin Kramer27402c62012-03-05 15:10:44 +00002620 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002621 HasBMI2 = true;
2622 continue;
2623 }
2624
Benjamin Kramer27402c62012-03-05 15:10:44 +00002625 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002626 HasPOPCNT = true;
2627 continue;
2628 }
2629
Michael Liao625a8752012-11-10 05:17:46 +00002630 if (Feature == "rtm") {
2631 HasRTM = true;
2632 continue;
2633 }
2634
Michael Liao74f4eaf2013-03-26 17:52:08 +00002635 if (Feature == "prfchw") {
2636 HasPRFCHW = true;
2637 continue;
2638 }
2639
Michael Liaoffaae352013-03-29 05:17:55 +00002640 if (Feature == "rdseed") {
2641 HasRDSEED = true;
2642 continue;
2643 }
2644
Robert Khasanov50e6f582014-09-19 09:53:48 +00002645 if (Feature == "adx") {
2646 HasADX = true;
2647 continue;
2648 }
2649
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002650 if (Feature == "tbm") {
2651 HasTBM = true;
2652 continue;
2653 }
2654
Craig Topperbba778b2012-06-03 21:46:30 +00002655 if (Feature == "fma") {
2656 HasFMA = true;
2657 continue;
2658 }
2659
Manman Rena45358c2012-10-11 00:59:55 +00002660 if (Feature == "f16c") {
2661 HasF16C = true;
2662 continue;
2663 }
2664
Craig Topper679b53a2013-08-21 05:29:10 +00002665 if (Feature == "avx512cd") {
2666 HasAVX512CD = true;
2667 continue;
2668 }
2669
2670 if (Feature == "avx512er") {
2671 HasAVX512ER = true;
2672 continue;
2673 }
2674
2675 if (Feature == "avx512pf") {
2676 HasAVX512PF = true;
2677 continue;
2678 }
2679
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002680 if (Feature == "avx512dq") {
2681 HasAVX512DQ = true;
2682 continue;
2683 }
2684
2685 if (Feature == "avx512bw") {
2686 HasAVX512BW = true;
2687 continue;
2688 }
2689
2690 if (Feature == "avx512vl") {
2691 HasAVX512VL = true;
2692 continue;
2693 }
2694
Ben Langmuir58078d02013-09-19 13:22:04 +00002695 if (Feature == "sha") {
2696 HasSHA = true;
2697 continue;
2698 }
2699
Nick Lewycky50e8f482013-10-05 20:14:27 +00002700 if (Feature == "cx16") {
2701 HasCX16 = true;
2702 continue;
2703 }
2704
Daniel Dunbar979586e2009-11-11 09:38:56 +00002705 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002706 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002707 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002708 .Case("avx2", AVX2)
2709 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002710 .Case("sse4.2", SSE42)
2711 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002712 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002713 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002714 .Case("sse2", SSE2)
2715 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002716 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002717 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002718
Eli Friedman33465822011-07-08 23:31:17 +00002719 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002720 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002721 .Case("3dnowa", AMD3DNowAthlon)
2722 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002723 .Case("mmx", MMX)
2724 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002725 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002726
2727 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2728 .Case("xop", XOP)
2729 .Case("fma4", FMA4)
2730 .Case("sse4a", SSE4A)
2731 .Default(NoXOP);
2732 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002733 }
Eli Friedman33465822011-07-08 23:31:17 +00002734
Craig Topper7481d8a2013-09-10 06:55:47 +00002735 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2736 // Can't do this earlier because we need to be able to explicitly enable
2737 // popcnt and still disable sse4.2.
2738 if (!HasPOPCNT && SSELevel >= SSE42 &&
2739 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2740 HasPOPCNT = true;
2741 Features.push_back("+popcnt");
2742 }
2743
Yunzhong Gao61089362013-10-16 19:07:02 +00002744 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2745 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2746 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2747 HasPRFCHW = true;
2748 Features.push_back("+prfchw");
2749 }
2750
Rafael Espindolaeb265472013-08-21 21:59:03 +00002751 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2752 // matches the selected sse level.
2753 if (FPMath == FP_SSE && SSELevel < SSE1) {
2754 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2755 return false;
2756 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2757 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2758 return false;
2759 }
2760
Eli Friedman33465822011-07-08 23:31:17 +00002761 // Don't tell the backend if we're turning off mmx; it will end up disabling
2762 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002763 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2764 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002765 std::vector<std::string>::iterator it;
2766 it = std::find(Features.begin(), Features.end(), "-mmx");
2767 if (it != Features.end())
2768 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002769 else if (SSELevel > NoSSE)
2770 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002771 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002772}
Chris Lattnerecd49032009-03-02 22:27:17 +00002773
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002774/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2775/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002776void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002777 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002778 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002779 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002780 Builder.defineMacro("__amd64__");
2781 Builder.defineMacro("__amd64");
2782 Builder.defineMacro("__x86_64");
2783 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002784 if (getTriple().getArchName() == "x86_64h") {
2785 Builder.defineMacro("__x86_64h");
2786 Builder.defineMacro("__x86_64h__");
2787 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002788 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002789 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002790 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002791
Chris Lattnerecd49032009-03-02 22:27:17 +00002792 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002793 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2794 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002795 switch (CPU) {
2796 case CK_Generic:
2797 break;
2798 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002799 // The rest are coming from the i386 define above.
2800 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002801 break;
2802 case CK_i486:
2803 case CK_WinChipC6:
2804 case CK_WinChip2:
2805 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002806 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002807 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002808 case CK_PentiumMMX:
2809 Builder.defineMacro("__pentium_mmx__");
2810 Builder.defineMacro("__tune_pentium_mmx__");
2811 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002812 case CK_i586:
2813 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002814 defineCPUMacros(Builder, "i586");
2815 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002816 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002817 case CK_Pentium3:
2818 case CK_Pentium3M:
2819 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002820 Builder.defineMacro("__tune_pentium3__");
2821 // Fallthrough
2822 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002823 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002824 Builder.defineMacro("__tune_pentium2__");
2825 // Fallthrough
2826 case CK_PentiumPro:
2827 Builder.defineMacro("__tune_i686__");
2828 Builder.defineMacro("__tune_pentiumpro__");
2829 // Fallthrough
2830 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002831 Builder.defineMacro("__i686");
2832 Builder.defineMacro("__i686__");
2833 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2834 Builder.defineMacro("__pentiumpro");
2835 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002836 break;
2837 case CK_Pentium4:
2838 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002839 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002840 break;
2841 case CK_Yonah:
2842 case CK_Prescott:
2843 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002844 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002845 break;
2846 case CK_Core2:
2847 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002848 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002849 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002850 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002851 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002852 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002853 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002854 defineCPUMacros(Builder, "slm");
2855 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002856 case CK_Nehalem:
2857 case CK_Westmere:
2858 case CK_SandyBridge:
2859 case CK_IvyBridge:
2860 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002861 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002862 // FIXME: Historically, we defined this legacy name, it would be nice to
2863 // remove it at some point. We've never exposed fine-grained names for
2864 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002865 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002866 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002867 case CK_Skylake:
2868 // FIXME: Historically, we defined this legacy name, it would be nice to
2869 // remove it at some point. This is the only fine-grained CPU macro in the
2870 // main intel CPU line, and it would be better to not have these and force
2871 // people to use ISA macros.
2872 defineCPUMacros(Builder, "skx");
2873 break;
Craig Topper449314e2013-08-20 07:09:39 +00002874 case CK_KNL:
2875 defineCPUMacros(Builder, "knl");
2876 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002877 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002878 Builder.defineMacro("__k6_2__");
2879 Builder.defineMacro("__tune_k6_2__");
2880 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002881 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002882 if (CPU != CK_K6_2) { // In case of fallthrough
2883 // FIXME: GCC may be enabling these in cases where some other k6
2884 // architecture is specified but -m3dnow is explicitly provided. The
2885 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002886 Builder.defineMacro("__k6_3__");
2887 Builder.defineMacro("__tune_k6_3__");
2888 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002889 // Fallthrough
2890 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002891 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002892 break;
2893 case CK_Athlon:
2894 case CK_AthlonThunderbird:
2895 case CK_Athlon4:
2896 case CK_AthlonXP:
2897 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002898 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002899 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002900 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002901 Builder.defineMacro("__tune_athlon_sse__");
2902 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002903 break;
2904 case CK_K8:
2905 case CK_K8SSE3:
2906 case CK_x86_64:
2907 case CK_Opteron:
2908 case CK_OpteronSSE3:
2909 case CK_Athlon64:
2910 case CK_Athlon64SSE3:
2911 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002912 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002913 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002914 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002915 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002916 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002917 case CK_BTVER1:
2918 defineCPUMacros(Builder, "btver1");
2919 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002920 case CK_BTVER2:
2921 defineCPUMacros(Builder, "btver2");
2922 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002923 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002924 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002925 break;
2926 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002927 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002928 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002929 case CK_BDVER3:
2930 defineCPUMacros(Builder, "bdver3");
2931 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002932 case CK_BDVER4:
2933 defineCPUMacros(Builder, "bdver4");
2934 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002935 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002936 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002937 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002938 }
Chris Lattner96e43572009-03-02 22:40:39 +00002939
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002940 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002941 Builder.defineMacro("__REGISTER_PREFIX__", "");
2942
Chris Lattner6df41af2009-04-19 17:32:33 +00002943 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2944 // functions in glibc header files that use FP Stack inline asm which the
2945 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002946 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002947
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002948 if (HasAES)
2949 Builder.defineMacro("__AES__");
2950
Craig Topper3f122a72012-05-31 05:18:48 +00002951 if (HasPCLMUL)
2952 Builder.defineMacro("__PCLMUL__");
2953
Craig Topper22967d42011-12-25 05:06:45 +00002954 if (HasLZCNT)
2955 Builder.defineMacro("__LZCNT__");
2956
Benjamin Kramer1e250392012-07-07 09:39:18 +00002957 if (HasRDRND)
2958 Builder.defineMacro("__RDRND__");
2959
Craig Topper8c7f2512014-11-03 06:51:41 +00002960 if (HasFSGSBASE)
2961 Builder.defineMacro("__FSGSBASE__");
2962
Craig Topper22967d42011-12-25 05:06:45 +00002963 if (HasBMI)
2964 Builder.defineMacro("__BMI__");
2965
2966 if (HasBMI2)
2967 Builder.defineMacro("__BMI2__");
2968
Craig Topper1de83482011-12-29 16:10:46 +00002969 if (HasPOPCNT)
2970 Builder.defineMacro("__POPCNT__");
2971
Michael Liao625a8752012-11-10 05:17:46 +00002972 if (HasRTM)
2973 Builder.defineMacro("__RTM__");
2974
Michael Liao74f4eaf2013-03-26 17:52:08 +00002975 if (HasPRFCHW)
2976 Builder.defineMacro("__PRFCHW__");
2977
Michael Liaoffaae352013-03-29 05:17:55 +00002978 if (HasRDSEED)
2979 Builder.defineMacro("__RDSEED__");
2980
Robert Khasanov50e6f582014-09-19 09:53:48 +00002981 if (HasADX)
2982 Builder.defineMacro("__ADX__");
2983
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002984 if (HasTBM)
2985 Builder.defineMacro("__TBM__");
2986
Rafael Espindolae62e2792013-08-20 13:44:29 +00002987 switch (XOPLevel) {
2988 case XOP:
2989 Builder.defineMacro("__XOP__");
2990 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002991 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002992 case SSE4A:
2993 Builder.defineMacro("__SSE4A__");
2994 case NoXOP:
2995 break;
2996 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002997
Craig Topperbba778b2012-06-03 21:46:30 +00002998 if (HasFMA)
2999 Builder.defineMacro("__FMA__");
3000
Manman Rena45358c2012-10-11 00:59:55 +00003001 if (HasF16C)
3002 Builder.defineMacro("__F16C__");
3003
Craig Topper679b53a2013-08-21 05:29:10 +00003004 if (HasAVX512CD)
3005 Builder.defineMacro("__AVX512CD__");
3006 if (HasAVX512ER)
3007 Builder.defineMacro("__AVX512ER__");
3008 if (HasAVX512PF)
3009 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003010 if (HasAVX512DQ)
3011 Builder.defineMacro("__AVX512DQ__");
3012 if (HasAVX512BW)
3013 Builder.defineMacro("__AVX512BW__");
3014 if (HasAVX512VL)
3015 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003016
Ben Langmuir58078d02013-09-19 13:22:04 +00003017 if (HasSHA)
3018 Builder.defineMacro("__SHA__");
3019
Nick Lewycky50e8f482013-10-05 20:14:27 +00003020 if (HasCX16)
3021 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3022
Chris Lattner96e43572009-03-02 22:40:39 +00003023 // Each case falls through to the previous one here.
3024 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003025 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003026 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003027 case AVX2:
3028 Builder.defineMacro("__AVX2__");
3029 case AVX:
3030 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003031 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003032 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003033 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003034 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003035 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003036 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003037 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003038 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003039 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003040 Builder.defineMacro("__SSE2__");
3041 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003042 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003043 Builder.defineMacro("__SSE__");
3044 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003045 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003046 break;
3047 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003048
Derek Schuffc7dd7222012-10-11 15:52:22 +00003049 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003050 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003051 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003052 case AVX2:
3053 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003054 case SSE42:
3055 case SSE41:
3056 case SSSE3:
3057 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003058 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003059 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003060 break;
3061 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003062 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003063 break;
3064 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003065 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003066 }
3067 }
3068
Anders Carlssone437c682010-01-27 03:47:49 +00003069 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003070 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003071 case AMD3DNowAthlon:
3072 Builder.defineMacro("__3dNOW_A__");
3073 case AMD3DNow:
3074 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003075 case MMX:
3076 Builder.defineMacro("__MMX__");
3077 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003078 break;
3079 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003080
3081 if (CPU >= CK_i486) {
3082 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3083 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3084 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3085 }
3086 if (CPU >= CK_i586)
3087 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003088}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003089
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003090bool X86TargetInfo::hasFeature(StringRef Feature) const {
3091 return llvm::StringSwitch<bool>(Feature)
3092 .Case("aes", HasAES)
3093 .Case("avx", SSELevel >= AVX)
3094 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003095 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003096 .Case("avx512cd", HasAVX512CD)
3097 .Case("avx512er", HasAVX512ER)
3098 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003099 .Case("avx512dq", HasAVX512DQ)
3100 .Case("avx512bw", HasAVX512BW)
3101 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003102 .Case("bmi", HasBMI)
3103 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003104 .Case("cx16", HasCX16)
3105 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003106 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003107 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003108 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003109 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003110 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3111 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3112 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003113 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003114 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003115 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003116 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003117 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003118 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003119 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003120 .Case("sse", SSELevel >= SSE1)
3121 .Case("sse2", SSELevel >= SSE2)
3122 .Case("sse3", SSELevel >= SSE3)
3123 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003124 .Case("sse4.1", SSELevel >= SSE41)
3125 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003126 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003127 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003128 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003129 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3130 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003132 .Default(false);
3133}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003134
Eli Friedman3fd920a2008-08-20 02:34:37 +00003135bool
Anders Carlsson58436352009-02-28 17:11:49 +00003136X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003137 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003138 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003139 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003140 case 'I':
3141 Info.setRequiresImmediate(0, 31);
3142 return true;
3143 case 'J':
3144 Info.setRequiresImmediate(0, 63);
3145 return true;
3146 case 'K':
3147 Info.setRequiresImmediate(-128, 127);
3148 return true;
3149 case 'L':
3150 // FIXME: properly analyze this constraint:
3151 // must be one of 0xff, 0xffff, or 0xffffffff
3152 return true;
3153 case 'M':
3154 Info.setRequiresImmediate(0, 3);
3155 return true;
3156 case 'N':
3157 Info.setRequiresImmediate(0, 255);
3158 return true;
3159 case 'O':
3160 Info.setRequiresImmediate(0, 127);
3161 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003162 case 'Y': // first letter of a pair:
3163 switch (*(Name+1)) {
3164 default: return false;
3165 case '0': // First SSE register.
3166 case 't': // Any SSE register, when SSE2 is enabled.
3167 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3168 case 'm': // any MMX register, when inter-unit moves enabled.
3169 break; // falls through to setAllowsRegister.
3170 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003171 case 'f': // any x87 floating point stack register.
3172 // Constraint 'f' cannot be used for output operands.
3173 if (Info.ConstraintStr[0] == '=')
3174 return false;
3175
3176 Info.setAllowsRegister();
3177 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003178 case 'a': // eax.
3179 case 'b': // ebx.
3180 case 'c': // ecx.
3181 case 'd': // edx.
3182 case 'S': // esi.
3183 case 'D': // edi.
3184 case 'A': // edx:eax.
3185 case 't': // top of floating point stack.
3186 case 'u': // second from top of floating point stack.
3187 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003188 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003189 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003190 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003191 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3192 case 'l': // "Index" registers: any general register that can be used as an
3193 // index in a base+index memory access.
3194 Info.setAllowsRegister();
3195 return true;
3196 case 'C': // SSE floating point constant.
3197 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003198 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003199 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003200 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003201 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003202 return true;
3203 }
3204}
3205
Akira Hatanaka974131e2014-09-18 18:17:18 +00003206bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3207 unsigned Size) const {
3208 // Strip off constraint modifiers.
3209 while (Constraint[0] == '=' ||
3210 Constraint[0] == '+' ||
3211 Constraint[0] == '&')
3212 Constraint = Constraint.substr(1);
3213
3214 return validateOperandSize(Constraint, Size);
3215}
3216
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003217bool X86TargetInfo::validateInputSize(StringRef Constraint,
3218 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003219 return validateOperandSize(Constraint, Size);
3220}
3221
3222bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3223 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003224 switch (Constraint[0]) {
3225 default: break;
3226 case 'y':
3227 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003228 case 'f':
3229 case 't':
3230 case 'u':
3231 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003232 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003233 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003234 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003235 }
3236
3237 return true;
3238}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003239
Eli Friedman3fd920a2008-08-20 02:34:37 +00003240std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003241X86TargetInfo::convertConstraint(const char *&Constraint) const {
3242 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003243 case 'a': return std::string("{ax}");
3244 case 'b': return std::string("{bx}");
3245 case 'c': return std::string("{cx}");
3246 case 'd': return std::string("{dx}");
3247 case 'S': return std::string("{si}");
3248 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003249 case 'p': // address
3250 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003251 case 't': // top of floating point stack.
3252 return std::string("{st}");
3253 case 'u': // second from top of floating point stack.
3254 return std::string("{st(1)}"); // second from top of floating point stack.
3255 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003256 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003257 }
3258}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003259} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003260
3261namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003262// X86-32 generic target
3263class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003264public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003265 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003266 DoubleAlign = LongLongAlign = 32;
3267 LongDoubleWidth = 96;
3268 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003269 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003270 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003271 SizeType = UnsignedInt;
3272 PtrDiffType = SignedInt;
3273 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003274 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003275
3276 // Use fpret for all types.
3277 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3278 (1 << TargetInfo::Double) |
3279 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003280
3281 // x86-32 has atomics up to 8 bytes
3282 // FIXME: Check that we actually have cmpxchg8b before setting
3283 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3284 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003285 }
Craig Topper3164f332014-03-11 03:39:26 +00003286 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003287 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003288 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003289
Craig Topper3164f332014-03-11 03:39:26 +00003290 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003291 if (RegNo == 0) return 0;
3292 if (RegNo == 1) return 2;
3293 return -1;
3294 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003295 bool validateOperandSize(StringRef Constraint,
3296 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003297 switch (Constraint[0]) {
3298 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003299 case 'R':
3300 case 'q':
3301 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003302 case 'a':
3303 case 'b':
3304 case 'c':
3305 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003306 case 'S':
3307 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003308 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003309 case 'A':
3310 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003311 }
3312
Akira Hatanaka974131e2014-09-18 18:17:18 +00003313 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003314 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003315};
3316} // end anonymous namespace
3317
3318namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003319class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3320public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003321 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3322 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003323
Craig Topper3164f332014-03-11 03:39:26 +00003324 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003325 unsigned Major, Minor, Micro;
3326 getTriple().getOSVersion(Major, Minor, Micro);
3327 // New NetBSD uses the default rounding mode.
3328 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3329 return X86_32TargetInfo::getFloatEvalMethod();
3330 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003331 return 1;
3332 }
3333};
3334} // end anonymous namespace
3335
3336namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003337class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3338public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003339 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3340 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003341 SizeType = UnsignedLong;
3342 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003343 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003344 }
3345};
3346} // end anonymous namespace
3347
3348namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003349class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003351 BitrigI386TargetInfo(const llvm::Triple &Triple)
3352 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003353 SizeType = UnsignedLong;
3354 IntPtrType = SignedLong;
3355 PtrDiffType = SignedLong;
3356 }
3357};
3358} // end anonymous namespace
3359
3360namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003361class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003362public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 DarwinI386TargetInfo(const llvm::Triple &Triple)
3364 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003365 LongDoubleWidth = 128;
3366 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003367 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003368 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003369 SizeType = UnsignedLong;
3370 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003371 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003372 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003373 }
3374
Eli Friedman3fd920a2008-08-20 02:34:37 +00003375};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003376} // end anonymous namespace
3377
3378namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003379// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003380class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003382 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3383 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003384 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003385 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003386 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003387 }
Craig Topper3164f332014-03-11 03:39:26 +00003388 void getTargetDefines(const LangOptions &Opts,
3389 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003390 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3391 }
3392};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003393
3394// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003395class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003396public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003397 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003398 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003399 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003400 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3401 }
Craig Topper3164f332014-03-11 03:39:26 +00003402 void getTargetDefines(const LangOptions &Opts,
3403 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003404 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3405 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3406 // The value of the following reflects processor type.
3407 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3408 // We lost the original triple, so we use the default.
3409 Builder.defineMacro("_M_IX86", "600");
3410 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003411};
3412} // end anonymous namespace
3413
Reid Kleckner47606832014-04-21 20:58:00 +00003414static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3415 Builder.defineMacro("__MSVCRT__");
3416 Builder.defineMacro("__MINGW32__");
3417
3418 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3419 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3420 // macro anyway for pre-processor compatibility.
3421 if (Opts.MicrosoftExt)
3422 Builder.defineMacro("__declspec", "__declspec");
3423 else
3424 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3425
3426 if (!Opts.MicrosoftExt) {
3427 // Provide macros for all the calling convention keywords. Provide both
3428 // single and double underscore prefixed variants. These are available on
3429 // x64 as well as x86, even though they have no effect.
3430 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3431 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003432 std::string GCCSpelling = "__attribute__((__";
3433 GCCSpelling += CC;
3434 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003435 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3436 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3437 }
3438 }
3439}
3440
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003441namespace {
3442// x86-32 MinGW target
3443class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3444public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003445 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3446 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003447 void getTargetDefines(const LangOptions &Opts,
3448 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003449 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003450 DefineStd(Builder, "WIN32", Opts);
3451 DefineStd(Builder, "WINNT", Opts);
3452 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003453 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003454 }
3455};
3456} // end anonymous namespace
3457
3458namespace {
3459// x86-32 Cygwin target
3460class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003462 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3463 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003464 TLSSupported = false;
3465 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003466 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003467 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003468 }
Craig Topper3164f332014-03-11 03:39:26 +00003469 void getTargetDefines(const LangOptions &Opts,
3470 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003471 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003472 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003473 Builder.defineMacro("__CYGWIN__");
3474 Builder.defineMacro("__CYGWIN32__");
3475 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003476 if (Opts.CPlusPlus)
3477 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003478 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003479};
3480} // end anonymous namespace
3481
3482namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003483// x86-32 Haiku target
3484class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3485public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003486 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003487 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003488 IntPtrType = SignedLong;
3489 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003490 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003491 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003492 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003493 }
Craig Topper3164f332014-03-11 03:39:26 +00003494 void getTargetDefines(const LangOptions &Opts,
3495 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003496 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3497 Builder.defineMacro("__INTEL__");
3498 Builder.defineMacro("__HAIKU__");
3499 }
3500};
3501} // end anonymous namespace
3502
Douglas Gregor9fabd852011-07-01 22:41:14 +00003503// RTEMS Target
3504template<typename Target>
3505class RTEMSTargetInfo : public OSTargetInfo<Target> {
3506protected:
Craig Topper3164f332014-03-11 03:39:26 +00003507 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3508 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003509 // RTEMS defines; list based off of gcc output
3510
Douglas Gregor9fabd852011-07-01 22:41:14 +00003511 Builder.defineMacro("__rtems__");
3512 Builder.defineMacro("__ELF__");
3513 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003514
Douglas Gregor9fabd852011-07-01 22:41:14 +00003515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003516 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3517 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003518
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003519 switch (Triple.getArch()) {
3520 default:
3521 case llvm::Triple::x86:
3522 // this->MCountName = ".mcount";
3523 break;
3524 case llvm::Triple::mips:
3525 case llvm::Triple::mipsel:
3526 case llvm::Triple::ppc:
3527 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003528 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003529 // this->MCountName = "_mcount";
3530 break;
3531 case llvm::Triple::arm:
3532 // this->MCountName = "__mcount";
3533 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003534 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003535 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003536};
3537
3538namespace {
3539// x86-32 RTEMS target
3540class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3541public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003542 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003543 SizeType = UnsignedLong;
3544 IntPtrType = SignedLong;
3545 PtrDiffType = SignedLong;
3546 this->UserLabelPrefix = "";
3547 }
Craig Topper3164f332014-03-11 03:39:26 +00003548 void getTargetDefines(const LangOptions &Opts,
3549 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003550 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3551 Builder.defineMacro("__INTEL__");
3552 Builder.defineMacro("__rtems__");
3553 }
3554};
3555} // end anonymous namespace
3556
Chris Lattnerb986aba2010-04-11 19:29:39 +00003557namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003558// x86-64 generic target
3559class X86_64TargetInfo : public X86TargetInfo {
3560public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003561 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003562 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003563 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003564 LongDoubleWidth = 128;
3565 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003566 LargeArrayMinWidth = 128;
3567 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003568 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003569 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3570 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3571 IntPtrType = IsX32 ? SignedInt : SignedLong;
3572 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003573 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003574 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003575
Eric Christopher917e9522014-11-18 22:36:15 +00003576 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003577 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003578 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3579 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003580
3581 // Use fpret only for long double.
3582 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003583
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003584 // Use fp2ret for _Complex long double.
3585 ComplexLongDoubleUsesFP2Ret = true;
3586
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003587 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003588 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003589 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003590 }
Craig Topper3164f332014-03-11 03:39:26 +00003591 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003592 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003593 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003594
Craig Topper3164f332014-03-11 03:39:26 +00003595 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003596 if (RegNo == 0) return 0;
3597 if (RegNo == 1) return 1;
3598 return -1;
3599 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003600
Craig Topper3164f332014-03-11 03:39:26 +00003601 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003602 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003603 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003604 CC == CC_IntelOclBicc ||
3605 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003606 }
3607
Craig Topper3164f332014-03-11 03:39:26 +00003608 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003609 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003610 }
3611
Pavel Chupinfd223e12014-08-04 12:39:43 +00003612 // for x32 we need it here explicitly
3613 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003614};
3615} // end anonymous namespace
3616
3617namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003618// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003619class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003620public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003621 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3622 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003623 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003624 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003625 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003626 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003627 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003628 SizeType = UnsignedLongLong;
3629 PtrDiffType = SignedLongLong;
3630 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003631 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003632 }
Craig Topper3164f332014-03-11 03:39:26 +00003633 void getTargetDefines(const LangOptions &Opts,
3634 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003635 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003636 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003637 }
Craig Topper3164f332014-03-11 03:39:26 +00003638 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003639 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003640 }
Craig Topper3164f332014-03-11 03:39:26 +00003641 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003642 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003643 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003644 CC == CC_IntelOclBicc ||
3645 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3646 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003647};
3648} // end anonymous namespace
3649
3650namespace {
3651// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003652class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003653public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003654 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003655 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003656 LongDoubleWidth = LongDoubleAlign = 64;
3657 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003658 }
Craig Topper3164f332014-03-11 03:39:26 +00003659 void getTargetDefines(const LangOptions &Opts,
3660 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003661 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3662 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003663 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003664 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003665 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003666};
3667} // end anonymous namespace
3668
3669namespace {
3670// x86-64 MinGW target
3671class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3672public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003673 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3674 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003675 void getTargetDefines(const LangOptions &Opts,
3676 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003677 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003678 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003679 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003680 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003681
3682 // GCC defines this macro when it is using __gxx_personality_seh0.
3683 if (!Opts.SjLjExceptions)
3684 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003685 }
3686};
3687} // end anonymous namespace
3688
3689namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003690class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3691public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003692 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3693 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003694 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003695 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003696 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3697 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003698 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003699 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003700 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003701 }
3702};
3703} // end anonymous namespace
3704
3705namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003706class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3707public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003708 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3709 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003710 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003711 Int64Type = SignedLongLong;
3712 }
3713};
3714} // end anonymous namespace
3715
3716namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003717class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3718public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003719 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3720 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3721 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003722 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003723 }
3724};
Tim Northover9bb857a2013-01-31 12:13:10 +00003725}
3726
Eli Friedman9fa28852012-08-08 23:57:20 +00003727
3728namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003729class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003730 // Possible FPU choices.
3731 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003732 VFP2FPU = (1 << 0),
3733 VFP3FPU = (1 << 1),
3734 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003735 NeonFPU = (1 << 3),
3736 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003737 };
3738
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003739 // Possible HWDiv features.
3740 enum HWDivMode {
3741 HWDivThumb = (1 << 0),
3742 HWDivARM = (1 << 1)
3743 };
3744
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003745 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003746 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003747 }
3748
3749 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3750 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003751
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003752 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003753
Rafael Espindolaeb265472013-08-21 21:59:03 +00003754 enum {
3755 FP_Default,
3756 FP_VFP,
3757 FP_Neon
3758 } FPMath;
3759
Bernard Ogdenda13af32013-10-24 18:32:51 +00003760 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003761
Logan Chien57086ce2012-10-10 06:56:20 +00003762 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003763 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003764 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003765
3766 // Initialized via features.
3767 unsigned SoftFloat : 1;
3768 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003769
Bernard Ogden18b57012013-10-29 09:47:51 +00003770 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003771 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003772
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003773 // ACLE 6.5.1 Hardware floating point
3774 enum {
3775 HW_FP_HP = (1 << 1), /// half (16-bit)
3776 HW_FP_SP = (1 << 2), /// single (32-bit)
3777 HW_FP_DP = (1 << 3), /// double (64-bit)
3778 };
3779 uint32_t HW_FP;
3780
Chris Lattner5cc15e02010-03-03 19:03:45 +00003781 static const Builtin::Info BuiltinInfo[];
3782
Rafael Espindola101d5b92013-05-13 20:09:47 +00003783 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003784 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003785 if (T.getArch() == llvm::Triple::arm ||
3786 T.getArch() == llvm::Triple::armeb) {
3787 StringRef VersionStr;
3788 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003789 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003790 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003791 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003792 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003793 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003794 unsigned Version;
3795 if (VersionStr.getAsInteger(10, Version))
3796 return false;
3797 return Version >= 6;
3798 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003799 assert(T.getArch() == llvm::Triple::thumb ||
3800 T.getArch() == llvm::Triple::thumbeb);
3801 StringRef VersionStr;
3802 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003803 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003804 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003805 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003806 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003807 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003808 unsigned Version;
3809 if (VersionStr.getAsInteger(10, Version))
3810 return false;
3811 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003812 }
3813
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003814 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003815 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003816
3817 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003818 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003819
Tim Northover00853e52014-08-05 11:07:26 +00003820 // size_t is unsigned long on MachO-derived environments and NetBSD.
3821 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003822 SizeType = UnsignedLong;
3823 else
3824 SizeType = UnsignedInt;
3825
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003826 switch (T.getOS()) {
3827 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003828 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003829 break;
3830 case llvm::Triple::Win32:
3831 WCharType = UnsignedShort;
3832 break;
3833 case llvm::Triple::Linux:
3834 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003835 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3836 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003837 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003838 }
3839
3840 UseBitFieldTypeAlignment = true;
3841
3842 ZeroLengthBitfieldBoundary = 0;
3843
Tim Northover147cd2f2014-10-14 22:12:21 +00003844 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3845 // so set preferred for small types to 32.
3846 if (T.isOSBinFormatMachO()) {
3847 DescriptionString =
3848 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3849 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3850 } else if (T.isOSWindows()) {
3851 // FIXME: this is invalid for WindowsCE
3852 assert(!BigEndian && "Windows on ARM does not support big endian");
3853 DescriptionString = "e"
3854 "-m:e"
3855 "-p:32:32"
3856 "-i64:64"
3857 "-v128:64:128"
3858 "-a:0:32"
3859 "-n32"
3860 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003861 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003862 DescriptionString =
3863 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3864 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003865 }
3866
3867 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003868 }
3869
3870 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003871 const llvm::Triple &T = getTriple();
3872
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003873 IsAAPCS = false;
3874
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003875 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003876
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003877 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003878 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003879 SizeType = UnsignedInt;
3880 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003881 SizeType = UnsignedLong;
3882
3883 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3884 WCharType = SignedInt;
3885
3886 // Do not respect the alignment of bit-field types when laying out
3887 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3888 UseBitFieldTypeAlignment = false;
3889
3890 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3891 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3892 /// gcc.
3893 ZeroLengthBitfieldBoundary = 32;
3894
Tim Northover147cd2f2014-10-14 22:12:21 +00003895 if (T.isOSBinFormatMachO())
3896 DescriptionString =
3897 BigEndian
3898 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3899 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3900 else
3901 DescriptionString =
3902 BigEndian
3903 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3904 : "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 +00003905
3906 // FIXME: Override "preferred align" for double and long long.
3907 }
3908
Chris Lattner17df24e2008-04-21 18:56:49 +00003909public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003910 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003911 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003912 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003913 BigEndian = IsBigEndian;
3914
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003915 switch (getTriple().getOS()) {
3916 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003917 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003918 break;
3919 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003920 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003921 break;
3922 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003923
Chris Lattner1a8f3942010-04-23 16:29:58 +00003924 // {} in inline assembly are neon specifiers, not assembly variant
3925 // specifiers.
3926 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003927
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003928 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003929 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003930
Eric Christopher0e261882014-12-05 01:06:59 +00003931 // FIXME: This duplicates code from the driver that sets the -target-abi
3932 // option - this code is used if -target-abi isn't passed and should
3933 // be unified in some way.
3934 if (Triple.isOSBinFormatMachO()) {
3935 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3936 // the frontend matches that.
3937 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3938 Triple.getOS() == llvm::Triple::UnknownOS ||
3939 StringRef(CPU).startswith("cortex-m")) {
3940 setABI("aapcs");
3941 } else {
3942 setABI("apcs-gnu");
3943 }
3944 } else if (Triple.isOSWindows()) {
3945 // FIXME: this is invalid for WindowsCE
3946 setABI("aapcs");
3947 } else {
3948 // Select the default based on the platform.
3949 switch (Triple.getEnvironment()) {
3950 case llvm::Triple::Android:
3951 case llvm::Triple::GNUEABI:
3952 case llvm::Triple::GNUEABIHF:
3953 setABI("aapcs-linux");
3954 break;
3955 case llvm::Triple::EABIHF:
3956 case llvm::Triple::EABI:
3957 setABI("aapcs");
3958 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003959 case llvm::Triple::GNU:
3960 setABI("apcs-gnu");
3961 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003962 default:
3963 if (Triple.getOS() == llvm::Triple::NetBSD)
3964 setABI("apcs-gnu");
3965 else
3966 setABI("aapcs");
3967 break;
3968 }
3969 }
John McCall86353412010-08-21 22:46:04 +00003970
3971 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003972 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003973
3974 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003975 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003976 if (shouldUseInlineAtomic(getTriple()))
3977 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003978
3979 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003980 // the alignment of the zero-length bitfield is greater than the member
3981 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003982 // zero length bitfield.
3983 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003984 }
Alp Toker4925ba72014-06-07 23:30:42 +00003985 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003986 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003987 ABI = Name;
3988
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003989 // The defaults (above) are for AAPCS, check if we need to change them.
3990 //
3991 // FIXME: We need support for -meabi... we could just mangle it into the
3992 // name.
3993 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003994 setABIAPCS();
3995 return true;
3996 }
3997 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3998 setABIAAPCS();
3999 return true;
4000 }
4001 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004002 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004003
Craig Topper3164f332014-03-11 03:39:26 +00004004 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004005 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004006 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4007 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004008 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004009 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004010 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004011 }
4012 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004013 Features["vfp4"] = true;
4014 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004015 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4016 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004017 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004018 Features["vfp4"] = true;
4019 Features["neon"] = true;
4020 Features["hwdiv"] = true;
4021 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004022 } else if (CPU == "cyclone") {
4023 Features["v8fp"] = true;
4024 Features["neon"] = true;
4025 Features["hwdiv"] = true;
4026 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004027 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004028 Features["fp-armv8"] = true;
4029 Features["neon"] = true;
4030 Features["hwdiv"] = true;
4031 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004032 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004033 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004034 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004035 // Enable the hwdiv extension for all v8a AArch32 cores by
4036 // default.
4037 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004038 ArchName == "armebv8a" || ArchName == "armebv8" ||
4039 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4040 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004041 Features["hwdiv"] = true;
4042 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004043 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004044 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004045 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004046 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004047
Craig Topper3164f332014-03-11 03:39:26 +00004048 bool handleTargetFeatures(std::vector<std::string> &Features,
4049 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004050 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004051 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004052 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004053 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004054 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004055
4056 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004057 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004058 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004059 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004060 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004061 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004062 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004063 HW_FP = HW_FP_SP | HW_FP_DP;
4064 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004065 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004066 HW_FP = HW_FP_SP | HW_FP_DP;
4067 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004068 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004069 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4070 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004071 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004072 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4073 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004074 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004075 HW_FP = HW_FP_SP | HW_FP_DP;
4076 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004077 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004078 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004079 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004080 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004081 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004082 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004083 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004084 } else if (Feature == "+fp-only-sp") {
4085 HW_FP &= ~HW_FP_DP;
4086 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004087 }
4088
Rafael Espindolaeb265472013-08-21 21:59:03 +00004089 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4090 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4091 return false;
4092 }
4093
4094 if (FPMath == FP_Neon)
4095 Features.push_back("+neonfp");
4096 else if (FPMath == FP_VFP)
4097 Features.push_back("-neonfp");
4098
Daniel Dunbar893d4752009-12-19 04:15:38 +00004099 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004100 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4101 for (const auto &FEFeature : FrontEndFeatures) {
4102 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4103 if (Feature != Features.end())
4104 Features.erase(Feature);
4105 }
4106
Rafael Espindolaeb265472013-08-21 21:59:03 +00004107 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004108 }
4109
Craig Topper3164f332014-03-11 03:39:26 +00004110 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004111 return llvm::StringSwitch<bool>(Feature)
4112 .Case("arm", true)
4113 .Case("softfloat", SoftFloat)
4114 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004115 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004116 .Case("hwdiv", HWDiv & HWDivThumb)
4117 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004118 .Default(false);
4119 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004120 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004121 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004122 return llvm::StringSwitch<const char *>(Name)
4123 .Cases("arm8", "arm810", "4")
4124 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4125 "4")
4126 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4127 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4128 .Case("ep9312", "4T")
4129 .Cases("arm10tdmi", "arm1020t", "5T")
4130 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4131 .Case("arm926ej-s", "5TEJ")
4132 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4133 .Cases("xscale", "iwmmxt", "5TE")
4134 .Case("arm1136j-s", "6J")
4135 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4136 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4137 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4138 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4139 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4140 "7A")
4141 .Cases("cortex-r4", "cortex-r5", "7R")
4142 .Case("swift", "7S")
4143 .Case("cyclone", "8A")
4144 .Case("cortex-m3", "7M")
4145 .Cases("cortex-m4", "cortex-m7", "7EM")
4146 .Case("cortex-m0", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004147 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004148 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004149 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004150 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004151 return llvm::StringSwitch<const char *>(Name)
4152 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4153 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4154 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004155 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Eric Christopher917e9522014-11-18 22:36:15 +00004156 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4157 .Cases("cortex-r4", "cortex-r5", "R")
4158 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004159 }
Craig Topper3164f332014-03-11 03:39:26 +00004160 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004161 if (!getCPUDefineSuffix(Name))
4162 return false;
4163
Tim Northovere8c37212014-07-09 09:24:43 +00004164 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4165 StringRef Profile = getCPUProfile(Name);
4166 if (Profile == "M" && MaxAtomicInlineWidth) {
4167 MaxAtomicPromoteWidth = 32;
4168 MaxAtomicInlineWidth = 32;
4169 }
4170
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004171 CPU = Name;
4172 return true;
4173 }
Craig Topper3164f332014-03-11 03:39:26 +00004174 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004175 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4176 unsigned CPUArchVer) const {
4177 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4178 (CPUArch.find('M') != StringRef::npos);
4179 }
4180 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4181 unsigned CPUArchVer) const {
4182 // We check both CPUArchVer and ArchName because when only triple is
4183 // specified, the default CPU is arm1136j-s.
4184 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4185 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4186 }
Craig Topper3164f332014-03-11 03:39:26 +00004187 void getTargetDefines(const LangOptions &Opts,
4188 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004189 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004190 Builder.defineMacro("__arm");
4191 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004192
Chris Lattnerecd49032009-03-02 22:27:17 +00004193 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004194 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004195
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004196 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004197 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004198 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004199 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004200 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004201
4202 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004203 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004204 StringRef ArchName = getTriple().getArchName();
4205
4206 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4207 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004208 if (CPUArch[0] >= '8') {
4209 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4210 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004211 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004212
4213 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4214 // is not defined for the M-profile.
4215 // NOTE that the deffault profile is assumed to be 'A'
4216 if (CPUProfile.empty() || CPUProfile != "M")
4217 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4218
4219 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4220 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4221 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4222 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4223 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4224 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4225 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4226
4227 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4228 // instruction set such as ARM or Thumb.
4229 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4230
4231 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4232
4233 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004234 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004235 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004236
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004237 // ACLE 6.5.1 Hardware Floating Point
4238 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004239 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004240
Yi Konga44c4d72014-06-27 21:25:42 +00004241 // ACLE predefines.
4242 Builder.defineMacro("__ARM_ACLE", "200");
4243
Mike Stump9d54bd72009-04-08 02:07:04 +00004244 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004245
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004246 // FIXME: It's more complicated than this and we don't really support
4247 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004248 // Windows on ARM does not "support" interworking
4249 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004250 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004251
David Tweed8f676532012-10-25 13:33:01 +00004252 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004253 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004254 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4255 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004256 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004257 Builder.defineMacro("__ARM_PCS", "1");
4258
David Tweed8f676532012-10-25 13:33:01 +00004259 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004260 Builder.defineMacro("__ARM_PCS_VFP", "1");
4261 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004262
Daniel Dunbar893d4752009-12-19 04:15:38 +00004263 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004264 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004265
4266 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004267 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004268
4269 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004270 Builder.defineMacro("__THUMBEL__");
4271 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004272 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004273 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004274 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004275 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4276 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004277
4278 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004279 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004280
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004281 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004282 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004283 if (FPU & VFP2FPU)
4284 Builder.defineMacro("__ARM_VFPV2__");
4285 if (FPU & VFP3FPU)
4286 Builder.defineMacro("__ARM_VFPV3__");
4287 if (FPU & VFP4FPU)
4288 Builder.defineMacro("__ARM_VFPV4__");
4289 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004290
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004291 // This only gets set when Neon instructions are actually available, unlike
4292 // the VFP define, hence the soft float and arch check. This is subtly
4293 // different from gcc, we follow the intent which was that it should be set
4294 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004295 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4296 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004297 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004298 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004299
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004300 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4301 Opts.ShortWChar ? "2" : "4");
4302
4303 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4304 Opts.ShortEnums ? "1" : "4");
4305
Bernard Ogden18b57012013-10-29 09:47:51 +00004306 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004307 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004308
Tim Northover02e38602014-02-03 17:28:04 +00004309 if (Crypto)
4310 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4311
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004312 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4314 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4315 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4316 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4317 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004318
4319 bool is5EOrAbove = (CPUArchVer >= 6 ||
4320 (CPUArchVer == 5 &&
4321 CPUArch.find('E') != StringRef::npos));
4322 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4323 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4324 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004325 }
Craig Topper3164f332014-03-11 03:39:26 +00004326 void getTargetBuiltins(const Builtin::Info *&Records,
4327 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004328 Records = BuiltinInfo;
4329 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004330 }
Craig Topper3164f332014-03-11 03:39:26 +00004331 bool isCLZForZeroUndef() const override { return false; }
4332 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004333 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004334 }
Craig Topper3164f332014-03-11 03:39:26 +00004335 void getGCCRegNames(const char * const *&Names,
4336 unsigned &NumNames) const override;
4337 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4338 unsigned &NumAliases) const override;
4339 bool validateAsmConstraint(const char *&Name,
4340 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004341 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004342 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004343 case 'l': // r0-r7
4344 case 'h': // r8-r15
4345 case 'w': // VFP Floating point register single precision
4346 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004347 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004348 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004349 case 'I':
4350 case 'J':
4351 case 'K':
4352 case 'L':
4353 case 'M':
4354 // FIXME
4355 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004356 case 'Q': // A memory address that is a single base register.
4357 Info.setAllowsMemory();
4358 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004359 case 'U': // a memory reference...
4360 switch (Name[1]) {
4361 case 'q': // ...ARMV4 ldrsb
4362 case 'v': // ...VFP load/store (reg+constant offset)
4363 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004364 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004365 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004366 case 'n': // valid address for Neon doubleword vector load/store
4367 case 'm': // valid address for Neon element and structure load/store
4368 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004369 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004370 Info.setAllowsMemory();
4371 Name++;
4372 return true;
4373 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004374 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004375 return false;
4376 }
Craig Topper3164f332014-03-11 03:39:26 +00004377 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004378 std::string R;
4379 switch (*Constraint) {
4380 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004381 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004382 Constraint++;
4383 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004384 case 'p': // 'p' should be translated to 'r' by default.
4385 R = std::string("r");
4386 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004387 default:
4388 return std::string(1, *Constraint);
4389 }
4390 return R;
4391 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004392 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004393 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004394 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004395 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004396 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004397
Bill Wendling9d1ee112012-10-25 23:28:48 +00004398 // Strip off constraint modifiers.
4399 while (Constraint[0] == '=' ||
4400 Constraint[0] == '+' ||
4401 Constraint[0] == '&')
4402 Constraint = Constraint.substr(1);
4403
4404 switch (Constraint[0]) {
4405 default: break;
4406 case 'r': {
4407 switch (Modifier) {
4408 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004409 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004410 case 'q':
4411 // A register of size 32 cannot fit a vector type.
4412 return false;
4413 }
4414 }
4415 }
4416
4417 return true;
4418 }
Craig Topper3164f332014-03-11 03:39:26 +00004419 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004420 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004421 return "";
4422 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004423
Craig Topper3164f332014-03-11 03:39:26 +00004424 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004425 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4426 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004427
Craig Topper3164f332014-03-11 03:39:26 +00004428 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004429 if (RegNo == 0) return 0;
4430 if (RegNo == 1) return 1;
4431 return -1;
4432 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004433};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004434
Rafael Espindolaeb265472013-08-21 21:59:03 +00004435bool ARMTargetInfo::setFPMath(StringRef Name) {
4436 if (Name == "neon") {
4437 FPMath = FP_Neon;
4438 return true;
4439 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4440 Name == "vfp4") {
4441 FPMath = FP_VFP;
4442 return true;
4443 }
4444 return false;
4445}
4446
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004447const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004448 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004449 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004450 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4451
4452 // Float registers
4453 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4454 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4455 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004456 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004457
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004458 // Double registers
4459 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4460 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004461 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4462 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004463
4464 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004465 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4466 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004467};
4468
4469void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004470 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004471 Names = GCCRegNames;
4472 NumNames = llvm::array_lengthof(GCCRegNames);
4473}
4474
4475const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004476 { { "a1" }, "r0" },
4477 { { "a2" }, "r1" },
4478 { { "a3" }, "r2" },
4479 { { "a4" }, "r3" },
4480 { { "v1" }, "r4" },
4481 { { "v2" }, "r5" },
4482 { { "v3" }, "r6" },
4483 { { "v4" }, "r7" },
4484 { { "v5" }, "r8" },
4485 { { "v6", "rfp" }, "r9" },
4486 { { "sl" }, "r10" },
4487 { { "fp" }, "r11" },
4488 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004489 { { "r13" }, "sp" },
4490 { { "r14" }, "lr" },
4491 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004492 // The S, D and Q registers overlap, but aren't really aliases; we
4493 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004494};
4495
4496void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4497 unsigned &NumAliases) const {
4498 Aliases = GCCRegAliases;
4499 NumAliases = llvm::array_lengthof(GCCRegAliases);
4500}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004501
4502const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004503#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004504#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004505 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004506#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004507
4508#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004509#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004510#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4511 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004512#include "clang/Basic/BuiltinsARM.def"
4513};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004514
4515class ARMleTargetInfo : public ARMTargetInfo {
4516public:
4517 ARMleTargetInfo(const llvm::Triple &Triple)
4518 : ARMTargetInfo(Triple, false) { }
4519 virtual void getTargetDefines(const LangOptions &Opts,
4520 MacroBuilder &Builder) const {
4521 Builder.defineMacro("__ARMEL__");
4522 ARMTargetInfo::getTargetDefines(Opts, Builder);
4523 }
4524};
4525
4526class ARMbeTargetInfo : public ARMTargetInfo {
4527public:
4528 ARMbeTargetInfo(const llvm::Triple &Triple)
4529 : ARMTargetInfo(Triple, true) { }
4530 virtual void getTargetDefines(const LangOptions &Opts,
4531 MacroBuilder &Builder) const {
4532 Builder.defineMacro("__ARMEB__");
4533 Builder.defineMacro("__ARM_BIG_ENDIAN");
4534 ARMTargetInfo::getTargetDefines(Opts, Builder);
4535 }
4536};
Chris Lattner17df24e2008-04-21 18:56:49 +00004537} // end anonymous namespace.
4538
Eli Friedmanf05b7722008-08-20 07:44:10 +00004539namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004540class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4541 const llvm::Triple Triple;
4542public:
4543 WindowsARMTargetInfo(const llvm::Triple &Triple)
4544 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4545 TLSSupported = false;
4546 WCharType = UnsignedShort;
4547 SizeType = UnsignedInt;
4548 UserLabelPrefix = "";
4549 }
4550 void getVisualStudioDefines(const LangOptions &Opts,
4551 MacroBuilder &Builder) const {
4552 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4553
4554 // FIXME: this is invalid for WindowsCE
4555 Builder.defineMacro("_M_ARM_NT", "1");
4556 Builder.defineMacro("_M_ARMT", "_M_ARM");
4557 Builder.defineMacro("_M_THUMB", "_M_ARM");
4558
4559 assert((Triple.getArch() == llvm::Triple::arm ||
4560 Triple.getArch() == llvm::Triple::thumb) &&
4561 "invalid architecture for Windows ARM target info");
4562 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4563 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4564
4565 // TODO map the complete set of values
4566 // 31: VFPv3 40: VFPv4
4567 Builder.defineMacro("_M_ARM_FP", "31");
4568 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004569 BuiltinVaListKind getBuiltinVaListKind() const override {
4570 return TargetInfo::CharPtrBuiltinVaList;
4571 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004572};
4573
4574// Windows ARM + Itanium C++ ABI Target
4575class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4576public:
4577 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4578 : WindowsARMTargetInfo(Triple) {
4579 TheCXXABI.set(TargetCXXABI::GenericARM);
4580 }
4581
4582 void getTargetDefines(const LangOptions &Opts,
4583 MacroBuilder &Builder) const override {
4584 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4585
4586 if (Opts.MSVCCompat)
4587 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4588 }
4589};
4590
4591// Windows ARM, MS (C++) ABI
4592class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4593public:
4594 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4595 : WindowsARMTargetInfo(Triple) {
4596 TheCXXABI.set(TargetCXXABI::Microsoft);
4597 }
4598
4599 void getTargetDefines(const LangOptions &Opts,
4600 MacroBuilder &Builder) const override {
4601 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4602 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4603 }
4604};
4605}
4606
4607
4608namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004609class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004610 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004611protected:
Craig Topper3164f332014-03-11 03:39:26 +00004612 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4613 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004614 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004615 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004616
Torok Edwinb2b37c62009-06-30 17:10:35 +00004617public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004618 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004619 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004620 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004621 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004622 // FIXME: This should be based off of the target features in
4623 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004624 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004625
4626 // Darwin on iOS uses a variant of the ARM C++ ABI.
4627 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004628 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004629};
4630} // end anonymous namespace.
4631
Tony Linthicum76329bf2011-12-12 21:14:55 +00004632
4633namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004634class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004635 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004636 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4637 static const char *const GCCRegNames[];
4638
James Molloy75f5f9e2014-04-16 15:33:48 +00004639 enum FPUModeEnum {
4640 FPUMode,
4641 NeonMode
4642 };
4643
4644 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004645 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004646 unsigned Crypto;
4647
Tim Northovera2ee4332014-03-29 15:09:45 +00004648 static const Builtin::Info BuiltinInfo[];
4649
4650 std::string ABI;
4651
4652public:
Tim Northover573cbee2014-05-24 12:52:07 +00004653 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004654 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004655
4656 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4657 WCharType = SignedInt;
4658
4659 // NetBSD apparently prefers consistency across ARM targets to consistency
4660 // across 64-bit targets.
4661 Int64Type = SignedLongLong;
4662 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004663 } else {
4664 WCharType = UnsignedInt;
4665 Int64Type = SignedLong;
4666 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004667 }
4668
Tim Northovera2ee4332014-03-29 15:09:45 +00004669 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004670 MaxVectorAlign = 128;
4671 RegParmMax = 8;
4672 MaxAtomicInlineWidth = 128;
4673 MaxAtomicPromoteWidth = 128;
4674
4675 LongDoubleWidth = LongDoubleAlign = 128;
4676 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4677
Tim Northovera2ee4332014-03-29 15:09:45 +00004678 // {} in inline assembly are neon specifiers, not assembly variant
4679 // specifiers.
4680 NoAsmVariants = true;
4681
Tim Northover7ad87af2015-01-16 18:44:04 +00004682 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4683 // contributes to the alignment of the containing aggregate in the same way
4684 // a plain (non bit-field) member of that type would, without exception for
4685 // zero-sized or anonymous bit-fields."
4686 UseBitFieldTypeAlignment = true;
4687 UseZeroLengthBitfieldAlignment = true;
4688
Tim Northover573cbee2014-05-24 12:52:07 +00004689 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004690 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4691 }
4692
Alp Toker4925ba72014-06-07 23:30:42 +00004693 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004694 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004695 if (Name != "aapcs" && Name != "darwinpcs")
4696 return false;
4697
4698 ABI = Name;
4699 return true;
4700 }
4701
David Blaikie1cbb9712014-11-14 19:09:44 +00004702 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004703 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004704 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004705 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004706 .Case("cyclone", true)
4707 .Default(false);
4708 return CPUKnown;
4709 }
4710
4711 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004712 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004713 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004714 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004715
4716 // Target properties.
4717 Builder.defineMacro("_LP64");
4718 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004719
4720 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4721 Builder.defineMacro("__ARM_ACLE", "200");
4722 Builder.defineMacro("__ARM_ARCH", "8");
4723 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4724
4725 Builder.defineMacro("__ARM_64BIT_STATE");
4726 Builder.defineMacro("__ARM_PCS_AAPCS64");
4727 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4728
4729 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4730 Builder.defineMacro("__ARM_FEATURE_CLZ");
4731 Builder.defineMacro("__ARM_FEATURE_FMA");
4732 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004733 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4734 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4735 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4736 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004737
4738 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4739
4740 // 0xe implies support for half, single and double precision operations.
4741 Builder.defineMacro("__ARM_FP", "0xe");
4742
4743 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4744 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4745 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4746
4747 if (Opts.FastMath || Opts.FiniteMathOnly)
4748 Builder.defineMacro("__ARM_FP_FAST");
4749
Richard Smithab506ad2014-10-20 23:26:58 +00004750 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004751 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4752
4753 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4754
4755 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4756 Opts.ShortEnums ? "1" : "4");
4757
James Molloy75f5f9e2014-04-16 15:33:48 +00004758 if (FPU == NeonMode) {
4759 Builder.defineMacro("__ARM_NEON");
4760 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004761 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004762 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004763
Bradley Smith418c5932014-05-02 15:17:51 +00004764 if (CRC)
4765 Builder.defineMacro("__ARM_FEATURE_CRC32");
4766
James Molloy75f5f9e2014-04-16 15:33:48 +00004767 if (Crypto)
4768 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004769 }
4770
4771 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004772 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004773 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004774 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004775 }
4776
David Blaikie1cbb9712014-11-14 19:09:44 +00004777 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004778 return Feature == "aarch64" ||
4779 Feature == "arm64" ||
4780 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004781 }
4782
James Molloy5e73df52014-04-16 15:06:20 +00004783 bool handleTargetFeatures(std::vector<std::string> &Features,
4784 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004785 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004786 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004787 Crypto = 0;
4788 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4789 if (Features[i] == "+neon")
4790 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004791 if (Features[i] == "+crc")
4792 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004793 if (Features[i] == "+crypto")
4794 Crypto = 1;
4795 }
4796
James Molloy5e73df52014-04-16 15:06:20 +00004797 setDescriptionString();
4798
4799 return true;
4800 }
4801
David Blaikie1cbb9712014-11-14 19:09:44 +00004802 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004803
David Blaikie1cbb9712014-11-14 19:09:44 +00004804 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004805 return TargetInfo::AArch64ABIBuiltinVaList;
4806 }
4807
4808 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004809 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004810 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004811 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004812
Eric Christopher917e9522014-11-18 22:36:15 +00004813 virtual bool
4814 validateAsmConstraint(const char *&Name,
4815 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004816 switch (*Name) {
4817 default:
4818 return false;
4819 case 'w': // Floating point and SIMD registers (V0-V31)
4820 Info.setAllowsRegister();
4821 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004822 case 'I': // Constant that can be used with an ADD instruction
4823 case 'J': // Constant that can be used with a SUB instruction
4824 case 'K': // Constant that can be used with a 32-bit logical instruction
4825 case 'L': // Constant that can be used with a 64-bit logical instruction
4826 case 'M': // Constant that can be used as a 32-bit MOV immediate
4827 case 'N': // Constant that can be used as a 64-bit MOV immediate
4828 case 'Y': // Floating point constant zero
4829 case 'Z': // Integer constant zero
4830 return true;
4831 case 'Q': // A memory reference with base register and no offset
4832 Info.setAllowsMemory();
4833 return true;
4834 case 'S': // A symbolic address
4835 Info.setAllowsRegister();
4836 return true;
4837 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004838 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4839 // Utf: A memory address suitable for ldp/stp in TF mode.
4840 // Usa: An absolute symbolic address.
4841 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4842 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004843 case 'z': // Zero register, wzr or xzr
4844 Info.setAllowsRegister();
4845 return true;
4846 case 'x': // Floating point and SIMD registers (V0-V15)
4847 Info.setAllowsRegister();
4848 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004849 }
4850 return false;
4851 }
4852
Akira Hatanaka987f1862014-08-22 06:05:21 +00004853 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004854 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004855 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004856 // Strip off constraint modifiers.
4857 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4858 Constraint = Constraint.substr(1);
4859
4860 switch (Constraint[0]) {
4861 default:
4862 return true;
4863 case 'z':
4864 case 'r': {
4865 switch (Modifier) {
4866 case 'x':
4867 case 'w':
4868 // For now assume that the person knows what they're
4869 // doing with the modifier.
4870 return true;
4871 default:
4872 // By default an 'r' constraint will be in the 'x'
4873 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004874 if (Size == 64)
4875 return true;
4876
4877 SuggestedModifier = "w";
4878 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004879 }
4880 }
4881 }
4882 }
4883
David Blaikie1cbb9712014-11-14 19:09:44 +00004884 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004885
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004886 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004887 if (RegNo == 0)
4888 return 0;
4889 if (RegNo == 1)
4890 return 1;
4891 return -1;
4892 }
4893};
4894
Tim Northover573cbee2014-05-24 12:52:07 +00004895const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004896 // 32-bit Integer registers
4897 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4898 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4899 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4900
4901 // 64-bit Integer registers
4902 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4903 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4904 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4905
4906 // 32-bit floating point regsisters
4907 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4908 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4909 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4910
4911 // 64-bit floating point regsisters
4912 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4913 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4914 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4915
4916 // Vector registers
4917 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4918 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4919 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4920};
4921
Tim Northover573cbee2014-05-24 12:52:07 +00004922void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004923 unsigned &NumNames) const {
4924 Names = GCCRegNames;
4925 NumNames = llvm::array_lengthof(GCCRegNames);
4926}
4927
Tim Northover573cbee2014-05-24 12:52:07 +00004928const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004929 { { "w31" }, "wsp" },
4930 { { "x29" }, "fp" },
4931 { { "x30" }, "lr" },
4932 { { "x31" }, "sp" },
4933 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4934 // don't want to substitute one of these for a different-sized one.
4935};
4936
Tim Northover573cbee2014-05-24 12:52:07 +00004937void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004938 unsigned &NumAliases) const {
4939 Aliases = GCCRegAliases;
4940 NumAliases = llvm::array_lengthof(GCCRegAliases);
4941}
4942
Tim Northover573cbee2014-05-24 12:52:07 +00004943const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004944#define BUILTIN(ID, TYPE, ATTRS) \
4945 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4946#include "clang/Basic/BuiltinsNEON.def"
4947
4948#define BUILTIN(ID, TYPE, ATTRS) \
4949 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004950#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004951};
James Molloy5e73df52014-04-16 15:06:20 +00004952
Tim Northover573cbee2014-05-24 12:52:07 +00004953class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004954 void setDescriptionString() override {
4955 if (getTriple().isOSBinFormatMachO())
4956 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4957 else
4958 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4959 }
4960
4961public:
Tim Northover573cbee2014-05-24 12:52:07 +00004962 AArch64leTargetInfo(const llvm::Triple &Triple)
4963 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004964 BigEndian = false;
4965 }
4966 void getTargetDefines(const LangOptions &Opts,
4967 MacroBuilder &Builder) const override {
4968 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004969 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004970 }
4971};
4972
Tim Northover573cbee2014-05-24 12:52:07 +00004973class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004974 void setDescriptionString() override {
4975 assert(!getTriple().isOSBinFormatMachO());
4976 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4977 }
4978
4979public:
Tim Northover573cbee2014-05-24 12:52:07 +00004980 AArch64beTargetInfo(const llvm::Triple &Triple)
4981 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004982 void getTargetDefines(const LangOptions &Opts,
4983 MacroBuilder &Builder) const override {
4984 Builder.defineMacro("__AARCH64EB__");
4985 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4986 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004987 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004988 }
4989};
Tim Northovera2ee4332014-03-29 15:09:45 +00004990} // end anonymous namespace.
4991
4992namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004993class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004994protected:
4995 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4996 MacroBuilder &Builder) const override {
4997 Builder.defineMacro("__AARCH64_SIMD__");
4998 Builder.defineMacro("__ARM64_ARCH_8__");
4999 Builder.defineMacro("__ARM_NEON__");
5000 Builder.defineMacro("__LITTLE_ENDIAN__");
5001 Builder.defineMacro("__REGISTER_PREFIX__", "");
5002 Builder.defineMacro("__arm64", "1");
5003 Builder.defineMacro("__arm64__", "1");
5004
5005 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5006 }
5007
Tim Northovera2ee4332014-03-29 15:09:45 +00005008public:
Tim Northover573cbee2014-05-24 12:52:07 +00005009 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5010 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005011 Int64Type = SignedLongLong;
5012 WCharType = SignedInt;
5013 UseSignedCharForObjCBool = false;
5014
5015 LongDoubleWidth = LongDoubleAlign = 64;
5016 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5017
5018 TheCXXABI.set(TargetCXXABI::iOS64);
5019 }
5020
David Blaikie1cbb9712014-11-14 19:09:44 +00005021 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005022 return TargetInfo::CharPtrBuiltinVaList;
5023 }
5024};
5025} // end anonymous namespace
5026
5027namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005028// Hexagon abstract base class
5029class HexagonTargetInfo : public TargetInfo {
5030 static const Builtin::Info BuiltinInfo[];
5031 static const char * const GCCRegNames[];
5032 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5033 std::string CPU;
5034public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005035 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005036 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005037 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005038
5039 // {} in inline assembly are packet specifiers, not assembly variant
5040 // specifiers.
5041 NoAsmVariants = true;
5042 }
5043
Craig Topper3164f332014-03-11 03:39:26 +00005044 void getTargetBuiltins(const Builtin::Info *&Records,
5045 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005046 Records = BuiltinInfo;
5047 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5048 }
5049
Craig Topper3164f332014-03-11 03:39:26 +00005050 bool validateAsmConstraint(const char *&Name,
5051 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005052 return true;
5053 }
5054
Craig Topper3164f332014-03-11 03:39:26 +00005055 void getTargetDefines(const LangOptions &Opts,
5056 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005057
Craig Topper3164f332014-03-11 03:39:26 +00005058 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005059 return Feature == "hexagon";
5060 }
Craig Topper3164f332014-03-11 03:39:26 +00005061
5062 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005063 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005064 }
Craig Topper3164f332014-03-11 03:39:26 +00005065 void getGCCRegNames(const char * const *&Names,
5066 unsigned &NumNames) const override;
5067 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5068 unsigned &NumAliases) const override;
5069 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005070 return "";
5071 }
Sebastian Pop86500282012-01-13 20:37:10 +00005072
5073 static const char *getHexagonCPUSuffix(StringRef Name) {
5074 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005075 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005076 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005077 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005078 }
5079
Craig Topper3164f332014-03-11 03:39:26 +00005080 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005081 if (!getHexagonCPUSuffix(Name))
5082 return false;
5083
Tony Linthicum76329bf2011-12-12 21:14:55 +00005084 CPU = Name;
5085 return true;
5086 }
5087};
5088
5089void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5090 MacroBuilder &Builder) const {
5091 Builder.defineMacro("qdsp6");
5092 Builder.defineMacro("__qdsp6", "1");
5093 Builder.defineMacro("__qdsp6__", "1");
5094
5095 Builder.defineMacro("hexagon");
5096 Builder.defineMacro("__hexagon", "1");
5097 Builder.defineMacro("__hexagon__", "1");
5098
5099 if(CPU == "hexagonv1") {
5100 Builder.defineMacro("__HEXAGON_V1__");
5101 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5102 if(Opts.HexagonQdsp6Compat) {
5103 Builder.defineMacro("__QDSP6_V1__");
5104 Builder.defineMacro("__QDSP6_ARCH__", "1");
5105 }
5106 }
5107 else if(CPU == "hexagonv2") {
5108 Builder.defineMacro("__HEXAGON_V2__");
5109 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5110 if(Opts.HexagonQdsp6Compat) {
5111 Builder.defineMacro("__QDSP6_V2__");
5112 Builder.defineMacro("__QDSP6_ARCH__", "2");
5113 }
5114 }
5115 else if(CPU == "hexagonv3") {
5116 Builder.defineMacro("__HEXAGON_V3__");
5117 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5118 if(Opts.HexagonQdsp6Compat) {
5119 Builder.defineMacro("__QDSP6_V3__");
5120 Builder.defineMacro("__QDSP6_ARCH__", "3");
5121 }
5122 }
5123 else if(CPU == "hexagonv4") {
5124 Builder.defineMacro("__HEXAGON_V4__");
5125 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5126 if(Opts.HexagonQdsp6Compat) {
5127 Builder.defineMacro("__QDSP6_V4__");
5128 Builder.defineMacro("__QDSP6_ARCH__", "4");
5129 }
5130 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005131 else if(CPU == "hexagonv5") {
5132 Builder.defineMacro("__HEXAGON_V5__");
5133 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5134 if(Opts.HexagonQdsp6Compat) {
5135 Builder.defineMacro("__QDSP6_V5__");
5136 Builder.defineMacro("__QDSP6_ARCH__", "5");
5137 }
5138 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005139}
5140
5141const char * const HexagonTargetInfo::GCCRegNames[] = {
5142 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5143 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5144 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5145 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5146 "p0", "p1", "p2", "p3",
5147 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5148};
5149
5150void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5151 unsigned &NumNames) const {
5152 Names = GCCRegNames;
5153 NumNames = llvm::array_lengthof(GCCRegNames);
5154}
5155
5156
5157const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5158 { { "sp" }, "r29" },
5159 { { "fp" }, "r30" },
5160 { { "lr" }, "r31" },
5161 };
5162
5163void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5164 unsigned &NumAliases) const {
5165 Aliases = GCCRegAliases;
5166 NumAliases = llvm::array_lengthof(GCCRegAliases);
5167}
5168
5169
5170const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5171#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5172#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5173 ALL_LANGUAGES },
5174#include "clang/Basic/BuiltinsHexagon.def"
5175};
5176}
5177
5178
Chris Lattner5ba61f02006-10-14 07:39:34 +00005179namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005180// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5181class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005182 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5183 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005184 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005185public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005186 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005187
Craig Topper3164f332014-03-11 03:39:26 +00005188 bool handleTargetFeatures(std::vector<std::string> &Features,
5189 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005190 SoftFloat = false;
5191 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5192 if (Features[i] == "+soft-float")
5193 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005194 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005195 }
Craig Topper3164f332014-03-11 03:39:26 +00005196 void getTargetDefines(const LangOptions &Opts,
5197 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005198 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005199 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005200
5201 if (SoftFloat)
5202 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005203 }
Craig Topper3164f332014-03-11 03:39:26 +00005204
5205 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005206 return llvm::StringSwitch<bool>(Feature)
5207 .Case("softfloat", SoftFloat)
5208 .Case("sparc", true)
5209 .Default(false);
5210 }
Craig Topper3164f332014-03-11 03:39:26 +00005211
5212 void getTargetBuiltins(const Builtin::Info *&Records,
5213 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005214 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005215 }
Craig Topper3164f332014-03-11 03:39:26 +00005216 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005217 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005218 }
Craig Topper3164f332014-03-11 03:39:26 +00005219 void getGCCRegNames(const char * const *&Names,
5220 unsigned &NumNames) const override;
5221 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5222 unsigned &NumAliases) const override;
5223 bool validateAsmConstraint(const char *&Name,
5224 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005225 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005226 switch (*Name) {
5227 case 'I': // Signed 13-bit constant
5228 case 'J': // Zero
5229 case 'K': // 32-bit constant with the low 12 bits clear
5230 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5231 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5232 case 'N': // Same as 'K' but zext (required for SIMode)
5233 case 'O': // The constant 4096
5234 return true;
5235 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005236 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005237 }
Craig Topper3164f332014-03-11 03:39:26 +00005238 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005239 // FIXME: Implement!
5240 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005241 }
5242};
5243
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005244const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005245 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5246 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5247 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5248 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5249};
5250
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005251void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5252 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005253 Names = GCCRegNames;
5254 NumNames = llvm::array_lengthof(GCCRegNames);
5255}
5256
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005257const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005258 { { "g0" }, "r0" },
5259 { { "g1" }, "r1" },
5260 { { "g2" }, "r2" },
5261 { { "g3" }, "r3" },
5262 { { "g4" }, "r4" },
5263 { { "g5" }, "r5" },
5264 { { "g6" }, "r6" },
5265 { { "g7" }, "r7" },
5266 { { "o0" }, "r8" },
5267 { { "o1" }, "r9" },
5268 { { "o2" }, "r10" },
5269 { { "o3" }, "r11" },
5270 { { "o4" }, "r12" },
5271 { { "o5" }, "r13" },
5272 { { "o6", "sp" }, "r14" },
5273 { { "o7" }, "r15" },
5274 { { "l0" }, "r16" },
5275 { { "l1" }, "r17" },
5276 { { "l2" }, "r18" },
5277 { { "l3" }, "r19" },
5278 { { "l4" }, "r20" },
5279 { { "l5" }, "r21" },
5280 { { "l6" }, "r22" },
5281 { { "l7" }, "r23" },
5282 { { "i0" }, "r24" },
5283 { { "i1" }, "r25" },
5284 { { "i2" }, "r26" },
5285 { { "i3" }, "r27" },
5286 { { "i4" }, "r28" },
5287 { { "i5" }, "r29" },
5288 { { "i6", "fp" }, "r30" },
5289 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005290};
5291
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005292void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5293 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005294 Aliases = GCCRegAliases;
5295 NumAliases = llvm::array_lengthof(GCCRegAliases);
5296}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005297
5298// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5299class SparcV8TargetInfo : public SparcTargetInfo {
5300public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005301 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005302 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005303 }
5304
Craig Topper3164f332014-03-11 03:39:26 +00005305 void getTargetDefines(const LangOptions &Opts,
5306 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005307 SparcTargetInfo::getTargetDefines(Opts, Builder);
5308 Builder.defineMacro("__sparcv8");
5309 }
5310};
5311
5312// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5313class SparcV9TargetInfo : public SparcTargetInfo {
5314public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005315 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005316 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005317 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005318 // This is an LP64 platform.
5319 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005320
5321 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005322 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005323 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005324 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005325 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005326 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005327
5328 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5329 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5330 LongDoubleWidth = 128;
5331 LongDoubleAlign = 128;
5332 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005333 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005334 }
5335
Craig Topper3164f332014-03-11 03:39:26 +00005336 void getTargetDefines(const LangOptions &Opts,
5337 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005338 SparcTargetInfo::getTargetDefines(Opts, Builder);
5339 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005340 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005341 // Solaris doesn't need these variants, but the BSDs do.
5342 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005343 Builder.defineMacro("__sparc64__");
5344 Builder.defineMacro("__sparc_v9__");
5345 Builder.defineMacro("__sparcv9__");
5346 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005347 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005348
Craig Topper3164f332014-03-11 03:39:26 +00005349 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005350 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5351 .Case("v9", true)
5352 .Case("ultrasparc", true)
5353 .Case("ultrasparc3", true)
5354 .Case("niagara", true)
5355 .Case("niagara2", true)
5356 .Case("niagara3", true)
5357 .Case("niagara4", true)
5358 .Default(false);
5359
5360 // No need to store the CPU yet. There aren't any CPU-specific
5361 // macros to define.
5362 return CPUKnown;
5363 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005364};
5365
Gabor Greif49991682008-02-21 16:29:08 +00005366} // end anonymous namespace.
5367
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005368namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005369class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005370public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005371 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5372 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005373 SizeType = UnsignedInt;
5374 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005375 }
5376};
5377} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005378
Chris Lattnerb781dc792008-05-08 05:58:21 +00005379namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005380class SystemZTargetInfo : public TargetInfo {
5381 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005382
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005383public:
5384 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5385 TLSSupported = true;
5386 IntWidth = IntAlign = 32;
5387 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5388 PointerWidth = PointerAlign = 64;
5389 LongDoubleWidth = 128;
5390 LongDoubleAlign = 64;
5391 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5392 MinGlobalAlign = 16;
5393 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5394 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5395 }
5396 void getTargetDefines(const LangOptions &Opts,
5397 MacroBuilder &Builder) const override {
5398 Builder.defineMacro("__s390__");
5399 Builder.defineMacro("__s390x__");
5400 Builder.defineMacro("__zarch__");
5401 Builder.defineMacro("__LONG_DOUBLE_128__");
5402 }
5403 void getTargetBuiltins(const Builtin::Info *&Records,
5404 unsigned &NumRecords) const override {
5405 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005406 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005407 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005408 }
5409
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005410 void getGCCRegNames(const char *const *&Names,
5411 unsigned &NumNames) const override;
5412 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5413 unsigned &NumAliases) const override {
5414 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005415 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005416 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005417 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005418 bool validateAsmConstraint(const char *&Name,
5419 TargetInfo::ConstraintInfo &info) const override;
5420 const char *getClobbers() const override {
5421 // FIXME: Is this really right?
5422 return "";
5423 }
5424 BuiltinVaListKind getBuiltinVaListKind() const override {
5425 return TargetInfo::SystemZBuiltinVaList;
5426 }
5427 bool setCPU(const std::string &Name) override {
5428 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5429 .Case("z10", true)
5430 .Case("z196", true)
5431 .Case("zEC12", true)
5432 .Default(false);
5433
5434 // No need to store the CPU yet. There aren't any CPU-specific
5435 // macros to define.
5436 return CPUKnown;
5437 }
5438};
5439
5440const char *const SystemZTargetInfo::GCCRegNames[] = {
5441 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5442 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5443 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5444 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5445};
5446
5447void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5448 unsigned &NumNames) const {
5449 Names = GCCRegNames;
5450 NumNames = llvm::array_lengthof(GCCRegNames);
5451}
5452
5453bool SystemZTargetInfo::
5454validateAsmConstraint(const char *&Name,
5455 TargetInfo::ConstraintInfo &Info) const {
5456 switch (*Name) {
5457 default:
5458 return false;
5459
5460 case 'a': // Address register
5461 case 'd': // Data register (equivalent to 'r')
5462 case 'f': // Floating-point register
5463 Info.setAllowsRegister();
5464 return true;
5465
5466 case 'I': // Unsigned 8-bit constant
5467 case 'J': // Unsigned 12-bit constant
5468 case 'K': // Signed 16-bit constant
5469 case 'L': // Signed 20-bit displacement (on all targets we support)
5470 case 'M': // 0x7fffffff
5471 return true;
5472
5473 case 'Q': // Memory with base and unsigned 12-bit displacement
5474 case 'R': // Likewise, plus an index
5475 case 'S': // Memory with base and signed 20-bit displacement
5476 case 'T': // Likewise, plus an index
5477 Info.setAllowsMemory();
5478 return true;
5479 }
5480}
Ulrich Weigand47445072013-05-06 16:26:41 +00005481}
5482
5483namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005484 class MSP430TargetInfo : public TargetInfo {
5485 static const char * const GCCRegNames[];
5486 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005487 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005488 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005489 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005490 IntWidth = 16; IntAlign = 16;
5491 LongWidth = 32; LongLongWidth = 64;
5492 LongAlign = LongLongAlign = 16;
5493 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005494 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005495 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005496 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005497 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005498 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005499 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005500 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005501 }
5502 void getTargetDefines(const LangOptions &Opts,
5503 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005504 Builder.defineMacro("MSP430");
5505 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005506 // FIXME: defines for different 'flavours' of MCU
5507 }
Craig Topper3164f332014-03-11 03:39:26 +00005508 void getTargetBuiltins(const Builtin::Info *&Records,
5509 unsigned &NumRecords) const override {
5510 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005511 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005512 NumRecords = 0;
5513 }
Craig Topper3164f332014-03-11 03:39:26 +00005514 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005515 return Feature == "msp430";
5516 }
Craig Topper3164f332014-03-11 03:39:26 +00005517 void getGCCRegNames(const char * const *&Names,
5518 unsigned &NumNames) const override;
5519 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5520 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005521 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005522 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005523 NumAliases = 0;
5524 }
Eric Christopher917e9522014-11-18 22:36:15 +00005525 bool
5526 validateAsmConstraint(const char *&Name,
5527 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005528 // FIXME: implement
5529 switch (*Name) {
5530 case 'K': // the constant 1
5531 case 'L': // constant -1^20 .. 1^19
5532 case 'M': // constant 1-4:
5533 return true;
5534 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005535 // No target constraints for now.
5536 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005537 }
Craig Topper3164f332014-03-11 03:39:26 +00005538 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005539 // FIXME: Is this really right?
5540 return "";
5541 }
Craig Topper3164f332014-03-11 03:39:26 +00005542 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005543 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005544 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005545 }
5546 };
5547
5548 const char * const MSP430TargetInfo::GCCRegNames[] = {
5549 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5550 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5551 };
5552
5553 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5554 unsigned &NumNames) const {
5555 Names = GCCRegNames;
5556 NumNames = llvm::array_lengthof(GCCRegNames);
5557 }
5558}
5559
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005560namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005561
Mike Stump11289f42009-09-09 15:08:12 +00005562 // LLVM and Clang cannot be used directly to output native binaries for
5563 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005564 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005565 //
5566 // TCE uses the llvm bitcode as input and uses it for generating customized
5567 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005568 // publicly available in http://tce.cs.tut.fi
5569
Eli Friedman1f191002011-10-07 19:51:42 +00005570 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5571 3, // opencl_global
5572 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005573 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005574 // FIXME: generic has to be added to the target
5575 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005576 0, // cuda_device
5577 0, // cuda_constant
5578 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005579 };
5580
Eli Friedmana9c3d712009-08-19 20:47:07 +00005581 class TCETargetInfo : public TargetInfo{
5582 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005583 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005584 TLSSupported = false;
5585 IntWidth = 32;
5586 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005587 PointerWidth = 32;
5588 IntAlign = 32;
5589 LongAlign = LongLongAlign = 32;
5590 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005591 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005592 SizeType = UnsignedInt;
5593 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005594 IntPtrType = SignedInt;
5595 PtrDiffType = SignedInt;
5596 FloatWidth = 32;
5597 FloatAlign = 32;
5598 DoubleWidth = 32;
5599 DoubleAlign = 32;
5600 LongDoubleWidth = 32;
5601 LongDoubleAlign = 32;
5602 FloatFormat = &llvm::APFloat::IEEEsingle;
5603 DoubleFormat = &llvm::APFloat::IEEEsingle;
5604 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005605 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5606 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005607 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005608 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005609 }
5610
Craig Topper3164f332014-03-11 03:39:26 +00005611 void getTargetDefines(const LangOptions &Opts,
5612 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005613 DefineStd(Builder, "tce", Opts);
5614 Builder.defineMacro("__TCE__");
5615 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005616 }
Craig Topper3164f332014-03-11 03:39:26 +00005617 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005618 return Feature == "tce";
5619 }
Craig Topper3164f332014-03-11 03:39:26 +00005620
5621 void getTargetBuiltins(const Builtin::Info *&Records,
5622 unsigned &NumRecords) const override {}
5623 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005624 return "";
5625 }
Craig Topper3164f332014-03-11 03:39:26 +00005626 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005627 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005628 }
Craig Topper3164f332014-03-11 03:39:26 +00005629 void getGCCRegNames(const char * const *&Names,
5630 unsigned &NumNames) const override {}
5631 bool validateAsmConstraint(const char *&Name,
5632 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005633 return true;
5634 }
Craig Topper3164f332014-03-11 03:39:26 +00005635 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5636 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005637 };
5638}
5639
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005640namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005641class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005642 virtual void setDescriptionString() = 0;
5643
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005644 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005645 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005646 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005647 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005648 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005649 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005650 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005651 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005652 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005653 enum DspRevEnum {
5654 NoDSP, DSP1, DSP2
5655 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005656 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005657
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005658protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005659 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005660 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005661
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005662public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005663 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5664 const std::string &CPUStr)
5665 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005666 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005667 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005668
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005669 bool isNaN2008Default() const {
5670 return CPU == "mips32r6" || CPU == "mips64r6";
5671 }
5672
5673 bool isFP64Default() const {
5674 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5675 }
5676
Alp Toker4925ba72014-06-07 23:30:42 +00005677 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005678 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005679 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5680 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005681 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005682 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005683 .Case("mips1", IsMips32)
5684 .Case("mips2", IsMips32)
5685 .Case("mips3", true)
5686 .Case("mips4", true)
5687 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005688 .Case("mips32", IsMips32)
5689 .Case("mips32r2", IsMips32)
5690 .Case("mips32r6", IsMips32)
5691 .Case("mips64", true)
5692 .Case("mips64r2", true)
5693 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005694 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005695 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005696 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005697 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005698 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005699 if (CPU == "octeon")
5700 Features["mips64r2"] = Features["cnmips"] = true;
5701 else
5702 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005703 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005704
Craig Topper3164f332014-03-11 03:39:26 +00005705 void getTargetDefines(const LangOptions &Opts,
5706 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005707 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005708 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005709 if (Opts.GNUMode)
5710 Builder.defineMacro("mips");
5711
Simon Atanasyan683535b2012-08-29 19:14:58 +00005712 Builder.defineMacro("__REGISTER_PREFIX__", "");
5713
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005714 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005715 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005716 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005717 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005718 case SoftFloat:
5719 Builder.defineMacro("__mips_soft_float", Twine(1));
5720 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005721 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005722
Simon Atanasyan16071912013-04-14 14:07:30 +00005723 if (IsSingleFloat)
5724 Builder.defineMacro("__mips_single_float", Twine(1));
5725
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005726 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5727 Builder.defineMacro("_MIPS_FPSET",
5728 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5729
Simon Atanasyan72244b62012-07-05 16:06:06 +00005730 if (IsMips16)
5731 Builder.defineMacro("__mips16", Twine(1));
5732
Simon Atanasyan60777612013-04-14 14:07:51 +00005733 if (IsMicromips)
5734 Builder.defineMacro("__mips_micromips", Twine(1));
5735
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005736 if (IsNan2008)
5737 Builder.defineMacro("__mips_nan2008", Twine(1));
5738
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005739 switch (DspRev) {
5740 default:
5741 break;
5742 case DSP1:
5743 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5744 Builder.defineMacro("__mips_dsp", Twine(1));
5745 break;
5746 case DSP2:
5747 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5748 Builder.defineMacro("__mips_dspr2", Twine(1));
5749 Builder.defineMacro("__mips_dsp", Twine(1));
5750 break;
5751 }
5752
Jack Carter44ff1e52013-08-12 17:20:29 +00005753 if (HasMSA)
5754 Builder.defineMacro("__mips_msa", Twine(1));
5755
Simon Atanasyan26f19672012-04-05 19:28:31 +00005756 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5757 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5758 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005759
5760 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5761 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005762 }
5763
Craig Topper3164f332014-03-11 03:39:26 +00005764 void getTargetBuiltins(const Builtin::Info *&Records,
5765 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005766 Records = BuiltinInfo;
5767 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005768 }
Craig Topper3164f332014-03-11 03:39:26 +00005769 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005770 return llvm::StringSwitch<bool>(Feature)
5771 .Case("mips", true)
5772 .Case("fp64", HasFP64)
5773 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005774 }
Craig Topper3164f332014-03-11 03:39:26 +00005775 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005776 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005777 }
Craig Topper3164f332014-03-11 03:39:26 +00005778 void getGCCRegNames(const char * const *&Names,
5779 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005780 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005781 // CPU register names
5782 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005783 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5784 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5785 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005786 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5787 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005788 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5789 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5790 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5791 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005792 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005793 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005794 "$fcc5","$fcc6","$fcc7",
5795 // MSA register names
5796 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5797 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5798 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5799 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5800 // MSA control register names
5801 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5802 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005803 };
5804 Names = GCCRegNames;
5805 NumNames = llvm::array_lengthof(GCCRegNames);
5806 }
Craig Topper3164f332014-03-11 03:39:26 +00005807 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5808 unsigned &NumAliases) const override = 0;
5809 bool validateAsmConstraint(const char *&Name,
5810 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005811 switch (*Name) {
5812 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005813 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005814 case 'r': // CPU registers.
5815 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005816 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005817 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005818 case 'c': // $25 for indirect jumps
5819 case 'l': // lo register
5820 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005821 Info.setAllowsRegister();
5822 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005823 case 'I': // Signed 16-bit constant
5824 case 'J': // Integer 0
5825 case 'K': // Unsigned 16-bit constant
5826 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5827 case 'M': // Constants not loadable via lui, addiu, or ori
5828 case 'N': // Constant -1 to -65535
5829 case 'O': // A signed 15-bit constant
5830 case 'P': // A constant between 1 go 65535
5831 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005832 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005833 Info.setAllowsMemory();
5834 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005835 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005836 }
5837
Craig Topper3164f332014-03-11 03:39:26 +00005838 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005839 // In GCC, $1 is not widely used in generated code (it's used only in a few
5840 // specific situations), so there is no real need for users to add it to
5841 // the clobbers list if they want to use it in their inline assembly code.
5842 //
5843 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5844 // code generation, so using it in inline assembly without adding it to the
5845 // clobbers list can cause conflicts between the inline assembly code and
5846 // the surrounding generated code.
5847 //
5848 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5849 // operands, which will conflict with the ".set at" assembler option (which
5850 // we use only for inline assembly, in order to maintain compatibility with
5851 // GCC) and will also conflict with the user's usage of $1.
5852 //
5853 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5854 // register for generated code is to automatically clobber $1 for all inline
5855 // assembly code.
5856 //
5857 // FIXME: We should automatically clobber $1 only for inline assembly code
5858 // which actually uses it. This would allow LLVM to use $1 for inline
5859 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005860 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005861 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005862
Craig Topper3164f332014-03-11 03:39:26 +00005863 bool handleTargetFeatures(std::vector<std::string> &Features,
5864 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005865 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005866 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005867 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005868 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005869 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005870 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005871 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005872
5873 for (std::vector<std::string>::iterator it = Features.begin(),
5874 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005875 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005876 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005877 else if (*it == "+soft-float")
5878 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005879 else if (*it == "+mips16")
5880 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005881 else if (*it == "+micromips")
5882 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005883 else if (*it == "+dsp")
5884 DspRev = std::max(DspRev, DSP1);
5885 else if (*it == "+dspr2")
5886 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005887 else if (*it == "+msa")
5888 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005889 else if (*it == "+fp64")
5890 HasFP64 = true;
5891 else if (*it == "-fp64")
5892 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005893 else if (*it == "+nan2008")
5894 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005895 else if (*it == "-nan2008")
5896 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005897 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005898
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005899 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005900 std::vector<std::string>::iterator it =
5901 std::find(Features.begin(), Features.end(), "+soft-float");
5902 if (it != Features.end())
5903 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005904
Akira Hatanaka9064e362013-10-29 18:30:33 +00005905 setDescriptionString();
5906
Rafael Espindolaeb265472013-08-21 21:59:03 +00005907 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005908 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005909
Craig Topper3164f332014-03-11 03:39:26 +00005910 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005911 if (RegNo == 0) return 4;
5912 if (RegNo == 1) return 5;
5913 return -1;
5914 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005915
5916 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005917};
5918
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005919const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5920#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5921#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5922 ALL_LANGUAGES },
5923#include "clang/Basic/BuiltinsMips.def"
5924};
5925
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005926class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005927public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005928 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005929 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005930 SizeType = UnsignedInt;
5931 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00005932 Int64Type = SignedLongLong;
5933 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005934 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005935 }
Craig Topper3164f332014-03-11 03:39:26 +00005936 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005937 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005938 ABI = Name;
5939 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005940 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005941 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005942 }
Craig Topper3164f332014-03-11 03:39:26 +00005943 void getTargetDefines(const LangOptions &Opts,
5944 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005945 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005946
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005947 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005948 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5949
5950 const std::string& CPUStr = getCPU();
5951 if (CPUStr == "mips32")
5952 Builder.defineMacro("__mips_isa_rev", "1");
5953 else if (CPUStr == "mips32r2")
5954 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00005955 else if (CPUStr == "mips32r6")
5956 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005957
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005958 if (ABI == "o32") {
5959 Builder.defineMacro("__mips_o32");
5960 Builder.defineMacro("_ABIO32", "1");
5961 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5962 }
5963 else if (ABI == "eabi")
5964 Builder.defineMacro("__mips_eabi");
5965 else
David Blaikie83d382b2011-09-23 05:06:16 +00005966 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005967 }
Craig Topper3164f332014-03-11 03:39:26 +00005968 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5969 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005970 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5971 { { "at" }, "$1" },
5972 { { "v0" }, "$2" },
5973 { { "v1" }, "$3" },
5974 { { "a0" }, "$4" },
5975 { { "a1" }, "$5" },
5976 { { "a2" }, "$6" },
5977 { { "a3" }, "$7" },
5978 { { "t0" }, "$8" },
5979 { { "t1" }, "$9" },
5980 { { "t2" }, "$10" },
5981 { { "t3" }, "$11" },
5982 { { "t4" }, "$12" },
5983 { { "t5" }, "$13" },
5984 { { "t6" }, "$14" },
5985 { { "t7" }, "$15" },
5986 { { "s0" }, "$16" },
5987 { { "s1" }, "$17" },
5988 { { "s2" }, "$18" },
5989 { { "s3" }, "$19" },
5990 { { "s4" }, "$20" },
5991 { { "s5" }, "$21" },
5992 { { "s6" }, "$22" },
5993 { { "s7" }, "$23" },
5994 { { "t8" }, "$24" },
5995 { { "t9" }, "$25" },
5996 { { "k0" }, "$26" },
5997 { { "k1" }, "$27" },
5998 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005999 { { "sp","$sp" }, "$29" },
6000 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006001 { { "ra" }, "$31" }
6002 };
6003 Aliases = GCCRegAliases;
6004 NumAliases = llvm::array_lengthof(GCCRegAliases);
6005 }
6006};
6007
6008class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006009 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006010 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006011 }
6012
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006013public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006014 Mips32EBTargetInfo(const llvm::Triple &Triple)
6015 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006016 }
Craig Topper3164f332014-03-11 03:39:26 +00006017 void getTargetDefines(const LangOptions &Opts,
6018 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006019 DefineStd(Builder, "MIPSEB", Opts);
6020 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006021 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006022 }
6023};
6024
6025class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006026 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006027 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006028 }
6029
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006030public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006031 Mips32ELTargetInfo(const llvm::Triple &Triple)
6032 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006033 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006034 }
Craig Topper3164f332014-03-11 03:39:26 +00006035 void getTargetDefines(const LangOptions &Opts,
6036 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006037 DefineStd(Builder, "MIPSEL", Opts);
6038 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006039 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006040 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006041};
Akira Hatanakabef17452011-09-20 19:21:49 +00006042
6043class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006044public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006045 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006046 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006047 LongDoubleWidth = LongDoubleAlign = 128;
6048 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006049 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6050 LongDoubleWidth = LongDoubleAlign = 64;
6051 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6052 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006053 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006054 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006055 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006056 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006057
6058 void setN64ABITypes() {
6059 LongWidth = LongAlign = 64;
6060 PointerWidth = PointerAlign = 64;
6061 SizeType = UnsignedLong;
6062 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006063 Int64Type = SignedLong;
6064 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006065 }
6066
6067 void setN32ABITypes() {
6068 LongWidth = LongAlign = 32;
6069 PointerWidth = PointerAlign = 32;
6070 SizeType = UnsignedInt;
6071 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006072 Int64Type = SignedLongLong;
6073 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006074 }
6075
Craig Topper3164f332014-03-11 03:39:26 +00006076 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006077 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006078 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006079 ABI = Name;
6080 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006081 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006082 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006083 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006084 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006085 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006086 }
6087 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006088 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006089
Craig Topper3164f332014-03-11 03:39:26 +00006090 void getTargetDefines(const LangOptions &Opts,
6091 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006092 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006093
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006094 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006095 Builder.defineMacro("__mips64");
6096 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006097 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6098
6099 const std::string& CPUStr = getCPU();
6100 if (CPUStr == "mips64")
6101 Builder.defineMacro("__mips_isa_rev", "1");
6102 else if (CPUStr == "mips64r2")
6103 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006104 else if (CPUStr == "mips64r6")
6105 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006106
Akira Hatanakabef17452011-09-20 19:21:49 +00006107 if (ABI == "n32") {
6108 Builder.defineMacro("__mips_n32");
6109 Builder.defineMacro("_ABIN32", "2");
6110 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6111 }
6112 else if (ABI == "n64") {
6113 Builder.defineMacro("__mips_n64");
6114 Builder.defineMacro("_ABI64", "3");
6115 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6116 }
6117 else
David Blaikie83d382b2011-09-23 05:06:16 +00006118 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006119 }
Craig Topper3164f332014-03-11 03:39:26 +00006120 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6121 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006122 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6123 { { "at" }, "$1" },
6124 { { "v0" }, "$2" },
6125 { { "v1" }, "$3" },
6126 { { "a0" }, "$4" },
6127 { { "a1" }, "$5" },
6128 { { "a2" }, "$6" },
6129 { { "a3" }, "$7" },
6130 { { "a4" }, "$8" },
6131 { { "a5" }, "$9" },
6132 { { "a6" }, "$10" },
6133 { { "a7" }, "$11" },
6134 { { "t0" }, "$12" },
6135 { { "t1" }, "$13" },
6136 { { "t2" }, "$14" },
6137 { { "t3" }, "$15" },
6138 { { "s0" }, "$16" },
6139 { { "s1" }, "$17" },
6140 { { "s2" }, "$18" },
6141 { { "s3" }, "$19" },
6142 { { "s4" }, "$20" },
6143 { { "s5" }, "$21" },
6144 { { "s6" }, "$22" },
6145 { { "s7" }, "$23" },
6146 { { "t8" }, "$24" },
6147 { { "t9" }, "$25" },
6148 { { "k0" }, "$26" },
6149 { { "k1" }, "$27" },
6150 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006151 { { "sp","$sp" }, "$29" },
6152 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006153 { { "ra" }, "$31" }
6154 };
6155 Aliases = GCCRegAliases;
6156 NumAliases = llvm::array_lengthof(GCCRegAliases);
6157 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006158
6159 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006160};
6161
6162class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006163 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006164 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006165 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 +00006166 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006167 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006168
Akira Hatanakabef17452011-09-20 19:21:49 +00006169 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006170
Akira Hatanakabef17452011-09-20 19:21:49 +00006171public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006172 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006173 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006174 void getTargetDefines(const LangOptions &Opts,
6175 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006176 DefineStd(Builder, "MIPSEB", Opts);
6177 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006178 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006179 }
6180};
6181
6182class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006183 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006184 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006185 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 +00006186 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006187 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006188 }
6189public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006190 Mips64ELTargetInfo(const llvm::Triple &Triple)
6191 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006192 // Default ABI is n64.
6193 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006194 }
Craig Topper3164f332014-03-11 03:39:26 +00006195 void getTargetDefines(const LangOptions &Opts,
6196 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006197 DefineStd(Builder, "MIPSEL", Opts);
6198 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006199 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006200 }
6201};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006202} // end anonymous namespace.
6203
Ivan Krasindd7403e2011-08-24 20:22:22 +00006204namespace {
6205class PNaClTargetInfo : public TargetInfo {
6206public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006207 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006208 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006209 this->UserLabelPrefix = "";
6210 this->LongAlign = 32;
6211 this->LongWidth = 32;
6212 this->PointerAlign = 32;
6213 this->PointerWidth = 32;
6214 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006215 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006216 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006217 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006218 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006219 this->SizeType = TargetInfo::UnsignedInt;
6220 this->PtrDiffType = TargetInfo::SignedInt;
6221 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006222 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006223 }
6224
Craig Topper3164f332014-03-11 03:39:26 +00006225 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006226 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006227 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006228 Builder.defineMacro("__le32__");
6229 Builder.defineMacro("__pnacl__");
6230 }
Craig Topper3164f332014-03-11 03:39:26 +00006231 void getTargetDefines(const LangOptions &Opts,
6232 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006233 getArchDefines(Opts, Builder);
6234 }
Craig Topper3164f332014-03-11 03:39:26 +00006235 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006236 return Feature == "pnacl";
6237 }
Craig Topper3164f332014-03-11 03:39:26 +00006238 void getTargetBuiltins(const Builtin::Info *&Records,
6239 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006240 }
Craig Topper3164f332014-03-11 03:39:26 +00006241 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006242 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006243 }
Craig Topper3164f332014-03-11 03:39:26 +00006244 void getGCCRegNames(const char * const *&Names,
6245 unsigned &NumNames) const override;
6246 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6247 unsigned &NumAliases) const override;
6248 bool validateAsmConstraint(const char *&Name,
6249 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006250 return false;
6251 }
6252
Craig Topper3164f332014-03-11 03:39:26 +00006253 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006254 return "";
6255 }
6256};
6257
6258void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6259 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006260 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006261 NumNames = 0;
6262}
6263
6264void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6265 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006266 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006267 NumAliases = 0;
6268}
6269} // end anonymous namespace.
6270
Guy Benyeib798fc92012-12-11 21:38:14 +00006271namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006272class Le64TargetInfo : public TargetInfo {
6273 static const Builtin::Info BuiltinInfo[];
6274
6275public:
6276 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6277 BigEndian = false;
6278 NoAsmVariants = true;
6279 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6280 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6281 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006282 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006283 }
6284
6285 void getTargetDefines(const LangOptions &Opts,
6286 MacroBuilder &Builder) const override {
6287 DefineStd(Builder, "unix", Opts);
6288 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6289 Builder.defineMacro("__ELF__");
6290 }
6291 void getTargetBuiltins(const Builtin::Info *&Records,
6292 unsigned &NumRecords) const override {
6293 Records = BuiltinInfo;
6294 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6295 }
6296 BuiltinVaListKind getBuiltinVaListKind() const override {
6297 return TargetInfo::PNaClABIBuiltinVaList;
6298 }
6299 const char *getClobbers() const override { return ""; }
6300 void getGCCRegNames(const char *const *&Names,
6301 unsigned &NumNames) const override {
6302 Names = nullptr;
6303 NumNames = 0;
6304 }
6305 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6306 unsigned &NumAliases) const override {
6307 Aliases = nullptr;
6308 NumAliases = 0;
6309 }
6310 bool validateAsmConstraint(const char *&Name,
6311 TargetInfo::ConstraintInfo &Info) const override {
6312 return false;
6313 }
6314
6315 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006316};
6317} // end anonymous namespace.
6318
6319const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6320#define BUILTIN(ID, TYPE, ATTRS) \
6321 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6322#include "clang/Basic/BuiltinsLe64.def"
6323};
6324
6325namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006326 static const unsigned SPIRAddrSpaceMap[] = {
6327 1, // opencl_global
6328 3, // opencl_local
6329 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006330 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006331 0, // cuda_device
6332 0, // cuda_constant
6333 0 // cuda_shared
6334 };
6335 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006336 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006337 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006338 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6339 "SPIR target must use unknown OS");
6340 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6341 "SPIR target must use unknown environment type");
6342 BigEndian = false;
6343 TLSSupported = false;
6344 LongWidth = LongAlign = 64;
6345 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006346 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006347 // Define available target features
6348 // These must be defined in sorted order!
6349 NoAsmVariants = true;
6350 }
Craig Topper3164f332014-03-11 03:39:26 +00006351 void getTargetDefines(const LangOptions &Opts,
6352 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006353 DefineStd(Builder, "SPIR", Opts);
6354 }
Craig Topper3164f332014-03-11 03:39:26 +00006355 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006356 return Feature == "spir";
6357 }
Craig Topper3164f332014-03-11 03:39:26 +00006358
6359 void getTargetBuiltins(const Builtin::Info *&Records,
6360 unsigned &NumRecords) const override {}
6361 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006362 return "";
6363 }
Craig Topper3164f332014-03-11 03:39:26 +00006364 void getGCCRegNames(const char * const *&Names,
6365 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006366 bool
6367 validateAsmConstraint(const char *&Name,
6368 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006369 return true;
6370 }
Craig Topper3164f332014-03-11 03:39:26 +00006371 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6372 unsigned &NumAliases) const override {}
6373 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006374 return TargetInfo::VoidPtrBuiltinVaList;
6375 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006376
6377 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6378 return (CC == CC_SpirFunction ||
6379 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6380 }
6381
6382 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6383 return CC_SpirFunction;
6384 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006385 };
6386
6387
6388 class SPIR32TargetInfo : public SPIRTargetInfo {
6389 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006390 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006391 PointerWidth = PointerAlign = 32;
6392 SizeType = TargetInfo::UnsignedInt;
6393 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6394 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006395 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6396 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006397 }
Craig Topper3164f332014-03-11 03:39:26 +00006398 void getTargetDefines(const LangOptions &Opts,
6399 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006400 DefineStd(Builder, "SPIR32", Opts);
6401 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006402 };
6403
6404 class SPIR64TargetInfo : public SPIRTargetInfo {
6405 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006406 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006407 PointerWidth = PointerAlign = 64;
6408 SizeType = TargetInfo::UnsignedLong;
6409 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006410 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6411 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006412 }
Craig Topper3164f332014-03-11 03:39:26 +00006413 void getTargetDefines(const LangOptions &Opts,
6414 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006415 DefineStd(Builder, "SPIR64", Opts);
6416 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006417 };
6418}
6419
Robert Lytton0e076492013-08-13 09:43:10 +00006420namespace {
6421class XCoreTargetInfo : public TargetInfo {
6422 static const Builtin::Info BuiltinInfo[];
6423public:
6424 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6425 BigEndian = false;
6426 NoAsmVariants = true;
6427 LongLongAlign = 32;
6428 SuitableAlign = 32;
6429 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006430 SizeType = UnsignedInt;
6431 PtrDiffType = SignedInt;
6432 IntPtrType = SignedInt;
6433 WCharType = UnsignedChar;
6434 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006435 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006436 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 +00006437 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006438 }
Craig Topper3164f332014-03-11 03:39:26 +00006439 void getTargetDefines(const LangOptions &Opts,
6440 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006441 Builder.defineMacro("__XS1B__");
6442 }
Craig Topper3164f332014-03-11 03:39:26 +00006443 void getTargetBuiltins(const Builtin::Info *&Records,
6444 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006445 Records = BuiltinInfo;
6446 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6447 }
Craig Topper3164f332014-03-11 03:39:26 +00006448 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006449 return TargetInfo::VoidPtrBuiltinVaList;
6450 }
Craig Topper3164f332014-03-11 03:39:26 +00006451 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006452 return "";
6453 }
Craig Topper3164f332014-03-11 03:39:26 +00006454 void getGCCRegNames(const char * const *&Names,
6455 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006456 static const char * const GCCRegNames[] = {
6457 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6458 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6459 };
6460 Names = GCCRegNames;
6461 NumNames = llvm::array_lengthof(GCCRegNames);
6462 }
Craig Topper3164f332014-03-11 03:39:26 +00006463 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6464 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006465 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006466 NumAliases = 0;
6467 }
Craig Topper3164f332014-03-11 03:39:26 +00006468 bool validateAsmConstraint(const char *&Name,
6469 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006470 return false;
6471 }
Craig Topper3164f332014-03-11 03:39:26 +00006472 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006473 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6474 return (RegNo < 2)? RegNo : -1;
6475 }
Robert Lytton0e076492013-08-13 09:43:10 +00006476};
6477
6478const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6479#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6480#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6481 ALL_LANGUAGES },
6482#include "clang/Basic/BuiltinsXCore.def"
6483};
6484} // end anonymous namespace.
6485
Ivan Krasindd7403e2011-08-24 20:22:22 +00006486
Chris Lattner5ba61f02006-10-14 07:39:34 +00006487//===----------------------------------------------------------------------===//
6488// Driver code
6489//===----------------------------------------------------------------------===//
6490
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006492 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006493
Daniel Dunbar52322032009-08-18 05:47:58 +00006494 switch (Triple.getArch()) {
6495 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006496 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006497
Tim Northover2a0783d2014-05-30 14:14:07 +00006498 case llvm::Triple::xcore:
6499 return new XCoreTargetInfo(Triple);
6500
6501 case llvm::Triple::hexagon:
6502 return new HexagonTargetInfo(Triple);
6503
6504 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006505 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006506 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006507
6508 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006509 case llvm::Triple::FreeBSD:
6510 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006511 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006512 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006513 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006514 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006515 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006516 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006517 }
6518
Christian Pirker9b019ae2014-02-25 13:51:00 +00006519 case llvm::Triple::aarch64_be:
6520 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006521 case llvm::Triple::FreeBSD:
6522 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006523 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006524 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006525 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006526 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006527 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006528 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006529 }
6530
Daniel Dunbar52322032009-08-18 05:47:58 +00006531 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006532 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006533 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006534 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006535
Daniel Dunbar52322032009-08-18 05:47:58 +00006536 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006537 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006538 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006539 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006540 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006541 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006542 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006543 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006544 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006545 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006546 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006547 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006548 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006549 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006550 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006551 case llvm::Triple::Win32:
6552 switch (Triple.getEnvironment()) {
6553 default:
6554 return new ARMleTargetInfo(Triple);
6555 case llvm::Triple::Itanium:
6556 return new ItaniumWindowsARMleTargetInfo(Triple);
6557 case llvm::Triple::MSVC:
6558 return new MicrosoftARMleTargetInfo(Triple);
6559 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006560 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006561 return new ARMleTargetInfo(Triple);
6562 }
6563
6564 case llvm::Triple::armeb:
6565 case llvm::Triple::thumbeb:
6566 if (Triple.isOSDarwin())
6567 return new DarwinARMTargetInfo(Triple);
6568
6569 switch (os) {
6570 case llvm::Triple::Linux:
6571 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6572 case llvm::Triple::FreeBSD:
6573 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6574 case llvm::Triple::NetBSD:
6575 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6576 case llvm::Triple::OpenBSD:
6577 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6578 case llvm::Triple::Bitrig:
6579 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6580 case llvm::Triple::RTEMS:
6581 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6582 case llvm::Triple::NaCl:
6583 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6584 default:
6585 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006586 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006587
Daniel Dunbar52322032009-08-18 05:47:58 +00006588 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006589 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006590
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006591 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006592 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006593 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006594 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006595 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006596 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006597 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006598 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006599 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006600 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006601 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006602 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006603 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006604
6605 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006606 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006607 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006608 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006609 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006610 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006611 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006612 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006613 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006614 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006615 case llvm::Triple::NaCl:
6616 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006617 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006618 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006619 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006620
Akira Hatanakabef17452011-09-20 19:21:49 +00006621 case llvm::Triple::mips64:
6622 switch (os) {
6623 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006624 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006625 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006626 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006627 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006628 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006629 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006630 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006631 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006632 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006633 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006634 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006635 }
6636
6637 case llvm::Triple::mips64el:
6638 switch (os) {
6639 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006640 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006641 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006642 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006643 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006644 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006645 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006646 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006647 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006648 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006649 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006651 }
6652
Ivan Krasindd7403e2011-08-24 20:22:22 +00006653 case llvm::Triple::le32:
6654 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006655 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006656 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006657 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006658 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006659 }
6660
JF Bastien643817d2014-09-12 17:52:47 +00006661 case llvm::Triple::le64:
6662 return new Le64TargetInfo(Triple);
6663
Daniel Dunbar52322032009-08-18 05:47:58 +00006664 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006665 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006666 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006667 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006668 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006669 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006670 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006671 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006672 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006673 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006674 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006676 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006677 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006678 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006679 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006680 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006681
6682 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006683 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006684 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006685 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006686 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006688 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006689 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006690 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006692 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006693 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006694 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006695 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006696 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006697
Bill Schmidt778d3872013-07-26 01:36:11 +00006698 case llvm::Triple::ppc64le:
6699 switch (os) {
6700 case llvm::Triple::Linux:
6701 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6702 default:
6703 return new PPC64TargetInfo(Triple);
6704 }
6705
Peter Collingbournec947aae2012-05-20 23:28:41 +00006706 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006707 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006708 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006709 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006710
Tom Stellardd8e38a32015-01-06 20:34:47 +00006711 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006712 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006713 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006714
Daniel Dunbar52322032009-08-18 05:47:58 +00006715 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006716 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006717 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006718 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006719 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006720 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006721 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006723 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006724 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006725 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006726 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006727 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006728 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006729 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006730
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006731 case llvm::Triple::sparcv9:
6732 switch (os) {
6733 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006734 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006735 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006736 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006737 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006738 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006739 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006741 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006743 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006744 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006745 }
6746
Ulrich Weigand47445072013-05-06 16:26:41 +00006747 case llvm::Triple::systemz:
6748 switch (os) {
6749 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006750 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006751 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006752 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006753 }
6754
Eli Friedmana9c3d712009-08-19 20:47:07 +00006755 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006756 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006757
Daniel Dunbar52322032009-08-18 05:47:58 +00006758 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006759 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006760 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006761
Daniel Dunbar52322032009-08-18 05:47:58 +00006762 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006763 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006764 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006765 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006766 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006767 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006768 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006769 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006770 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006771 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006772 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006773 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006774 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006775 case llvm::Triple::KFreeBSD:
6776 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006777 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006778 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006779 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006780 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006781 case llvm::Triple::Win32: {
6782 switch (Triple.getEnvironment()) {
6783 default:
6784 return new X86_32TargetInfo(Triple);
6785 case llvm::Triple::Cygnus:
6786 return new CygwinX86_32TargetInfo(Triple);
6787 case llvm::Triple::GNU:
6788 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006789 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006790 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006791 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006792 }
6793 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006794 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006795 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006796 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006797 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006798 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006799 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006800 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006801 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006802 }
6803
6804 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006805 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006806 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006807
Daniel Dunbar52322032009-08-18 05:47:58 +00006808 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006809 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006810 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006811 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006813 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006814 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006815 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006816 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006817 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006818 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006819 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006820 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006821 case llvm::Triple::KFreeBSD:
6822 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006823 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006824 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006825 case llvm::Triple::Win32: {
6826 switch (Triple.getEnvironment()) {
6827 default:
6828 return new X86_64TargetInfo(Triple);
6829 case llvm::Triple::GNU:
6830 return new MinGWX86_64TargetInfo(Triple);
6831 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006832 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006833 }
6834 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006835 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006836 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006837 case llvm::Triple::PS4:
6838 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006839 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006840 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006841 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006842
6843 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006844 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006845 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006846 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006847 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006848 }
6849 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006850 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006851 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006852 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006853 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006854 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006855 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006856}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006857
6858/// CreateTargetInfo - Return the target info object for the specified target
6859/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006860TargetInfo *
6861TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6862 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006863 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006864
6865 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006866 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006867 if (!Target) {
6868 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006869 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006870 }
Alp Toker80758082014-07-06 05:26:44 +00006871 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006872
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006873 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006874 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6875 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006876 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006877 }
6878
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006879 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006880 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6881 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006882 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006883 }
6884
Rafael Espindolaeb265472013-08-21 21:59:03 +00006885 // Set the fp math unit.
6886 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6887 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006888 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006889 }
6890
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006891 // Compute the default target features, we need the target to handle this
6892 // because features may have dependencies on one another.
6893 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006894 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006895
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006896 // Apply the user specified deltas.
6897 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6898 I < N; ++I) {
6899 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006900 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006901 bool Enabled = Name[0] == '+';
6902 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006903 }
6904
6905 // Add the features to the compile options.
6906 //
6907 // FIXME: If we are completely confident that we have the right set, we only
6908 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006909 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006910 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6911 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006912 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006913 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006914 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006915
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006916 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006917}