blob: c74bb936e3a2828fdf9de5dbcd59b16b2caccb17 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Chris Lattner30ba6742009-08-10 19:03:04 +0000187namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Craig Topper3164f332014-03-11 03:39:26 +0000191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195 }
Mike Stump11289f42009-09-09 15:08:12 +0000196
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Craig Topper3164f332014-03-11 03:39:26 +0000203 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000204 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000205 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000206 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000207 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000209 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000210 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000211
Craig Topper3164f332014-03-11 03:39:26 +0000212 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000216
John McCalleed64c72012-01-29 01:20:30 +0000217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000220 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000221 return false;
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223};
224
Chris Lattner30ba6742009-08-10 19:03:04 +0000225
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
Craig Topper3164f332014-03-11 03:39:26 +0000230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000239 }
240public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000244
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
Craig Topper3164f332014-03-11 03:39:26 +0000259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 // FreeBSD defines; list based off of gcc output
262
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
276 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277 }
278public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000279 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
280 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000281
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000282 switch (Triple.getArch()) {
283 default:
284 case llvm::Triple::x86:
285 case llvm::Triple::x86_64:
286 this->MCountName = ".mcount";
287 break;
288 case llvm::Triple::mips:
289 case llvm::Triple::mipsel:
290 case llvm::Triple::ppc:
291 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000292 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000293 this->MCountName = "_mcount";
294 break;
295 case llvm::Triple::arm:
296 this->MCountName = "__mcount";
297 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000298 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300};
301
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000302// GNU/kFreeBSD Target
303template<typename Target>
304class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
305protected:
Craig Topper3164f332014-03-11 03:39:26 +0000306 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
307 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308 // GNU/kFreeBSD defines; list based off of gcc output
309
310 DefineStd(Builder, "unix", Opts);
311 Builder.defineMacro("__FreeBSD_kernel__");
312 Builder.defineMacro("__GLIBC__");
313 Builder.defineMacro("__ELF__");
314 if (Opts.POSIXThreads)
315 Builder.defineMacro("_REENTRANT");
316 if (Opts.CPlusPlus)
317 Builder.defineMacro("_GNU_SOURCE");
318 }
319public:
Eric Christopher917e9522014-11-18 22:36:15 +0000320 KFreeBSDTargetInfo(const llvm::Triple &Triple)
321 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000322 this->UserLabelPrefix = "";
323 }
324};
325
Chris Lattner3e2ee142010-07-07 16:01:42 +0000326// Minix Target
327template<typename Target>
328class MinixTargetInfo : public OSTargetInfo<Target> {
329protected:
Craig Topper3164f332014-03-11 03:39:26 +0000330 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
331 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000332 // Minix defines
333
334 Builder.defineMacro("__minix", "3");
335 Builder.defineMacro("_EM_WSIZE", "4");
336 Builder.defineMacro("_EM_PSIZE", "4");
337 Builder.defineMacro("_EM_SSIZE", "2");
338 Builder.defineMacro("_EM_LSIZE", "4");
339 Builder.defineMacro("_EM_FSIZE", "4");
340 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000341 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000342 DefineStd(Builder, "unix", Opts);
343 }
344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000345 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
346 this->UserLabelPrefix = "";
347 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000348};
349
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350// Linux target
351template<typename Target>
352class LinuxTargetInfo : public OSTargetInfo<Target> {
353protected:
Craig Topper3164f332014-03-11 03:39:26 +0000354 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
355 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000357 DefineStd(Builder, "unix", Opts);
358 DefineStd(Builder, "linux", Opts);
359 Builder.defineMacro("__gnu_linux__");
360 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000361 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000362 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000363 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000364 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000365 if (Opts.CPlusPlus)
366 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000367 }
368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000369 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000370 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000371 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000372
373 switch (Triple.getArch()) {
374 default:
375 break;
376 case llvm::Triple::ppc:
377 case llvm::Triple::ppc64:
378 case llvm::Triple::ppc64le:
379 this->MCountName = "_mcount";
380 break;
381 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000382 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000383
Craig Topper3164f332014-03-11 03:39:26 +0000384 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000385 return ".text.startup";
386 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000387};
388
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000389// NetBSD Target
390template<typename Target>
391class NetBSDTargetInfo : public OSTargetInfo<Target> {
392protected:
Craig Topper3164f332014-03-11 03:39:26 +0000393 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
394 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000395 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("__NetBSD__");
397 Builder.defineMacro("__unix__");
398 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000399 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000400 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000401
402 switch (Triple.getArch()) {
403 default:
404 break;
405 case llvm::Triple::arm:
406 case llvm::Triple::armeb:
407 case llvm::Triple::thumb:
408 case llvm::Triple::thumbeb:
409 Builder.defineMacro("__ARM_DWARF_EH__");
410 break;
411 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000412 }
413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000414 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
415 this->UserLabelPrefix = "";
416 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000417};
418
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419// OpenBSD Target
420template<typename Target>
421class OpenBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425 // OpenBSD defines; list based off of gcc output
426
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("__OpenBSD__");
428 DefineStd(Builder, "unix", Opts);
429 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000430 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000431 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000432 }
433public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000434 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
435 this->UserLabelPrefix = "";
436 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000437
Eli Friedman3715d1f2011-12-15 02:15:56 +0000438 switch (Triple.getArch()) {
439 default:
440 case llvm::Triple::x86:
441 case llvm::Triple::x86_64:
442 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000443 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000444 this->MCountName = "__mcount";
445 break;
446 case llvm::Triple::mips64:
447 case llvm::Triple::mips64el:
448 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000449 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000450 this->MCountName = "_mcount";
451 break;
452 }
453 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000454};
455
Eli Friedman9fa28852012-08-08 23:57:20 +0000456// Bitrig Target
457template<typename Target>
458class BitrigTargetInfo : public OSTargetInfo<Target> {
459protected:
Craig Topper3164f332014-03-11 03:39:26 +0000460 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
461 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000462 // Bitrig defines; list based off of gcc output
463
464 Builder.defineMacro("__Bitrig__");
465 DefineStd(Builder, "unix", Opts);
466 Builder.defineMacro("__ELF__");
467 if (Opts.POSIXThreads)
468 Builder.defineMacro("_REENTRANT");
469 }
470public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000471 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
472 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000473 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000474 }
475};
476
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000477// PSP Target
478template<typename Target>
479class PSPTargetInfo : public OSTargetInfo<Target> {
480protected:
Craig Topper3164f332014-03-11 03:39:26 +0000481 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
482 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000483 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000484 Builder.defineMacro("PSP");
485 Builder.defineMacro("_PSP");
486 Builder.defineMacro("__psp__");
487 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000488 }
489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000490 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000491 this->UserLabelPrefix = "";
492 }
493};
494
John Thompsone467e192009-11-19 17:18:50 +0000495// PS3 PPU Target
496template<typename Target>
497class PS3PPUTargetInfo : public OSTargetInfo<Target> {
498protected:
Craig Topper3164f332014-03-11 03:39:26 +0000499 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
500 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000501 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000502 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000503 Builder.defineMacro("__PPU__");
504 Builder.defineMacro("__CELLOS_LV2__");
505 Builder.defineMacro("__ELF__");
506 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000507 Builder.defineMacro("_ARCH_PPC64");
508 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000509 }
510public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000511 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000512 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000513 this->LongWidth = this->LongAlign = 32;
514 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000515 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000516 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000517 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000518 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000519 }
520};
521
Torok Edwinb2b37c62009-06-30 17:10:35 +0000522// Solaris target
523template<typename Target>
524class SolarisTargetInfo : public OSTargetInfo<Target> {
525protected:
Craig Topper3164f332014-03-11 03:39:26 +0000526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
527 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 DefineStd(Builder, "sun", Opts);
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
531 Builder.defineMacro("__svr4__");
532 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000533 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
534 // newer, but to 500 for everything else. feature_test.h has a check to
535 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000536 // with a new version.
537 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000538 Builder.defineMacro("_XOPEN_SOURCE", "600");
539 else
540 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000541 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000542 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000543 Builder.defineMacro("_LARGEFILE_SOURCE");
544 Builder.defineMacro("_LARGEFILE64_SOURCE");
545 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000546 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000547 }
548public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000549 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000551 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000552 // FIXME: WIntType should be SignedLong
553 }
554};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000555
556// Windows target
557template<typename Target>
558class WindowsTargetInfo : public OSTargetInfo<Target> {
559protected:
Craig Topper3164f332014-03-11 03:39:26 +0000560 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
561 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000562 Builder.defineMacro("_WIN32");
563 }
564 void getVisualStudioDefines(const LangOptions &Opts,
565 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000566 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000567 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000568 Builder.defineMacro("_CPPRTTI");
569
570 if (Opts.Exceptions)
571 Builder.defineMacro("_CPPUNWIND");
572 }
573
574 if (!Opts.CharIsSigned)
575 Builder.defineMacro("_CHAR_UNSIGNED");
576
577 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
578 // but it works for now.
579 if (Opts.POSIXThreads)
580 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000581
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000582 if (Opts.MSCompatibilityVersion) {
583 Builder.defineMacro("_MSC_VER",
584 Twine(Opts.MSCompatibilityVersion / 100000));
585 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000586 // FIXME We cannot encode the revision information into 32-bits
587 Builder.defineMacro("_MSC_BUILD", Twine(1));
588 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000589
590 if (Opts.MicrosoftExt) {
591 Builder.defineMacro("_MSC_EXTENSIONS");
592
593 if (Opts.CPlusPlus11) {
594 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
595 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
596 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
597 }
598 }
599
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000600 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601 }
602
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000603public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000604 WindowsTargetInfo(const llvm::Triple &Triple)
605 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000606};
607
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000608template <typename Target>
609class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000610protected:
Craig Topper3164f332014-03-11 03:39:26 +0000611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
612 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000613 if (Opts.POSIXThreads)
614 Builder.defineMacro("_REENTRANT");
615 if (Opts.CPlusPlus)
616 Builder.defineMacro("_GNU_SOURCE");
617
618 DefineStd(Builder, "unix", Opts);
619 Builder.defineMacro("__ELF__");
620 Builder.defineMacro("__native_client__");
621 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000622
623public:
624 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000625 this->UserLabelPrefix = "";
626 this->LongAlign = 32;
627 this->LongWidth = 32;
628 this->PointerAlign = 32;
629 this->PointerWidth = 32;
630 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000631 this->Int64Type = TargetInfo::SignedLongLong;
632 this->DoubleAlign = 64;
633 this->LongDoubleWidth = 64;
634 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000635 this->LongLongWidth = 64;
636 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000637 this->SizeType = TargetInfo::UnsignedInt;
638 this->PtrDiffType = TargetInfo::SignedInt;
639 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000640 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000641 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000642 if (Triple.getArch() == llvm::Triple::arm) {
Eric Christopher917e9522014-11-18 22:36:15 +0000643 this->DescriptionString =
644 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000645 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000646 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000647 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000648 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000649 } else if (Triple.getArch() == llvm::Triple::mipsel) {
650 // Handled on mips' setDescriptionString.
651 } else {
652 assert(Triple.getArch() == llvm::Triple::le32);
653 this->DescriptionString = "e-p:32:32-i64:64";
654 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000655 }
Craig Topper3164f332014-03-11 03:39:26 +0000656 typename Target::CallingConvCheckResult checkCallingConvention(
657 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000658 return CC == CC_PnaclCall ? Target::CCCR_OK :
659 Target::checkCallingConvention(CC);
660 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000661};
Mike Stump11289f42009-09-09 15:08:12 +0000662} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000663
Chris Lattner09d98f52008-10-05 21:50:58 +0000664//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665// Specific target implementations.
666//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000667
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000668namespace {
669// PPC abstract base class
670class PPCTargetInfo : public TargetInfo {
671 static const Builtin::Info BuiltinInfo[];
672 static const char * const GCCRegNames[];
673 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000674 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000675
676 // Target cpu features.
677 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000678 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000679
Ulrich Weigand8afad612014-07-28 13:17:52 +0000680protected:
681 std::string ABI;
682
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000683public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000684 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000685 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000686 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000687 LongDoubleWidth = LongDoubleAlign = 128;
688 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
689 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000690
Hal Finkel6b984f02012-07-03 16:51:04 +0000691 /// \brief Flags for architecture specific defines.
692 typedef enum {
693 ArchDefineNone = 0,
694 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
695 ArchDefinePpcgr = 1 << 1,
696 ArchDefinePpcsq = 1 << 2,
697 ArchDefine440 = 1 << 3,
698 ArchDefine603 = 1 << 4,
699 ArchDefine604 = 1 << 5,
700 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000701 ArchDefinePwr5 = 1 << 7,
702 ArchDefinePwr5x = 1 << 8,
703 ArchDefinePwr6 = 1 << 9,
704 ArchDefinePwr6x = 1 << 10,
705 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000706 ArchDefinePwr8 = 1 << 12,
707 ArchDefineA2 = 1 << 13,
708 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000709 } ArchDefineTypes;
710
Bill Schmidt38378a02013-02-01 20:23:10 +0000711 // Note: GCC recognizes the following additional cpus:
712 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
713 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
714 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000715 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000716 bool CPUKnown = llvm::StringSwitch<bool>(Name)
717 .Case("generic", true)
718 .Case("440", true)
719 .Case("450", true)
720 .Case("601", true)
721 .Case("602", true)
722 .Case("603", true)
723 .Case("603e", true)
724 .Case("603ev", true)
725 .Case("604", true)
726 .Case("604e", true)
727 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000728 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000729 .Case("g3", true)
730 .Case("7400", true)
731 .Case("g4", true)
732 .Case("7450", true)
733 .Case("g4+", true)
734 .Case("750", true)
735 .Case("970", true)
736 .Case("g5", true)
737 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000738 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000739 .Case("e500mc", true)
740 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000741 .Case("power3", true)
742 .Case("pwr3", true)
743 .Case("power4", true)
744 .Case("pwr4", true)
745 .Case("power5", true)
746 .Case("pwr5", true)
747 .Case("power5x", true)
748 .Case("pwr5x", true)
749 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000750 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000751 .Case("power6x", true)
752 .Case("pwr6x", true)
753 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000754 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000755 .Case("power8", true)
756 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000757 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000758 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000759 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000760 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000761 .Case("powerpc64le", true)
762 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000763 .Default(false);
764
765 if (CPUKnown)
766 CPU = Name;
767
768 return CPUKnown;
769 }
770
Ulrich Weigand8afad612014-07-28 13:17:52 +0000771
772 StringRef getABI() const override { return ABI; }
773
Craig Topper3164f332014-03-11 03:39:26 +0000774 void getTargetBuiltins(const Builtin::Info *&Records,
775 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000776 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000777 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000778 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000779
Craig Topper3164f332014-03-11 03:39:26 +0000780 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000781
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getTargetDefines(const LangOptions &Opts,
783 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000784
Craig Topper3164f332014-03-11 03:39:26 +0000785 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000786
Craig Topper3164f332014-03-11 03:39:26 +0000787 bool handleTargetFeatures(std::vector<std::string> &Features,
788 DiagnosticsEngine &Diags) override;
789 bool hasFeature(StringRef Feature) const override;
790
791 void getGCCRegNames(const char * const *&Names,
792 unsigned &NumNames) const override;
793 void getGCCRegAliases(const GCCRegAlias *&Aliases,
794 unsigned &NumAliases) const override;
795 bool validateAsmConstraint(const char *&Name,
796 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000797 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000798 default: return false;
799 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000800 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000801 case 'b': // Base register
802 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000803 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000804 break;
805 // FIXME: The following are added to allow parsing.
806 // I just took a guess at what the actions should be.
807 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'v': // Altivec vector register
810 Info.setAllowsRegister();
811 break;
812 case 'w':
813 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000814 case 'd':// VSX vector register to hold vector double data
815 case 'f':// VSX vector register to hold vector float data
816 case 's':// VSX vector register to hold scalar float data
817 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000818 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000819 break;
820 default:
821 return false;
822 }
823 Info.setAllowsRegister();
824 Name++; // Skip over 'w'.
825 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000826 case 'h': // `MQ', `CTR', or `LINK' register
827 case 'q': // `MQ' register
828 case 'c': // `CTR' register
829 case 'l': // `LINK' register
830 case 'x': // `CR' register (condition register) number 0
831 case 'y': // `CR' register (condition register)
832 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000833 Info.setAllowsRegister();
834 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000835 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000836 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000837 // (use `L' instead for SImode constants)
838 case 'K': // Unsigned 16-bit constant
839 case 'L': // Signed 16-bit constant shifted left 16 bits
840 case 'M': // Constant larger than 31
841 case 'N': // Exact power of 2
842 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000843 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000844 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000845 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000846 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000847 break;
848 case 'm': // Memory operand. Note that on PowerPC targets, m can
849 // include addresses that update the base register. It
850 // is therefore only safe to use `m' in an asm statement
851 // if that asm statement accesses the operand exactly once.
852 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000853 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000855 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000856 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000857 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
858 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // register to be updated.
860 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000861 if (Name[1] != 's')
862 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000863 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000864 // include any automodification of the base register. Unlike
865 // `m', this constraint can be used in asm statements that
866 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000867 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000868 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000869 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000870 break;
871 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000873 case 'Z': // Memory operand that is an indexed or indirect from a
874 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000875 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000876 Info.setAllowsMemory();
877 Info.setAllowsRegister();
878 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000879 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000880 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000881 // register (`p' is preferable for asm statements)
882 case 'S': // Constant suitable as a 64-bit mask operand
883 case 'T': // Constant suitable as a 32-bit mask operand
884 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000885 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000886 // instructions
887 case 'W': // Vector constant that does not require memory
888 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000889 break;
890 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000891 }
John Thompson07a61a42010-06-24 22:44:13 +0000892 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000893 }
Craig Topper3164f332014-03-11 03:39:26 +0000894 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000895 std::string R;
896 switch (*Constraint) {
897 case 'e':
898 case 'w':
899 // Two-character constraint; add "^" hint for later parsing.
900 R = std::string("^") + std::string(Constraint, 2);
901 Constraint++;
902 break;
903 default:
904 return TargetInfo::convertConstraint(Constraint);
905 }
906 return R;
907 }
Craig Topper3164f332014-03-11 03:39:26 +0000908 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000909 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000910 }
Craig Topper3164f332014-03-11 03:39:26 +0000911 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000912 if (RegNo == 0) return 3;
913 if (RegNo == 1) return 4;
914 return -1;
915 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000916};
Anders Carlssonf511f642007-11-27 04:11:28 +0000917
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000918const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000919#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000920#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000921 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000922#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000923};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000924
Eric Christopher917e9522014-11-18 22:36:15 +0000925/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000926/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000927bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000928 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000929 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
930 // Ignore disabled features.
931 if (Features[i][0] == '-')
932 continue;
933
934 StringRef Feature = StringRef(Features[i]).substr(1);
935
936 if (Feature == "vsx") {
937 HasVSX = true;
938 continue;
939 }
940
Bill Schmidt59eb7672014-10-10 15:09:43 +0000941 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000942 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000943 continue;
944 }
945
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000946 // TODO: Finish this list and add an assert that we've handled them
947 // all.
948 }
949
950 return true;
951}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952
Chris Lattnerecd49032009-03-02 22:27:17 +0000953/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
954/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000955void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000956 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000957 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000958 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000959 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000960 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000961 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000962 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000963 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000964 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000965 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000966 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000967 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000968 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000969
Chris Lattnerecd49032009-03-02 22:27:17 +0000970 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000971 if (getTriple().getArch() == llvm::Triple::ppc64le) {
972 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000973 } else {
974 if (getTriple().getOS() != llvm::Triple::NetBSD &&
975 getTriple().getOS() != llvm::Triple::OpenBSD)
976 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Ulrich Weigand8afad612014-07-28 13:17:52 +0000979 // ABI options.
980 if (ABI == "elfv1")
981 Builder.defineMacro("_CALL_ELF", "1");
982 if (ABI == "elfv2")
983 Builder.defineMacro("_CALL_ELF", "2");
984
Chris Lattnerecd49032009-03-02 22:27:17 +0000985 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000986 Builder.defineMacro("__NATURAL_ALIGNMENT__");
987 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000988
Chris Lattnerecd49032009-03-02 22:27:17 +0000989 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000990 if (LongDoubleWidth == 128)
991 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000992
John Thompsone467e192009-11-19 17:18:50 +0000993 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000994 Builder.defineMacro("__VEC__", "10206");
995 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000996 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000997
998 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000999 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1000 .Case("440", ArchDefineName)
1001 .Case("450", ArchDefineName | ArchDefine440)
1002 .Case("601", ArchDefineName)
1003 .Case("602", ArchDefineName | ArchDefinePpcgr)
1004 .Case("603", ArchDefineName | ArchDefinePpcgr)
1005 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1006 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1007 .Case("604", ArchDefineName | ArchDefinePpcgr)
1008 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1009 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001010 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001011 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1012 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1013 .Case("750", ArchDefineName | ArchDefinePpcgr)
1014 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1015 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001016 .Case("a2", ArchDefineA2)
1017 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001018 .Case("pwr3", ArchDefinePpcgr)
1019 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1020 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1021 | ArchDefinePpcsq)
1022 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1023 | ArchDefinePpcgr | ArchDefinePpcsq)
1024 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1025 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1027 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1028 | ArchDefinePpcsq)
1029 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1030 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001031 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1033 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1034 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001035 .Case("power3", ArchDefinePpcgr)
1036 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1037 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1038 | ArchDefinePpcsq)
1039 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1040 | ArchDefinePpcgr | ArchDefinePpcsq)
1041 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1042 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1044 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1045 | ArchDefinePpcsq)
1046 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1047 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001048 | ArchDefinePpcgr | ArchDefinePpcsq)
1049 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1050 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1051 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001052 .Default(ArchDefineNone);
1053
1054 if (defs & ArchDefineName)
1055 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1056 if (defs & ArchDefinePpcgr)
1057 Builder.defineMacro("_ARCH_PPCGR");
1058 if (defs & ArchDefinePpcsq)
1059 Builder.defineMacro("_ARCH_PPCSQ");
1060 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001061 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001062 if (defs & ArchDefine603)
1063 Builder.defineMacro("_ARCH_603");
1064 if (defs & ArchDefine604)
1065 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001066 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001067 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001069 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001070 if (defs & ArchDefinePwr5x)
1071 Builder.defineMacro("_ARCH_PWR5X");
1072 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001073 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001074 if (defs & ArchDefinePwr6x)
1075 Builder.defineMacro("_ARCH_PWR6X");
1076 if (defs & ArchDefinePwr7)
1077 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001078 if (defs & ArchDefinePwr8)
1079 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001080 if (defs & ArchDefineA2)
1081 Builder.defineMacro("_ARCH_A2");
1082 if (defs & ArchDefineA2q) {
1083 Builder.defineMacro("_ARCH_A2Q");
1084 Builder.defineMacro("_ARCH_QP");
1085 }
1086
1087 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1088 Builder.defineMacro("__bg__");
1089 Builder.defineMacro("__THW_BLUEGENE__");
1090 Builder.defineMacro("__bgq__");
1091 Builder.defineMacro("__TOS_BGQ__");
1092 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001093
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001094 if (HasVSX)
1095 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001096 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001097 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001098
Bill Schmidt38378a02013-02-01 20:23:10 +00001099 // FIXME: The following are not yet generated here by Clang, but are
1100 // generated by GCC:
1101 //
1102 // _SOFT_FLOAT_
1103 // __RECIP_PRECISION__
1104 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001105 // __RECIP__
1106 // __RECIPF__
1107 // __RSQRTE__
1108 // __RSQRTEF__
1109 // _SOFT_DOUBLE_
1110 // __NO_LWSYNC__
1111 // __HAVE_BSWAP__
1112 // __LONGDOUBLE128
1113 // __CMODEL_MEDIUM__
1114 // __CMODEL_LARGE__
1115 // _CALL_SYSV
1116 // _CALL_DARWIN
1117 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001118}
1119
1120void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1121 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1122 .Case("7400", true)
1123 .Case("g4", true)
1124 .Case("7450", true)
1125 .Case("g4+", true)
1126 .Case("970", true)
1127 .Case("g5", true)
1128 .Case("pwr6", true)
1129 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001130 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001131 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001132 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001133 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001134
1135 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001136
1137 if (!ABI.empty())
1138 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001139}
1140
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001141bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001142 return llvm::StringSwitch<bool>(Feature)
1143 .Case("powerpc", true)
1144 .Case("vsx", HasVSX)
1145 .Case("power8-vector", HasP8Vector)
1146 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001147}
Chris Lattner17df24e2008-04-21 18:56:49 +00001148
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001149const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001150 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1151 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1152 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1153 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1154 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1155 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1156 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1157 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001159 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001161 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1162 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1163 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1164 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001165 "vrsave", "vscr",
1166 "spe_acc", "spefscr",
1167 "sfp"
1168};
Chris Lattner10a5b382007-01-29 05:24:35 +00001169
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001170void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171 unsigned &NumNames) const {
1172 Names = GCCRegNames;
1173 NumNames = llvm::array_lengthof(GCCRegNames);
1174}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001175
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001176const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1177 // While some of these aliases do map to different registers
1178 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001179 { { "0" }, "r0" },
1180 { { "1"}, "r1" },
1181 { { "2" }, "r2" },
1182 { { "3" }, "r3" },
1183 { { "4" }, "r4" },
1184 { { "5" }, "r5" },
1185 { { "6" }, "r6" },
1186 { { "7" }, "r7" },
1187 { { "8" }, "r8" },
1188 { { "9" }, "r9" },
1189 { { "10" }, "r10" },
1190 { { "11" }, "r11" },
1191 { { "12" }, "r12" },
1192 { { "13" }, "r13" },
1193 { { "14" }, "r14" },
1194 { { "15" }, "r15" },
1195 { { "16" }, "r16" },
1196 { { "17" }, "r17" },
1197 { { "18" }, "r18" },
1198 { { "19" }, "r19" },
1199 { { "20" }, "r20" },
1200 { { "21" }, "r21" },
1201 { { "22" }, "r22" },
1202 { { "23" }, "r23" },
1203 { { "24" }, "r24" },
1204 { { "25" }, "r25" },
1205 { { "26" }, "r26" },
1206 { { "27" }, "r27" },
1207 { { "28" }, "r28" },
1208 { { "29" }, "r29" },
1209 { { "30" }, "r30" },
1210 { { "31" }, "r31" },
1211 { { "fr0" }, "f0" },
1212 { { "fr1" }, "f1" },
1213 { { "fr2" }, "f2" },
1214 { { "fr3" }, "f3" },
1215 { { "fr4" }, "f4" },
1216 { { "fr5" }, "f5" },
1217 { { "fr6" }, "f6" },
1218 { { "fr7" }, "f7" },
1219 { { "fr8" }, "f8" },
1220 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001221 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001222 { { "fr11" }, "f11" },
1223 { { "fr12" }, "f12" },
1224 { { "fr13" }, "f13" },
1225 { { "fr14" }, "f14" },
1226 { { "fr15" }, "f15" },
1227 { { "fr16" }, "f16" },
1228 { { "fr17" }, "f17" },
1229 { { "fr18" }, "f18" },
1230 { { "fr19" }, "f19" },
1231 { { "fr20" }, "f20" },
1232 { { "fr21" }, "f21" },
1233 { { "fr22" }, "f22" },
1234 { { "fr23" }, "f23" },
1235 { { "fr24" }, "f24" },
1236 { { "fr25" }, "f25" },
1237 { { "fr26" }, "f26" },
1238 { { "fr27" }, "f27" },
1239 { { "fr28" }, "f28" },
1240 { { "fr29" }, "f29" },
1241 { { "fr30" }, "f30" },
1242 { { "fr31" }, "f31" },
1243 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001244};
1245
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001246void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001247 unsigned &NumAliases) const {
1248 Aliases = GCCRegAliases;
1249 NumAliases = llvm::array_lengthof(GCCRegAliases);
1250}
1251} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001252
Chris Lattner5ba61f02006-10-14 07:39:34 +00001253namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001254class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001256 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001257 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001258
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001259 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001260 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001261 case llvm::Triple::FreeBSD:
1262 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001263 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001264 PtrDiffType = SignedInt;
1265 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001266 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001267 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001268 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001269 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001270
Roman Divacky3ffe7462012-03-13 19:20:17 +00001271 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1272 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001273 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001274 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001275
1276 // PPC32 supports atomics up to 4 bytes.
1277 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001278 }
1279
Craig Topper3164f332014-03-11 03:39:26 +00001280 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001281 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001282 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001283 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001284};
1285} // end anonymous namespace.
1286
Bill Schmidt778d3872013-07-26 01:36:11 +00001287// Note: ABI differences may eventually require us to have a separate
1288// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001289namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001290class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001291public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001292 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001293 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001294 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001295 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001296
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001297 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1298 DescriptionString = "e-m:e-i64:64-n32:64";
1299 ABI = "elfv2";
1300 } else {
1301 DescriptionString = "E-m:e-i64:64-n32:64";
1302 ABI = "elfv1";
1303 }
1304
1305 switch (getTriple().getOS()) {
1306 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001307 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001308 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001309 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001310 case llvm::Triple::NetBSD:
1311 IntMaxType = SignedLongLong;
1312 Int64Type = SignedLongLong;
1313 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001314 default:
1315 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001316 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001317
1318 // PPC64 supports atomics up to 8 bytes.
1319 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001320 }
Craig Topper3164f332014-03-11 03:39:26 +00001321 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001322 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001323 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001324 // PPC64 Linux-specifc ABI options.
1325 bool setABI(const std::string &Name) override {
1326 if (Name == "elfv1" || Name == "elfv2") {
1327 ABI = Name;
1328 return true;
1329 }
1330 return false;
1331 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001332};
1333} // end anonymous namespace.
1334
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001335
1336namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001337class DarwinPPC32TargetInfo :
1338 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001339public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001340 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1341 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001342 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001343 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001344 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001345 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001346 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001347 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001348 }
Craig Topper3164f332014-03-11 03:39:26 +00001349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001350 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001351 }
1352};
1353
1354class DarwinPPC64TargetInfo :
1355 public DarwinTargetInfo<PPC64TargetInfo> {
1356public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001357 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1358 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001359 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001360 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001361 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001362 }
1363};
1364} // end anonymous namespace.
1365
Chris Lattner5ba61f02006-10-14 07:39:34 +00001366namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001367 static const unsigned NVPTXAddrSpaceMap[] = {
1368 1, // opencl_global
1369 3, // opencl_local
1370 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001371 // FIXME: generic has to be added to the target
1372 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001373 1, // cuda_device
1374 4, // cuda_constant
1375 3, // cuda_shared
1376 };
1377 class NVPTXTargetInfo : public TargetInfo {
1378 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001379 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001380
1381 // The GPU profiles supported by the NVPTX backend
1382 enum GPUKind {
1383 GK_NONE,
1384 GK_SM20,
1385 GK_SM21,
1386 GK_SM30,
1387 GK_SM35,
1388 } GPU;
1389
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001391 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 BigEndian = false;
1393 TLSSupported = false;
1394 LongWidth = LongAlign = 64;
1395 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001396 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001397 // Define available target features
1398 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001399 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001400 // Set the default GPU to sm20
1401 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001402 }
Craig Topper3164f332014-03-11 03:39:26 +00001403 void getTargetDefines(const LangOptions &Opts,
1404 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001406 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001407 if (Opts.CUDAIsDevice) {
1408 // Set __CUDA_ARCH__ for the GPU specified.
1409 std::string CUDAArchCode;
1410 switch (GPU) {
1411 case GK_SM20:
1412 CUDAArchCode = "200";
1413 break;
1414 case GK_SM21:
1415 CUDAArchCode = "210";
1416 break;
1417 case GK_SM30:
1418 CUDAArchCode = "300";
1419 break;
1420 case GK_SM35:
1421 CUDAArchCode = "350";
1422 break;
1423 default:
1424 llvm_unreachable("Unhandled target CPU");
1425 }
1426 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1427 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001428 }
Craig Topper3164f332014-03-11 03:39:26 +00001429 void getTargetBuiltins(const Builtin::Info *&Records,
1430 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001431 Records = BuiltinInfo;
1432 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001433 }
Craig Topper3164f332014-03-11 03:39:26 +00001434 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001435 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001436 }
Craig Topper3164f332014-03-11 03:39:26 +00001437
1438 void getGCCRegNames(const char * const *&Names,
1439 unsigned &NumNames) const override;
1440 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1441 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001442 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001443 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001444 NumAliases = 0;
1445 }
Eric Christopher917e9522014-11-18 22:36:15 +00001446 bool
1447 validateAsmConstraint(const char *&Name,
1448 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001449 switch (*Name) {
1450 default: return false;
1451 case 'c':
1452 case 'h':
1453 case 'r':
1454 case 'l':
1455 case 'f':
1456 case 'd':
1457 Info.setAllowsRegister();
1458 return true;
1459 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001460 }
Craig Topper3164f332014-03-11 03:39:26 +00001461 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001462 // FIXME: Is this really right?
1463 return "";
1464 }
Craig Topper3164f332014-03-11 03:39:26 +00001465 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001466 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001467 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001468 }
Craig Topper3164f332014-03-11 03:39:26 +00001469 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001470 GPU = llvm::StringSwitch<GPUKind>(Name)
1471 .Case("sm_20", GK_SM20)
1472 .Case("sm_21", GK_SM21)
1473 .Case("sm_30", GK_SM30)
1474 .Case("sm_35", GK_SM35)
1475 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001476
Reid Klecknerbbc01782014-12-03 21:53:36 +00001477 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001478 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001479 };
1480
1481 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1482#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1483#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1484 ALL_LANGUAGES },
1485#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001486 };
1487
1488 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1489 "r0"
1490 };
1491
1492 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1493 unsigned &NumNames) const {
1494 Names = GCCRegNames;
1495 NumNames = llvm::array_lengthof(GCCRegNames);
1496 }
1497
1498 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1499 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001500 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001501 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001502 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1503 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001504 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001505 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001506 };
1507
1508 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1509 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001510 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001511 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001512 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1513 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001514 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001515 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001516 };
1517}
1518
1519namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001520
1521static const unsigned R600AddrSpaceMap[] = {
1522 1, // opencl_global
1523 3, // opencl_local
1524 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001525 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001526 1, // cuda_device
1527 2, // cuda_constant
1528 3 // cuda_shared
1529};
1530
Tom Stellarda96344b2014-08-21 13:58:40 +00001531// If you edit the description strings, make sure you update
1532// getPointerWidthV().
1533
Tom Stellardc74b1e02013-03-04 17:40:53 +00001534static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001535 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1536 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001537
1538static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001539 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1540 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001541
1542static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001543 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001544 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1545 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001546
Eli Friedmand13b41e2012-10-12 23:32:00 +00001547class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001548 static const Builtin::Info BuiltinInfo[];
1549
Tom Stellardc74b1e02013-03-04 17:40:53 +00001550 /// \brief The GPU profiles supported by the R600 target.
1551 enum GPUKind {
1552 GK_NONE,
1553 GK_R600,
1554 GK_R600_DOUBLE_OPS,
1555 GK_R700,
1556 GK_R700_DOUBLE_OPS,
1557 GK_EVERGREEN,
1558 GK_EVERGREEN_DOUBLE_OPS,
1559 GK_NORTHERN_ISLANDS,
1560 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001561 GK_SOUTHERN_ISLANDS,
1562 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001563 } GPU;
1564
Eli Friedmand13b41e2012-10-12 23:32:00 +00001565public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001566 R600TargetInfo(const llvm::Triple &Triple)
1567 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001568 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001569 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001570 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001571 }
1572
Tom Stellarda96344b2014-08-21 13:58:40 +00001573 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1574 if (GPU <= GK_CAYMAN)
1575 return 32;
1576
1577 switch(AddrSpace) {
1578 default:
1579 return 64;
1580 case 0:
1581 case 3:
1582 case 5:
1583 return 32;
1584 }
1585 }
1586
Craig Topper3164f332014-03-11 03:39:26 +00001587 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001588 return "";
1589 }
1590
Craig Topper3164f332014-03-11 03:39:26 +00001591 void getGCCRegNames(const char * const *&Names,
1592 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001593 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001594 numNames = 0;
1595 }
1596
Craig Topper3164f332014-03-11 03:39:26 +00001597 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1598 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001599 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001600 NumAliases = 0;
1601 }
1602
Craig Topper3164f332014-03-11 03:39:26 +00001603 bool validateAsmConstraint(const char *&Name,
1604 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001605 return true;
1606 }
1607
Craig Topper3164f332014-03-11 03:39:26 +00001608 void getTargetBuiltins(const Builtin::Info *&Records,
1609 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001610 Records = BuiltinInfo;
1611 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001612 }
1613
Craig Topper3164f332014-03-11 03:39:26 +00001614 void getTargetDefines(const LangOptions &Opts,
1615 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001616 Builder.defineMacro("__R600__");
1617 }
1618
Craig Topper3164f332014-03-11 03:39:26 +00001619 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001620 return TargetInfo::CharPtrBuiltinVaList;
1621 }
1622
Craig Topper3164f332014-03-11 03:39:26 +00001623 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001624 GPU = llvm::StringSwitch<GPUKind>(Name)
1625 .Case("r600" , GK_R600)
1626 .Case("rv610", GK_R600)
1627 .Case("rv620", GK_R600)
1628 .Case("rv630", GK_R600)
1629 .Case("rv635", GK_R600)
1630 .Case("rs780", GK_R600)
1631 .Case("rs880", GK_R600)
1632 .Case("rv670", GK_R600_DOUBLE_OPS)
1633 .Case("rv710", GK_R700)
1634 .Case("rv730", GK_R700)
1635 .Case("rv740", GK_R700_DOUBLE_OPS)
1636 .Case("rv770", GK_R700_DOUBLE_OPS)
1637 .Case("palm", GK_EVERGREEN)
1638 .Case("cedar", GK_EVERGREEN)
1639 .Case("sumo", GK_EVERGREEN)
1640 .Case("sumo2", GK_EVERGREEN)
1641 .Case("redwood", GK_EVERGREEN)
1642 .Case("juniper", GK_EVERGREEN)
1643 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1644 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1645 .Case("barts", GK_NORTHERN_ISLANDS)
1646 .Case("turks", GK_NORTHERN_ISLANDS)
1647 .Case("caicos", GK_NORTHERN_ISLANDS)
1648 .Case("cayman", GK_CAYMAN)
1649 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001650 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001651 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1652 .Case("verde", GK_SOUTHERN_ISLANDS)
1653 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001654 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001655 .Case("bonaire", GK_SEA_ISLANDS)
1656 .Case("kabini", GK_SEA_ISLANDS)
1657 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001658 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001659 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001660 .Default(GK_NONE);
1661
1662 if (GPU == GK_NONE) {
1663 return false;
1664 }
1665
1666 // Set the correct data layout
1667 switch (GPU) {
1668 case GK_NONE:
1669 case GK_R600:
1670 case GK_R700:
1671 case GK_EVERGREEN:
1672 case GK_NORTHERN_ISLANDS:
1673 DescriptionString = DescriptionStringR600;
1674 break;
1675 case GK_R600_DOUBLE_OPS:
1676 case GK_R700_DOUBLE_OPS:
1677 case GK_EVERGREEN_DOUBLE_OPS:
1678 case GK_CAYMAN:
1679 DescriptionString = DescriptionStringR600DoubleOps;
1680 break;
1681 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001682 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001683 DescriptionString = DescriptionStringSI;
1684 break;
1685 }
1686
1687 return true;
1688 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001689};
1690
Matt Arsenault56f008d2014-06-24 20:45:01 +00001691const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1692#define BUILTIN(ID, TYPE, ATTRS) \
1693 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1694#include "clang/Basic/BuiltinsR600.def"
1695};
1696
Eli Friedmand13b41e2012-10-12 23:32:00 +00001697} // end anonymous namespace
1698
1699namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001700// Namespace for x86 abstract base class
1701const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001702#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001703#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001704 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001705#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001706};
Eli Friedmanb5366062008-05-20 14:21:01 +00001707
Nuno Lopescfca1f02009-12-23 17:49:57 +00001708static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001709 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1710 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001711 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001712 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1713 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1714 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001715 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001716 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1717 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001718};
1719
Eric Christophercdd36352011-06-21 00:05:20 +00001720const TargetInfo::AddlRegName AddlRegNames[] = {
1721 { { "al", "ah", "eax", "rax" }, 0 },
1722 { { "bl", "bh", "ebx", "rbx" }, 3 },
1723 { { "cl", "ch", "ecx", "rcx" }, 2 },
1724 { { "dl", "dh", "edx", "rdx" }, 1 },
1725 { { "esi", "rsi" }, 4 },
1726 { { "edi", "rdi" }, 5 },
1727 { { "esp", "rsp" }, 7 },
1728 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001729};
1730
1731// X86 target abstract base class; x86-32 and x86-64 are very close, so
1732// most of the implementation can be shared.
1733class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001734 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001735 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001736 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001737 enum MMX3DNowEnum {
1738 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1739 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001740 enum XOPEnum {
1741 NoXOP,
1742 SSE4A,
1743 FMA4,
1744 XOP
1745 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001746
Eric Christophere1ddaf92010-04-02 23:50:19 +00001747 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001748 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001749 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001750 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001751 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001752 bool HasBMI;
1753 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001754 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001755 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001756 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001757 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001758 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001759 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001760 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001761 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001762 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1763 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001764 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001765 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001766
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001767 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1768 ///
1769 /// Each enumeration represents a particular CPU supported by Clang. These
1770 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1771 enum CPUKind {
1772 CK_Generic,
1773
1774 /// \name i386
1775 /// i386-generation processors.
1776 //@{
1777 CK_i386,
1778 //@}
1779
1780 /// \name i486
1781 /// i486-generation processors.
1782 //@{
1783 CK_i486,
1784 CK_WinChipC6,
1785 CK_WinChip2,
1786 CK_C3,
1787 //@}
1788
1789 /// \name i586
1790 /// i586-generation processors, P5 microarchitecture based.
1791 //@{
1792 CK_i586,
1793 CK_Pentium,
1794 CK_PentiumMMX,
1795 //@}
1796
1797 /// \name i686
1798 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1799 //@{
1800 CK_i686,
1801 CK_PentiumPro,
1802 CK_Pentium2,
1803 CK_Pentium3,
1804 CK_Pentium3M,
1805 CK_PentiumM,
1806 CK_C3_2,
1807
1808 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1809 /// Clang however has some logic to suport this.
1810 // FIXME: Warn, deprecate, and potentially remove this.
1811 CK_Yonah,
1812 //@}
1813
1814 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001815 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001816 //@{
1817 CK_Pentium4,
1818 CK_Pentium4M,
1819 CK_Prescott,
1820 CK_Nocona,
1821 //@}
1822
1823 /// \name Core
1824 /// Core microarchitecture based processors.
1825 //@{
1826 CK_Core2,
1827
1828 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1829 /// codename which GCC no longer accepts as an option to -march, but Clang
1830 /// has some logic for recognizing it.
1831 // FIXME: Warn, deprecate, and potentially remove this.
1832 CK_Penryn,
1833 //@}
1834
1835 /// \name Atom
1836 /// Atom processors
1837 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001838 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001839 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001840 //@}
1841
1842 /// \name Nehalem
1843 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001844 CK_Nehalem,
1845
1846 /// \name Westmere
1847 /// Westmere microarchitecture based processors.
1848 CK_Westmere,
1849
1850 /// \name Sandy Bridge
1851 /// Sandy Bridge microarchitecture based processors.
1852 CK_SandyBridge,
1853
1854 /// \name Ivy Bridge
1855 /// Ivy Bridge microarchitecture based processors.
1856 CK_IvyBridge,
1857
1858 /// \name Haswell
1859 /// Haswell microarchitecture based processors.
1860 CK_Haswell,
1861
1862 /// \name Broadwell
1863 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001864 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001865
1866 /// \name Skylake
1867 /// Skylake microarchitecture based processors.
1868 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001869
Craig Topper449314e2013-08-20 07:09:39 +00001870 /// \name Knights Landing
1871 /// Knights Landing processor.
1872 CK_KNL,
1873
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001874 /// \name K6
1875 /// K6 architecture processors.
1876 //@{
1877 CK_K6,
1878 CK_K6_2,
1879 CK_K6_3,
1880 //@}
1881
1882 /// \name K7
1883 /// K7 architecture processors.
1884 //@{
1885 CK_Athlon,
1886 CK_AthlonThunderbird,
1887 CK_Athlon4,
1888 CK_AthlonXP,
1889 CK_AthlonMP,
1890 //@}
1891
1892 /// \name K8
1893 /// K8 architecture processors.
1894 //@{
1895 CK_Athlon64,
1896 CK_Athlon64SSE3,
1897 CK_AthlonFX,
1898 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001899 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001900 CK_Opteron,
1901 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001902 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001903 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001904
Benjamin Kramer569f2152012-01-10 11:50:18 +00001905 /// \name Bobcat
1906 /// Bobcat architecture processors.
1907 //@{
1908 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001909 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001910 //@}
1911
1912 /// \name Bulldozer
1913 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001914 //@{
1915 CK_BDVER1,
1916 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001917 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001918 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001919 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001920
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001921 /// This specification is deprecated and will be removed in the future.
1922 /// Users should prefer \see CK_K8.
1923 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00001924 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001925 CK_x86_64,
1926 //@}
1927
1928 /// \name Geode
1929 /// Geode processors.
1930 //@{
1931 CK_Geode
1932 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001933 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001934
Rafael Espindolaeb265472013-08-21 21:59:03 +00001935 enum FPMathKind {
1936 FP_Default,
1937 FP_SSE,
1938 FP_387
1939 } FPMath;
1940
Eli Friedman3fd920a2008-08-20 02:34:37 +00001941public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001942 X86TargetInfo(const llvm::Triple &Triple)
1943 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001944 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001945 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1946 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1947 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1948 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1949 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1950 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001951 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001952 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001953 }
Craig Topper3164f332014-03-11 03:39:26 +00001954 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001955 // X87 evaluates with 80 bits "long double" precision.
1956 return SSELevel == NoSSE ? 2 : 0;
1957 }
Craig Topper3164f332014-03-11 03:39:26 +00001958 void getTargetBuiltins(const Builtin::Info *&Records,
1959 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001960 Records = BuiltinInfo;
1961 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001962 }
Craig Topper3164f332014-03-11 03:39:26 +00001963 void getGCCRegNames(const char * const *&Names,
1964 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001965 Names = GCCRegNames;
1966 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001967 }
Craig Topper3164f332014-03-11 03:39:26 +00001968 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1969 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001970 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001971 NumAliases = 0;
1972 }
Craig Topper3164f332014-03-11 03:39:26 +00001973 void getGCCAddlRegNames(const AddlRegName *&Names,
1974 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001975 Names = AddlRegNames;
1976 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001977 }
Craig Topper3164f332014-03-11 03:39:26 +00001978 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00001979 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001980
Akira Hatanaka974131e2014-09-18 18:17:18 +00001981 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1982
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001983 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1984
Akira Hatanaka974131e2014-09-18 18:17:18 +00001985 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1986
Craig Topper3164f332014-03-11 03:39:26 +00001987 std::string convertConstraint(const char *&Constraint) const override;
1988 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001989 return "~{dirflag},~{fpsr},~{flags}";
1990 }
Craig Topper3164f332014-03-11 03:39:26 +00001991 void getTargetDefines(const LangOptions &Opts,
1992 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001993 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1994 bool Enabled);
1995 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1996 bool Enabled);
1997 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1998 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001999 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2000 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002001 setFeatureEnabledImpl(Features, Name, Enabled);
2002 }
2003 // This exists purely to cut down on the number of virtual calls in
2004 // getDefaultFeatures which calls this repeatedly.
2005 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2006 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002007 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2008 bool hasFeature(StringRef Feature) const override;
2009 bool handleTargetFeatures(std::vector<std::string> &Features,
2010 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002011 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002012 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002013 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002014 else if (getTriple().getArch() == llvm::Triple::x86 &&
2015 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002016 return "no-mmx";
2017 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002018 }
Craig Topper3164f332014-03-11 03:39:26 +00002019 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002020 CPU = llvm::StringSwitch<CPUKind>(Name)
2021 .Case("i386", CK_i386)
2022 .Case("i486", CK_i486)
2023 .Case("winchip-c6", CK_WinChipC6)
2024 .Case("winchip2", CK_WinChip2)
2025 .Case("c3", CK_C3)
2026 .Case("i586", CK_i586)
2027 .Case("pentium", CK_Pentium)
2028 .Case("pentium-mmx", CK_PentiumMMX)
2029 .Case("i686", CK_i686)
2030 .Case("pentiumpro", CK_PentiumPro)
2031 .Case("pentium2", CK_Pentium2)
2032 .Case("pentium3", CK_Pentium3)
2033 .Case("pentium3m", CK_Pentium3M)
2034 .Case("pentium-m", CK_PentiumM)
2035 .Case("c3-2", CK_C3_2)
2036 .Case("yonah", CK_Yonah)
2037 .Case("pentium4", CK_Pentium4)
2038 .Case("pentium4m", CK_Pentium4M)
2039 .Case("prescott", CK_Prescott)
2040 .Case("nocona", CK_Nocona)
2041 .Case("core2", CK_Core2)
2042 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002043 .Case("bonnell", CK_Bonnell)
2044 .Case("atom", CK_Bonnell) // Legacy name.
2045 .Case("silvermont", CK_Silvermont)
2046 .Case("slm", CK_Silvermont) // Legacy name.
2047 .Case("nehalem", CK_Nehalem)
2048 .Case("corei7", CK_Nehalem) // Legacy name.
2049 .Case("westmere", CK_Westmere)
2050 .Case("sandybridge", CK_SandyBridge)
2051 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2052 .Case("ivybridge", CK_IvyBridge)
2053 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2054 .Case("haswell", CK_Haswell)
2055 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002056 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002057 .Case("skylake", CK_Skylake)
2058 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002059 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 .Case("k6", CK_K6)
2061 .Case("k6-2", CK_K6_2)
2062 .Case("k6-3", CK_K6_3)
2063 .Case("athlon", CK_Athlon)
2064 .Case("athlon-tbird", CK_AthlonThunderbird)
2065 .Case("athlon-4", CK_Athlon4)
2066 .Case("athlon-xp", CK_AthlonXP)
2067 .Case("athlon-mp", CK_AthlonMP)
2068 .Case("athlon64", CK_Athlon64)
2069 .Case("athlon64-sse3", CK_Athlon64SSE3)
2070 .Case("athlon-fx", CK_AthlonFX)
2071 .Case("k8", CK_K8)
2072 .Case("k8-sse3", CK_K8SSE3)
2073 .Case("opteron", CK_Opteron)
2074 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002075 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002076 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002077 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002078 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002079 .Case("bdver1", CK_BDVER1)
2080 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002081 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002082 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002083 .Case("x86-64", CK_x86_64)
2084 .Case("geode", CK_Geode)
2085 .Default(CK_Generic);
2086
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002087 // Perform any per-CPU checks necessary to determine if this CPU is
2088 // acceptable.
2089 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2090 // invalid without explaining *why*.
2091 switch (CPU) {
2092 case CK_Generic:
2093 // No processor selected!
2094 return false;
2095
2096 case CK_i386:
2097 case CK_i486:
2098 case CK_WinChipC6:
2099 case CK_WinChip2:
2100 case CK_C3:
2101 case CK_i586:
2102 case CK_Pentium:
2103 case CK_PentiumMMX:
2104 case CK_i686:
2105 case CK_PentiumPro:
2106 case CK_Pentium2:
2107 case CK_Pentium3:
2108 case CK_Pentium3M:
2109 case CK_PentiumM:
2110 case CK_Yonah:
2111 case CK_C3_2:
2112 case CK_Pentium4:
2113 case CK_Pentium4M:
2114 case CK_Prescott:
2115 case CK_K6:
2116 case CK_K6_2:
2117 case CK_K6_3:
2118 case CK_Athlon:
2119 case CK_AthlonThunderbird:
2120 case CK_Athlon4:
2121 case CK_AthlonXP:
2122 case CK_AthlonMP:
2123 case CK_Geode:
2124 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002125 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002126 return false;
2127
2128 // Fallthrough
2129 case CK_Nocona:
2130 case CK_Core2:
2131 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002132 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002133 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002134 case CK_Nehalem:
2135 case CK_Westmere:
2136 case CK_SandyBridge:
2137 case CK_IvyBridge:
2138 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002139 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002140 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002141 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002142 case CK_Athlon64:
2143 case CK_Athlon64SSE3:
2144 case CK_AthlonFX:
2145 case CK_K8:
2146 case CK_K8SSE3:
2147 case CK_Opteron:
2148 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002149 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002150 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002151 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002152 case CK_BDVER1:
2153 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002154 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002155 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002156 case CK_x86_64:
2157 return true;
2158 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002159 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002160 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002161
Craig Topper3164f332014-03-11 03:39:26 +00002162 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002163
Craig Topper3164f332014-03-11 03:39:26 +00002164 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002165 // We accept all non-ARM calling conventions
2166 return (CC == CC_X86ThisCall ||
2167 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002168 CC == CC_X86StdCall ||
2169 CC == CC_X86VectorCall ||
2170 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002171 CC == CC_X86Pascal ||
2172 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002173 }
2174
Craig Topper3164f332014-03-11 03:39:26 +00002175 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002176 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002177 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002178};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002179
Rafael Espindolaeb265472013-08-21 21:59:03 +00002180bool X86TargetInfo::setFPMath(StringRef Name) {
2181 if (Name == "387") {
2182 FPMath = FP_387;
2183 return true;
2184 }
2185 if (Name == "sse") {
2186 FPMath = FP_SSE;
2187 return true;
2188 }
2189 return false;
2190}
2191
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002192void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002193 // FIXME: This *really* should not be here.
2194
2195 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002196 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002197 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002198
Chandler Carruth212334f2011-09-28 08:55:37 +00002199 switch (CPU) {
2200 case CK_Generic:
2201 case CK_i386:
2202 case CK_i486:
2203 case CK_i586:
2204 case CK_Pentium:
2205 case CK_i686:
2206 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002207 break;
2208 case CK_PentiumMMX:
2209 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002210 case CK_K6:
2211 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002212 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002213 break;
2214 case CK_Pentium3:
2215 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002216 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002217 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002218 break;
2219 case CK_PentiumM:
2220 case CK_Pentium4:
2221 case CK_Pentium4M:
2222 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002223 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002224 break;
2225 case CK_Yonah:
2226 case CK_Prescott:
2227 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002228 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002229 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002230 break;
2231 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002232 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002233 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002234 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002235 break;
2236 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002237 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002238 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002239 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002240 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002241 setFeatureEnabledImpl(Features, "avx512f", true);
2242 setFeatureEnabledImpl(Features, "avx512cd", true);
2243 setFeatureEnabledImpl(Features, "avx512dq", true);
2244 setFeatureEnabledImpl(Features, "avx512bw", true);
2245 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002246 // FALLTHROUGH
2247 case CK_Broadwell:
2248 setFeatureEnabledImpl(Features, "rdseed", true);
2249 setFeatureEnabledImpl(Features, "adx", true);
2250 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002251 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002252 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002253 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002254 setFeatureEnabledImpl(Features, "bmi", true);
2255 setFeatureEnabledImpl(Features, "bmi2", true);
2256 setFeatureEnabledImpl(Features, "rtm", true);
2257 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002258 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002259 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002260 setFeatureEnabledImpl(Features, "rdrnd", true);
2261 setFeatureEnabledImpl(Features, "f16c", true);
2262 setFeatureEnabledImpl(Features, "fsgsbase", true);
2263 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002264 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002265 setFeatureEnabledImpl(Features, "avx", true);
2266 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002267 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002268 case CK_Silvermont:
2269 setFeatureEnabledImpl(Features, "aes", true);
2270 setFeatureEnabledImpl(Features, "pclmul", true);
2271 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002272 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002273 setFeatureEnabledImpl(Features, "sse4.2", true);
2274 setFeatureEnabledImpl(Features, "cx16", true);
2275 break;
2276 case CK_KNL:
2277 setFeatureEnabledImpl(Features, "avx512f", true);
2278 setFeatureEnabledImpl(Features, "avx512cd", true);
2279 setFeatureEnabledImpl(Features, "avx512er", true);
2280 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002281 setFeatureEnabledImpl(Features, "rdseed", true);
2282 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002283 setFeatureEnabledImpl(Features, "lzcnt", true);
2284 setFeatureEnabledImpl(Features, "bmi", true);
2285 setFeatureEnabledImpl(Features, "bmi2", true);
2286 setFeatureEnabledImpl(Features, "rtm", true);
2287 setFeatureEnabledImpl(Features, "fma", true);
2288 setFeatureEnabledImpl(Features, "rdrnd", true);
2289 setFeatureEnabledImpl(Features, "f16c", true);
2290 setFeatureEnabledImpl(Features, "fsgsbase", true);
2291 setFeatureEnabledImpl(Features, "aes", true);
2292 setFeatureEnabledImpl(Features, "pclmul", true);
2293 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002294 break;
2295 case CK_K6_2:
2296 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002297 case CK_WinChip2:
2298 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002299 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002300 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002301 case CK_Athlon:
2302 case CK_AthlonThunderbird:
2303 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002304 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002305 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002306 case CK_Athlon4:
2307 case CK_AthlonXP:
2308 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002309 setFeatureEnabledImpl(Features, "sse", true);
2310 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002311 break;
2312 case CK_K8:
2313 case CK_Opteron:
2314 case CK_Athlon64:
2315 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002316 setFeatureEnabledImpl(Features, "sse2", true);
2317 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002318 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002319 case CK_AMDFAM10:
2320 setFeatureEnabledImpl(Features, "sse4a", true);
2321 setFeatureEnabledImpl(Features, "lzcnt", true);
2322 setFeatureEnabledImpl(Features, "popcnt", true);
2323 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002324 case CK_K8SSE3:
2325 case CK_OpteronSSE3:
2326 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002327 setFeatureEnabledImpl(Features, "sse3", true);
2328 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002329 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002330 case CK_BTVER2:
2331 setFeatureEnabledImpl(Features, "avx", true);
2332 setFeatureEnabledImpl(Features, "aes", true);
2333 setFeatureEnabledImpl(Features, "pclmul", true);
2334 setFeatureEnabledImpl(Features, "bmi", true);
2335 setFeatureEnabledImpl(Features, "f16c", true);
2336 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002337 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002338 setFeatureEnabledImpl(Features, "ssse3", true);
2339 setFeatureEnabledImpl(Features, "sse4a", true);
2340 setFeatureEnabledImpl(Features, "lzcnt", true);
2341 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002342 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002343 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002344 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002345 case CK_BDVER4:
2346 setFeatureEnabledImpl(Features, "avx2", true);
2347 setFeatureEnabledImpl(Features, "bmi2", true);
2348 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002349 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002350 setFeatureEnabledImpl(Features, "fsgsbase", true);
2351 // FALLTHROUGH
2352 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002353 setFeatureEnabledImpl(Features, "bmi", true);
2354 setFeatureEnabledImpl(Features, "fma", true);
2355 setFeatureEnabledImpl(Features, "f16c", true);
2356 setFeatureEnabledImpl(Features, "tbm", true);
2357 // FALLTHROUGH
2358 case CK_BDVER1:
2359 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002360 setFeatureEnabledImpl(Features, "xop", true);
2361 setFeatureEnabledImpl(Features, "lzcnt", true);
2362 setFeatureEnabledImpl(Features, "aes", true);
2363 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002364 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002365 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002366 break;
Eli Friedman33465822011-07-08 23:31:17 +00002367 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002368}
2369
Rafael Espindolae62e2792013-08-20 13:44:29 +00002370void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002371 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002372 if (Enabled) {
2373 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002374 case AVX512F:
2375 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002376 case AVX2:
2377 Features["avx2"] = true;
2378 case AVX:
2379 Features["avx"] = true;
2380 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002381 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002382 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002383 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002384 case SSSE3:
2385 Features["ssse3"] = true;
2386 case SSE3:
2387 Features["sse3"] = true;
2388 case SSE2:
2389 Features["sse2"] = true;
2390 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002391 Features["sse"] = true;
2392 case NoSSE:
2393 break;
2394 }
2395 return;
2396 }
2397
2398 switch (Level) {
2399 case NoSSE:
2400 case SSE1:
2401 Features["sse"] = false;
2402 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002403 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2404 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002405 case SSE3:
2406 Features["sse3"] = false;
2407 setXOPLevel(Features, NoXOP, false);
2408 case SSSE3:
2409 Features["ssse3"] = false;
2410 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002411 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002412 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002413 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002414 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002415 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002416 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002417 case AVX2:
2418 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002419 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002420 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002421 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2422 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002423 }
2424}
2425
2426void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002427 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002428 if (Enabled) {
2429 switch (Level) {
2430 case AMD3DNowAthlon:
2431 Features["3dnowa"] = true;
2432 case AMD3DNow:
2433 Features["3dnow"] = true;
2434 case MMX:
2435 Features["mmx"] = true;
2436 case NoMMX3DNow:
2437 break;
2438 }
2439 return;
2440 }
2441
2442 switch (Level) {
2443 case NoMMX3DNow:
2444 case MMX:
2445 Features["mmx"] = false;
2446 case AMD3DNow:
2447 Features["3dnow"] = false;
2448 case AMD3DNowAthlon:
2449 Features["3dnowa"] = false;
2450 }
2451}
2452
2453void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002454 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002455 if (Enabled) {
2456 switch (Level) {
2457 case XOP:
2458 Features["xop"] = true;
2459 case FMA4:
2460 Features["fma4"] = true;
2461 setSSELevel(Features, AVX, true);
2462 case SSE4A:
2463 Features["sse4a"] = true;
2464 setSSELevel(Features, SSE3, true);
2465 case NoXOP:
2466 break;
2467 }
2468 return;
2469 }
2470
2471 switch (Level) {
2472 case NoXOP:
2473 case SSE4A:
2474 Features["sse4a"] = false;
2475 case FMA4:
2476 Features["fma4"] = false;
2477 case XOP:
2478 Features["xop"] = false;
2479 }
2480}
2481
Craig Topper86d79ef2013-09-17 04:51:29 +00002482void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2483 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002484 // FIXME: This *really* should not be here. We need some way of translating
2485 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002486 if (Name == "sse4")
2487 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002488
Rafael Espindolae62e2792013-08-20 13:44:29 +00002489 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002490
Craig Topper29561122013-09-19 01:13:07 +00002491 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002492 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002493 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002494 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002495 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002496 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002497 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002498 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002499 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002500 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002501 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002502 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002503 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002504 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002505 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002506 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002507 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002508 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002509 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002510 if (Enabled)
2511 setSSELevel(Features, SSE2, Enabled);
2512 } else if (Name == "pclmul") {
2513 if (Enabled)
2514 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002515 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002516 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002517 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002518 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002519 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002520 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002521 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2522 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002523 if (Enabled)
2524 setSSELevel(Features, AVX512F, Enabled);
2525 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002526 if (Enabled)
2527 setSSELevel(Features, AVX, Enabled);
2528 } else if (Name == "fma4") {
2529 setXOPLevel(Features, FMA4, Enabled);
2530 } else if (Name == "xop") {
2531 setXOPLevel(Features, XOP, Enabled);
2532 } else if (Name == "sse4a") {
2533 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002534 } else if (Name == "f16c") {
2535 if (Enabled)
2536 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002537 } else if (Name == "sha") {
2538 if (Enabled)
2539 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002540 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002541}
2542
Eric Christopher3ff21b32013-10-16 21:26:26 +00002543/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002544/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002545bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002546 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002547 // Remember the maximum enabled sselevel.
2548 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2549 // Ignore disabled features.
2550 if (Features[i][0] == '-')
2551 continue;
2552
Benjamin Kramer27402c62012-03-05 15:10:44 +00002553 StringRef Feature = StringRef(Features[i]).substr(1);
2554
2555 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002556 HasAES = true;
2557 continue;
2558 }
2559
Craig Topper3f122a72012-05-31 05:18:48 +00002560 if (Feature == "pclmul") {
2561 HasPCLMUL = true;
2562 continue;
2563 }
2564
Benjamin Kramer27402c62012-03-05 15:10:44 +00002565 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002566 HasLZCNT = true;
2567 continue;
2568 }
2569
Rafael Espindola89049822013-08-23 20:21:37 +00002570 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002571 HasRDRND = true;
2572 continue;
2573 }
2574
Craig Topper8c7f2512014-11-03 06:51:41 +00002575 if (Feature == "fsgsbase") {
2576 HasFSGSBASE = true;
2577 continue;
2578 }
2579
Benjamin Kramer27402c62012-03-05 15:10:44 +00002580 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002581 HasBMI = true;
2582 continue;
2583 }
2584
Benjamin Kramer27402c62012-03-05 15:10:44 +00002585 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002586 HasBMI2 = true;
2587 continue;
2588 }
2589
Benjamin Kramer27402c62012-03-05 15:10:44 +00002590 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002591 HasPOPCNT = true;
2592 continue;
2593 }
2594
Michael Liao625a8752012-11-10 05:17:46 +00002595 if (Feature == "rtm") {
2596 HasRTM = true;
2597 continue;
2598 }
2599
Michael Liao74f4eaf2013-03-26 17:52:08 +00002600 if (Feature == "prfchw") {
2601 HasPRFCHW = true;
2602 continue;
2603 }
2604
Michael Liaoffaae352013-03-29 05:17:55 +00002605 if (Feature == "rdseed") {
2606 HasRDSEED = true;
2607 continue;
2608 }
2609
Robert Khasanov50e6f582014-09-19 09:53:48 +00002610 if (Feature == "adx") {
2611 HasADX = true;
2612 continue;
2613 }
2614
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002615 if (Feature == "tbm") {
2616 HasTBM = true;
2617 continue;
2618 }
2619
Craig Topperbba778b2012-06-03 21:46:30 +00002620 if (Feature == "fma") {
2621 HasFMA = true;
2622 continue;
2623 }
2624
Manman Rena45358c2012-10-11 00:59:55 +00002625 if (Feature == "f16c") {
2626 HasF16C = true;
2627 continue;
2628 }
2629
Craig Topper679b53a2013-08-21 05:29:10 +00002630 if (Feature == "avx512cd") {
2631 HasAVX512CD = true;
2632 continue;
2633 }
2634
2635 if (Feature == "avx512er") {
2636 HasAVX512ER = true;
2637 continue;
2638 }
2639
2640 if (Feature == "avx512pf") {
2641 HasAVX512PF = true;
2642 continue;
2643 }
2644
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002645 if (Feature == "avx512dq") {
2646 HasAVX512DQ = true;
2647 continue;
2648 }
2649
2650 if (Feature == "avx512bw") {
2651 HasAVX512BW = true;
2652 continue;
2653 }
2654
2655 if (Feature == "avx512vl") {
2656 HasAVX512VL = true;
2657 continue;
2658 }
2659
Ben Langmuir58078d02013-09-19 13:22:04 +00002660 if (Feature == "sha") {
2661 HasSHA = true;
2662 continue;
2663 }
2664
Nick Lewycky50e8f482013-10-05 20:14:27 +00002665 if (Feature == "cx16") {
2666 HasCX16 = true;
2667 continue;
2668 }
2669
Daniel Dunbar979586e2009-11-11 09:38:56 +00002670 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002671 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002672 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002673 .Case("avx2", AVX2)
2674 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002675 .Case("sse4.2", SSE42)
2676 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002677 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002678 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002679 .Case("sse2", SSE2)
2680 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002681 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002682 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002683
Eli Friedman33465822011-07-08 23:31:17 +00002684 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002685 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002686 .Case("3dnowa", AMD3DNowAthlon)
2687 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002688 .Case("mmx", MMX)
2689 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002690 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002691
2692 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2693 .Case("xop", XOP)
2694 .Case("fma4", FMA4)
2695 .Case("sse4a", SSE4A)
2696 .Default(NoXOP);
2697 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002698 }
Eli Friedman33465822011-07-08 23:31:17 +00002699
Craig Topper7481d8a2013-09-10 06:55:47 +00002700 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2701 // Can't do this earlier because we need to be able to explicitly enable
2702 // popcnt and still disable sse4.2.
2703 if (!HasPOPCNT && SSELevel >= SSE42 &&
2704 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2705 HasPOPCNT = true;
2706 Features.push_back("+popcnt");
2707 }
2708
Yunzhong Gao61089362013-10-16 19:07:02 +00002709 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2710 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2711 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2712 HasPRFCHW = true;
2713 Features.push_back("+prfchw");
2714 }
2715
Rafael Espindolaeb265472013-08-21 21:59:03 +00002716 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2717 // matches the selected sse level.
2718 if (FPMath == FP_SSE && SSELevel < SSE1) {
2719 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2720 return false;
2721 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2722 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2723 return false;
2724 }
2725
Eli Friedman33465822011-07-08 23:31:17 +00002726 // Don't tell the backend if we're turning off mmx; it will end up disabling
2727 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002728 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2729 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002730 std::vector<std::string>::iterator it;
2731 it = std::find(Features.begin(), Features.end(), "-mmx");
2732 if (it != Features.end())
2733 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002734 else if (SSELevel > NoSSE)
2735 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002736 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002737}
Chris Lattnerecd49032009-03-02 22:27:17 +00002738
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002739/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2740/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002741void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002742 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002743 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002744 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002745 Builder.defineMacro("__amd64__");
2746 Builder.defineMacro("__amd64");
2747 Builder.defineMacro("__x86_64");
2748 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002749 if (getTriple().getArchName() == "x86_64h") {
2750 Builder.defineMacro("__x86_64h");
2751 Builder.defineMacro("__x86_64h__");
2752 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002753 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002754 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002755 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002756
Chris Lattnerecd49032009-03-02 22:27:17 +00002757 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002758 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2759 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002760 switch (CPU) {
2761 case CK_Generic:
2762 break;
2763 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002764 // The rest are coming from the i386 define above.
2765 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002766 break;
2767 case CK_i486:
2768 case CK_WinChipC6:
2769 case CK_WinChip2:
2770 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002771 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002772 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002773 case CK_PentiumMMX:
2774 Builder.defineMacro("__pentium_mmx__");
2775 Builder.defineMacro("__tune_pentium_mmx__");
2776 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002777 case CK_i586:
2778 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002779 defineCPUMacros(Builder, "i586");
2780 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002781 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002782 case CK_Pentium3:
2783 case CK_Pentium3M:
2784 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002785 Builder.defineMacro("__tune_pentium3__");
2786 // Fallthrough
2787 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002788 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002789 Builder.defineMacro("__tune_pentium2__");
2790 // Fallthrough
2791 case CK_PentiumPro:
2792 Builder.defineMacro("__tune_i686__");
2793 Builder.defineMacro("__tune_pentiumpro__");
2794 // Fallthrough
2795 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002796 Builder.defineMacro("__i686");
2797 Builder.defineMacro("__i686__");
2798 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2799 Builder.defineMacro("__pentiumpro");
2800 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002801 break;
2802 case CK_Pentium4:
2803 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002804 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002805 break;
2806 case CK_Yonah:
2807 case CK_Prescott:
2808 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002809 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002810 break;
2811 case CK_Core2:
2812 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002813 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002814 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002815 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002816 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002817 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002818 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002819 defineCPUMacros(Builder, "slm");
2820 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002821 case CK_Nehalem:
2822 case CK_Westmere:
2823 case CK_SandyBridge:
2824 case CK_IvyBridge:
2825 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002826 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002827 // FIXME: Historically, we defined this legacy name, it would be nice to
2828 // remove it at some point. We've never exposed fine-grained names for
2829 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002830 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002831 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002832 case CK_Skylake:
2833 // FIXME: Historically, we defined this legacy name, it would be nice to
2834 // remove it at some point. This is the only fine-grained CPU macro in the
2835 // main intel CPU line, and it would be better to not have these and force
2836 // people to use ISA macros.
2837 defineCPUMacros(Builder, "skx");
2838 break;
Craig Topper449314e2013-08-20 07:09:39 +00002839 case CK_KNL:
2840 defineCPUMacros(Builder, "knl");
2841 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002842 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002843 Builder.defineMacro("__k6_2__");
2844 Builder.defineMacro("__tune_k6_2__");
2845 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002846 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002847 if (CPU != CK_K6_2) { // In case of fallthrough
2848 // FIXME: GCC may be enabling these in cases where some other k6
2849 // architecture is specified but -m3dnow is explicitly provided. The
2850 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002851 Builder.defineMacro("__k6_3__");
2852 Builder.defineMacro("__tune_k6_3__");
2853 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002854 // Fallthrough
2855 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002856 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002857 break;
2858 case CK_Athlon:
2859 case CK_AthlonThunderbird:
2860 case CK_Athlon4:
2861 case CK_AthlonXP:
2862 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002863 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002864 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002865 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002866 Builder.defineMacro("__tune_athlon_sse__");
2867 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002868 break;
2869 case CK_K8:
2870 case CK_K8SSE3:
2871 case CK_x86_64:
2872 case CK_Opteron:
2873 case CK_OpteronSSE3:
2874 case CK_Athlon64:
2875 case CK_Athlon64SSE3:
2876 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002877 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002878 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002879 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002880 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002881 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002882 case CK_BTVER1:
2883 defineCPUMacros(Builder, "btver1");
2884 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002885 case CK_BTVER2:
2886 defineCPUMacros(Builder, "btver2");
2887 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002888 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002889 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002890 break;
2891 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002892 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002893 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002894 case CK_BDVER3:
2895 defineCPUMacros(Builder, "bdver3");
2896 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002897 case CK_BDVER4:
2898 defineCPUMacros(Builder, "bdver4");
2899 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002900 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002901 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002902 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002903 }
Chris Lattner96e43572009-03-02 22:40:39 +00002904
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002905 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002906 Builder.defineMacro("__REGISTER_PREFIX__", "");
2907
Chris Lattner6df41af2009-04-19 17:32:33 +00002908 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2909 // functions in glibc header files that use FP Stack inline asm which the
2910 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002911 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002912
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002913 if (HasAES)
2914 Builder.defineMacro("__AES__");
2915
Craig Topper3f122a72012-05-31 05:18:48 +00002916 if (HasPCLMUL)
2917 Builder.defineMacro("__PCLMUL__");
2918
Craig Topper22967d42011-12-25 05:06:45 +00002919 if (HasLZCNT)
2920 Builder.defineMacro("__LZCNT__");
2921
Benjamin Kramer1e250392012-07-07 09:39:18 +00002922 if (HasRDRND)
2923 Builder.defineMacro("__RDRND__");
2924
Craig Topper8c7f2512014-11-03 06:51:41 +00002925 if (HasFSGSBASE)
2926 Builder.defineMacro("__FSGSBASE__");
2927
Craig Topper22967d42011-12-25 05:06:45 +00002928 if (HasBMI)
2929 Builder.defineMacro("__BMI__");
2930
2931 if (HasBMI2)
2932 Builder.defineMacro("__BMI2__");
2933
Craig Topper1de83482011-12-29 16:10:46 +00002934 if (HasPOPCNT)
2935 Builder.defineMacro("__POPCNT__");
2936
Michael Liao625a8752012-11-10 05:17:46 +00002937 if (HasRTM)
2938 Builder.defineMacro("__RTM__");
2939
Michael Liao74f4eaf2013-03-26 17:52:08 +00002940 if (HasPRFCHW)
2941 Builder.defineMacro("__PRFCHW__");
2942
Michael Liaoffaae352013-03-29 05:17:55 +00002943 if (HasRDSEED)
2944 Builder.defineMacro("__RDSEED__");
2945
Robert Khasanov50e6f582014-09-19 09:53:48 +00002946 if (HasADX)
2947 Builder.defineMacro("__ADX__");
2948
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002949 if (HasTBM)
2950 Builder.defineMacro("__TBM__");
2951
Rafael Espindolae62e2792013-08-20 13:44:29 +00002952 switch (XOPLevel) {
2953 case XOP:
2954 Builder.defineMacro("__XOP__");
2955 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002956 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002957 case SSE4A:
2958 Builder.defineMacro("__SSE4A__");
2959 case NoXOP:
2960 break;
2961 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002962
Craig Topperbba778b2012-06-03 21:46:30 +00002963 if (HasFMA)
2964 Builder.defineMacro("__FMA__");
2965
Manman Rena45358c2012-10-11 00:59:55 +00002966 if (HasF16C)
2967 Builder.defineMacro("__F16C__");
2968
Craig Topper679b53a2013-08-21 05:29:10 +00002969 if (HasAVX512CD)
2970 Builder.defineMacro("__AVX512CD__");
2971 if (HasAVX512ER)
2972 Builder.defineMacro("__AVX512ER__");
2973 if (HasAVX512PF)
2974 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002975 if (HasAVX512DQ)
2976 Builder.defineMacro("__AVX512DQ__");
2977 if (HasAVX512BW)
2978 Builder.defineMacro("__AVX512BW__");
2979 if (HasAVX512VL)
2980 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002981
Ben Langmuir58078d02013-09-19 13:22:04 +00002982 if (HasSHA)
2983 Builder.defineMacro("__SHA__");
2984
Nick Lewycky50e8f482013-10-05 20:14:27 +00002985 if (HasCX16)
2986 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2987
Chris Lattner96e43572009-03-02 22:40:39 +00002988 // Each case falls through to the previous one here.
2989 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002990 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002991 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002992 case AVX2:
2993 Builder.defineMacro("__AVX2__");
2994 case AVX:
2995 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002996 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002997 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002998 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002999 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003000 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003001 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003002 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003003 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003004 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003005 Builder.defineMacro("__SSE2__");
3006 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003007 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003008 Builder.defineMacro("__SSE__");
3009 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003010 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003011 break;
3012 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003013
Derek Schuffc7dd7222012-10-11 15:52:22 +00003014 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003015 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003016 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003017 case AVX2:
3018 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003019 case SSE42:
3020 case SSE41:
3021 case SSSE3:
3022 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003023 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003024 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003025 break;
3026 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003027 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003028 break;
3029 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003030 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003031 }
3032 }
3033
Anders Carlssone437c682010-01-27 03:47:49 +00003034 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003035 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003036 case AMD3DNowAthlon:
3037 Builder.defineMacro("__3dNOW_A__");
3038 case AMD3DNow:
3039 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003040 case MMX:
3041 Builder.defineMacro("__MMX__");
3042 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003043 break;
3044 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003045
3046 if (CPU >= CK_i486) {
3047 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3048 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3049 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3050 }
3051 if (CPU >= CK_i586)
3052 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003053}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003054
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003055bool X86TargetInfo::hasFeature(StringRef Feature) const {
3056 return llvm::StringSwitch<bool>(Feature)
3057 .Case("aes", HasAES)
3058 .Case("avx", SSELevel >= AVX)
3059 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003060 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003061 .Case("avx512cd", HasAVX512CD)
3062 .Case("avx512er", HasAVX512ER)
3063 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003064 .Case("avx512dq", HasAVX512DQ)
3065 .Case("avx512bw", HasAVX512BW)
3066 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003067 .Case("bmi", HasBMI)
3068 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003069 .Case("cx16", HasCX16)
3070 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003071 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003072 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003073 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003074 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003075 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3076 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3077 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003078 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003079 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003080 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003081 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003082 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003083 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003084 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003085 .Case("sse", SSELevel >= SSE1)
3086 .Case("sse2", SSELevel >= SSE2)
3087 .Case("sse3", SSELevel >= SSE3)
3088 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003089 .Case("sse4.1", SSELevel >= SSE41)
3090 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003091 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003092 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003093 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003094 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3095 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003096 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003097 .Default(false);
3098}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003099
Eli Friedman3fd920a2008-08-20 02:34:37 +00003100bool
Anders Carlsson58436352009-02-28 17:11:49 +00003101X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003102 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003103 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003104 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003105 case 'I':
3106 Info.setRequiresImmediate(0, 31);
3107 return true;
3108 case 'J':
3109 Info.setRequiresImmediate(0, 63);
3110 return true;
3111 case 'K':
3112 Info.setRequiresImmediate(-128, 127);
3113 return true;
3114 case 'L':
3115 // FIXME: properly analyze this constraint:
3116 // must be one of 0xff, 0xffff, or 0xffffffff
3117 return true;
3118 case 'M':
3119 Info.setRequiresImmediate(0, 3);
3120 return true;
3121 case 'N':
3122 Info.setRequiresImmediate(0, 255);
3123 return true;
3124 case 'O':
3125 Info.setRequiresImmediate(0, 127);
3126 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003127 case 'Y': // first letter of a pair:
3128 switch (*(Name+1)) {
3129 default: return false;
3130 case '0': // First SSE register.
3131 case 't': // Any SSE register, when SSE2 is enabled.
3132 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3133 case 'm': // any MMX register, when inter-unit moves enabled.
3134 break; // falls through to setAllowsRegister.
3135 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003136 case 'f': // any x87 floating point stack register.
3137 // Constraint 'f' cannot be used for output operands.
3138 if (Info.ConstraintStr[0] == '=')
3139 return false;
3140
3141 Info.setAllowsRegister();
3142 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003143 case 'a': // eax.
3144 case 'b': // ebx.
3145 case 'c': // ecx.
3146 case 'd': // edx.
3147 case 'S': // esi.
3148 case 'D': // edi.
3149 case 'A': // edx:eax.
3150 case 't': // top of floating point stack.
3151 case 'u': // second from top of floating point stack.
3152 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003153 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003154 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003155 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003156 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3157 case 'l': // "Index" registers: any general register that can be used as an
3158 // index in a base+index memory access.
3159 Info.setAllowsRegister();
3160 return true;
3161 case 'C': // SSE floating point constant.
3162 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003163 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003164 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003165 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003166 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003167 return true;
3168 }
3169}
3170
Akira Hatanaka974131e2014-09-18 18:17:18 +00003171bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3172 unsigned Size) const {
3173 // Strip off constraint modifiers.
3174 while (Constraint[0] == '=' ||
3175 Constraint[0] == '+' ||
3176 Constraint[0] == '&')
3177 Constraint = Constraint.substr(1);
3178
3179 return validateOperandSize(Constraint, Size);
3180}
3181
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003182bool X86TargetInfo::validateInputSize(StringRef Constraint,
3183 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003184 return validateOperandSize(Constraint, Size);
3185}
3186
3187bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3188 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003189 switch (Constraint[0]) {
3190 default: break;
3191 case 'y':
3192 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003193 case 'f':
3194 case 't':
3195 case 'u':
3196 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003197 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003198 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003199 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003200 }
3201
3202 return true;
3203}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003204
Eli Friedman3fd920a2008-08-20 02:34:37 +00003205std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003206X86TargetInfo::convertConstraint(const char *&Constraint) const {
3207 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003208 case 'a': return std::string("{ax}");
3209 case 'b': return std::string("{bx}");
3210 case 'c': return std::string("{cx}");
3211 case 'd': return std::string("{dx}");
3212 case 'S': return std::string("{si}");
3213 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003214 case 'p': // address
3215 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003216 case 't': // top of floating point stack.
3217 return std::string("{st}");
3218 case 'u': // second from top of floating point stack.
3219 return std::string("{st(1)}"); // second from top of floating point stack.
3220 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003221 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003222 }
3223}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003224} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003225
3226namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003227// X86-32 generic target
3228class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003229public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003230 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003231 DoubleAlign = LongLongAlign = 32;
3232 LongDoubleWidth = 96;
3233 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003234 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003235 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003236 SizeType = UnsignedInt;
3237 PtrDiffType = SignedInt;
3238 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003239 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003240
3241 // Use fpret for all types.
3242 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3243 (1 << TargetInfo::Double) |
3244 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003245
3246 // x86-32 has atomics up to 8 bytes
3247 // FIXME: Check that we actually have cmpxchg8b before setting
3248 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3249 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003250 }
Craig Topper3164f332014-03-11 03:39:26 +00003251 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003252 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003253 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003254
Craig Topper3164f332014-03-11 03:39:26 +00003255 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003256 if (RegNo == 0) return 0;
3257 if (RegNo == 1) return 2;
3258 return -1;
3259 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003260 bool validateOperandSize(StringRef Constraint,
3261 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003262 switch (Constraint[0]) {
3263 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003264 case 'R':
3265 case 'q':
3266 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003267 case 'a':
3268 case 'b':
3269 case 'c':
3270 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003271 case 'S':
3272 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003273 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003274 case 'A':
3275 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003276 }
3277
Akira Hatanaka974131e2014-09-18 18:17:18 +00003278 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003279 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003280};
3281} // end anonymous namespace
3282
3283namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003284class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3285public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003286 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3287 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003288
Craig Topper3164f332014-03-11 03:39:26 +00003289 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003290 unsigned Major, Minor, Micro;
3291 getTriple().getOSVersion(Major, Minor, Micro);
3292 // New NetBSD uses the default rounding mode.
3293 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3294 return X86_32TargetInfo::getFloatEvalMethod();
3295 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003296 return 1;
3297 }
3298};
3299} // end anonymous namespace
3300
3301namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003302class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003304 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3305 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003306 SizeType = UnsignedLong;
3307 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003308 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003309 }
3310};
3311} // end anonymous namespace
3312
3313namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003314class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3315public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003316 BitrigI386TargetInfo(const llvm::Triple &Triple)
3317 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003318 SizeType = UnsignedLong;
3319 IntPtrType = SignedLong;
3320 PtrDiffType = SignedLong;
3321 }
3322};
3323} // end anonymous namespace
3324
3325namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003326class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003327public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003328 DarwinI386TargetInfo(const llvm::Triple &Triple)
3329 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003330 LongDoubleWidth = 128;
3331 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003332 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003333 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003334 SizeType = UnsignedLong;
3335 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003336 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003337 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003338 }
3339
Eli Friedman3fd920a2008-08-20 02:34:37 +00003340};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003341} // end anonymous namespace
3342
3343namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003344// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003345class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003346public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003347 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3348 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003349 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003350 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003351 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003352 }
Craig Topper3164f332014-03-11 03:39:26 +00003353 void getTargetDefines(const LangOptions &Opts,
3354 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003355 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3356 }
3357};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003358
3359// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003360class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003361public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003362 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003364 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003365 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3366 }
Craig Topper3164f332014-03-11 03:39:26 +00003367 void getTargetDefines(const LangOptions &Opts,
3368 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003369 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3370 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3371 // The value of the following reflects processor type.
3372 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3373 // We lost the original triple, so we use the default.
3374 Builder.defineMacro("_M_IX86", "600");
3375 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003376};
3377} // end anonymous namespace
3378
Reid Kleckner47606832014-04-21 20:58:00 +00003379static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3380 Builder.defineMacro("__MSVCRT__");
3381 Builder.defineMacro("__MINGW32__");
3382
3383 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3384 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3385 // macro anyway for pre-processor compatibility.
3386 if (Opts.MicrosoftExt)
3387 Builder.defineMacro("__declspec", "__declspec");
3388 else
3389 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3390
3391 if (!Opts.MicrosoftExt) {
3392 // Provide macros for all the calling convention keywords. Provide both
3393 // single and double underscore prefixed variants. These are available on
3394 // x64 as well as x86, even though they have no effect.
3395 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3396 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003397 std::string GCCSpelling = "__attribute__((__";
3398 GCCSpelling += CC;
3399 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003400 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3401 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3402 }
3403 }
3404}
3405
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003406namespace {
3407// x86-32 MinGW target
3408class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3409public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003410 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3411 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003412 void getTargetDefines(const LangOptions &Opts,
3413 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003414 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003415 DefineStd(Builder, "WIN32", Opts);
3416 DefineStd(Builder, "WINNT", Opts);
3417 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003418 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003419 }
3420};
3421} // end anonymous namespace
3422
3423namespace {
3424// x86-32 Cygwin target
3425class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3426public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003427 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3428 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003429 TLSSupported = false;
3430 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003431 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003432 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003433 }
Craig Topper3164f332014-03-11 03:39:26 +00003434 void getTargetDefines(const LangOptions &Opts,
3435 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003436 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003437 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003438 Builder.defineMacro("__CYGWIN__");
3439 Builder.defineMacro("__CYGWIN32__");
3440 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003441 if (Opts.CPlusPlus)
3442 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003443 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003444};
3445} // end anonymous namespace
3446
3447namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003448// x86-32 Haiku target
3449class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3450public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003451 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003452 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003453 IntPtrType = SignedLong;
3454 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003455 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003456 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003457 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003458 }
Craig Topper3164f332014-03-11 03:39:26 +00003459 void getTargetDefines(const LangOptions &Opts,
3460 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003461 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3462 Builder.defineMacro("__INTEL__");
3463 Builder.defineMacro("__HAIKU__");
3464 }
3465};
3466} // end anonymous namespace
3467
Douglas Gregor9fabd852011-07-01 22:41:14 +00003468// RTEMS Target
3469template<typename Target>
3470class RTEMSTargetInfo : public OSTargetInfo<Target> {
3471protected:
Craig Topper3164f332014-03-11 03:39:26 +00003472 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3473 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003474 // RTEMS defines; list based off of gcc output
3475
Douglas Gregor9fabd852011-07-01 22:41:14 +00003476 Builder.defineMacro("__rtems__");
3477 Builder.defineMacro("__ELF__");
3478 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003479
Douglas Gregor9fabd852011-07-01 22:41:14 +00003480public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003481 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3482 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003483
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003484 switch (Triple.getArch()) {
3485 default:
3486 case llvm::Triple::x86:
3487 // this->MCountName = ".mcount";
3488 break;
3489 case llvm::Triple::mips:
3490 case llvm::Triple::mipsel:
3491 case llvm::Triple::ppc:
3492 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003493 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003494 // this->MCountName = "_mcount";
3495 break;
3496 case llvm::Triple::arm:
3497 // this->MCountName = "__mcount";
3498 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003499 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003500 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003501};
3502
3503namespace {
3504// x86-32 RTEMS target
3505class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3506public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003507 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003508 SizeType = UnsignedLong;
3509 IntPtrType = SignedLong;
3510 PtrDiffType = SignedLong;
3511 this->UserLabelPrefix = "";
3512 }
Craig Topper3164f332014-03-11 03:39:26 +00003513 void getTargetDefines(const LangOptions &Opts,
3514 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003515 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3516 Builder.defineMacro("__INTEL__");
3517 Builder.defineMacro("__rtems__");
3518 }
3519};
3520} // end anonymous namespace
3521
Chris Lattnerb986aba2010-04-11 19:29:39 +00003522namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003523// x86-64 generic target
3524class X86_64TargetInfo : public X86TargetInfo {
3525public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003526 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003527 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003528 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003529 LongDoubleWidth = 128;
3530 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003531 LargeArrayMinWidth = 128;
3532 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003533 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003534 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3535 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3536 IntPtrType = IsX32 ? SignedInt : SignedLong;
3537 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003538 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003539 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003540
Eric Christopher917e9522014-11-18 22:36:15 +00003541 // Pointers are 32-bit in x32.
Zinovy Nis1db95732014-07-10 15:27:19 +00003542 DescriptionString = (IsX32)
Eric Christopher917e9522014-11-18 22:36:15 +00003543 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3544 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003545
3546 // Use fpret only for long double.
3547 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003548
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003549 // Use fp2ret for _Complex long double.
3550 ComplexLongDoubleUsesFP2Ret = true;
3551
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003552 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003553 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003554 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003555 }
Craig Topper3164f332014-03-11 03:39:26 +00003556 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003557 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003558 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003559
Craig Topper3164f332014-03-11 03:39:26 +00003560 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003561 if (RegNo == 0) return 0;
3562 if (RegNo == 1) return 1;
3563 return -1;
3564 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003565
Craig Topper3164f332014-03-11 03:39:26 +00003566 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003567 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003568 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003569 CC == CC_IntelOclBicc ||
3570 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003571 }
3572
Craig Topper3164f332014-03-11 03:39:26 +00003573 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003574 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003575 }
3576
Pavel Chupinfd223e12014-08-04 12:39:43 +00003577 // for x32 we need it here explicitly
3578 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003579};
3580} // end anonymous namespace
3581
3582namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003583// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003584class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003585public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003586 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3587 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003588 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003589 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003590 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003591 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003592 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003593 SizeType = UnsignedLongLong;
3594 PtrDiffType = SignedLongLong;
3595 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003596 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003597 }
Craig Topper3164f332014-03-11 03:39:26 +00003598 void getTargetDefines(const LangOptions &Opts,
3599 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003600 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003601 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003602 }
Craig Topper3164f332014-03-11 03:39:26 +00003603 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003604 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003605 }
Craig Topper3164f332014-03-11 03:39:26 +00003606 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003607 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003608 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003609 CC == CC_IntelOclBicc ||
3610 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3611 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003612};
3613} // end anonymous namespace
3614
3615namespace {
3616// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003617class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003618public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003619 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003620 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003621 LongDoubleWidth = LongDoubleAlign = 64;
3622 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003623 }
Craig Topper3164f332014-03-11 03:39:26 +00003624 void getTargetDefines(const LangOptions &Opts,
3625 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003626 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3627 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003628 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003629 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003630 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003631};
3632} // end anonymous namespace
3633
3634namespace {
3635// x86-64 MinGW target
3636class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3637public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003638 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3639 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003640 void getTargetDefines(const LangOptions &Opts,
3641 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003642 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003643 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003644 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003645 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003646
3647 // GCC defines this macro when it is using __gxx_personality_seh0.
3648 if (!Opts.SjLjExceptions)
3649 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003650 }
3651};
3652} // end anonymous namespace
3653
3654namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003655class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3656public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003657 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3658 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003659 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003660 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003661 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3662 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003663 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003664 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003665 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003666 }
3667};
3668} // end anonymous namespace
3669
3670namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003671class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3672public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003673 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3674 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003675 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003676 Int64Type = SignedLongLong;
3677 }
3678};
3679} // end anonymous namespace
3680
3681namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003682class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003684 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3685 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3686 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003687 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003688 }
3689};
Tim Northover9bb857a2013-01-31 12:13:10 +00003690}
3691
Eli Friedman9fa28852012-08-08 23:57:20 +00003692
3693namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003694class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003695 // Possible FPU choices.
3696 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003697 VFP2FPU = (1 << 0),
3698 VFP3FPU = (1 << 1),
3699 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003700 NeonFPU = (1 << 3),
3701 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003702 };
3703
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003704 // Possible HWDiv features.
3705 enum HWDivMode {
3706 HWDivThumb = (1 << 0),
3707 HWDivARM = (1 << 1)
3708 };
3709
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003710 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003711 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003712 }
3713
3714 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3715 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003716
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003717 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003718
Rafael Espindolaeb265472013-08-21 21:59:03 +00003719 enum {
3720 FP_Default,
3721 FP_VFP,
3722 FP_Neon
3723 } FPMath;
3724
Bernard Ogdenda13af32013-10-24 18:32:51 +00003725 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003726
Logan Chien57086ce2012-10-10 06:56:20 +00003727 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003728 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003729 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003730
3731 // Initialized via features.
3732 unsigned SoftFloat : 1;
3733 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003734
Bernard Ogden18b57012013-10-29 09:47:51 +00003735 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003736 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003737
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003738 // ACLE 6.5.1 Hardware floating point
3739 enum {
3740 HW_FP_HP = (1 << 1), /// half (16-bit)
3741 HW_FP_SP = (1 << 2), /// single (32-bit)
3742 HW_FP_DP = (1 << 3), /// double (64-bit)
3743 };
3744 uint32_t HW_FP;
3745
Chris Lattner5cc15e02010-03-03 19:03:45 +00003746 static const Builtin::Info BuiltinInfo[];
3747
Rafael Espindola101d5b92013-05-13 20:09:47 +00003748 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003749 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003750 if (T.getArch() == llvm::Triple::arm ||
3751 T.getArch() == llvm::Triple::armeb) {
3752 StringRef VersionStr;
3753 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003754 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003755 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003756 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003757 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003758 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003759 unsigned Version;
3760 if (VersionStr.getAsInteger(10, Version))
3761 return false;
3762 return Version >= 6;
3763 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003764 assert(T.getArch() == llvm::Triple::thumb ||
3765 T.getArch() == llvm::Triple::thumbeb);
3766 StringRef VersionStr;
3767 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003768 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003769 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003770 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003771 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003772 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003773 unsigned Version;
3774 if (VersionStr.getAsInteger(10, Version))
3775 return false;
3776 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003777 }
3778
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003779 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003780 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003781
3782 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003783 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003784
Tim Northover00853e52014-08-05 11:07:26 +00003785 // size_t is unsigned long on MachO-derived environments and NetBSD.
3786 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003787 SizeType = UnsignedLong;
3788 else
3789 SizeType = UnsignedInt;
3790
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003791 switch (T.getOS()) {
3792 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003793 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003794 break;
3795 case llvm::Triple::Win32:
3796 WCharType = UnsignedShort;
3797 break;
3798 case llvm::Triple::Linux:
3799 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003800 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3801 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003802 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003803 }
3804
3805 UseBitFieldTypeAlignment = true;
3806
3807 ZeroLengthBitfieldBoundary = 0;
3808
Tim Northover147cd2f2014-10-14 22:12:21 +00003809 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3810 // so set preferred for small types to 32.
3811 if (T.isOSBinFormatMachO()) {
3812 DescriptionString =
3813 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3814 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3815 } else if (T.isOSWindows()) {
3816 // FIXME: this is invalid for WindowsCE
3817 assert(!BigEndian && "Windows on ARM does not support big endian");
3818 DescriptionString = "e"
3819 "-m:e"
3820 "-p:32:32"
3821 "-i64:64"
3822 "-v128:64:128"
3823 "-a:0:32"
3824 "-n32"
3825 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003826 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003827 DescriptionString =
3828 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3829 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003830 }
3831
3832 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003833 }
3834
3835 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003836 const llvm::Triple &T = getTriple();
3837
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003838 IsAAPCS = false;
3839
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003840 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003841
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003842 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003843 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003844 SizeType = UnsignedInt;
3845 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003846 SizeType = UnsignedLong;
3847
3848 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3849 WCharType = SignedInt;
3850
3851 // Do not respect the alignment of bit-field types when laying out
3852 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3853 UseBitFieldTypeAlignment = false;
3854
3855 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3856 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3857 /// gcc.
3858 ZeroLengthBitfieldBoundary = 32;
3859
Tim Northover147cd2f2014-10-14 22:12:21 +00003860 if (T.isOSBinFormatMachO())
3861 DescriptionString =
3862 BigEndian
3863 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3864 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3865 else
3866 DescriptionString =
3867 BigEndian
3868 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3869 : "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 +00003870
3871 // FIXME: Override "preferred align" for double and long long.
3872 }
3873
Chris Lattner17df24e2008-04-21 18:56:49 +00003874public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003875 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003876 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003877 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003878 BigEndian = IsBigEndian;
3879
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003880 switch (getTriple().getOS()) {
3881 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003882 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003883 break;
3884 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003885 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003886 break;
3887 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003888
Chris Lattner1a8f3942010-04-23 16:29:58 +00003889 // {} in inline assembly are neon specifiers, not assembly variant
3890 // specifiers.
3891 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003892
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003893 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003894 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003895
Eric Christopher0e261882014-12-05 01:06:59 +00003896 // FIXME: This duplicates code from the driver that sets the -target-abi
3897 // option - this code is used if -target-abi isn't passed and should
3898 // be unified in some way.
3899 if (Triple.isOSBinFormatMachO()) {
3900 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3901 // the frontend matches that.
3902 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3903 Triple.getOS() == llvm::Triple::UnknownOS ||
3904 StringRef(CPU).startswith("cortex-m")) {
3905 setABI("aapcs");
3906 } else {
3907 setABI("apcs-gnu");
3908 }
3909 } else if (Triple.isOSWindows()) {
3910 // FIXME: this is invalid for WindowsCE
3911 setABI("aapcs");
3912 } else {
3913 // Select the default based on the platform.
3914 switch (Triple.getEnvironment()) {
3915 case llvm::Triple::Android:
3916 case llvm::Triple::GNUEABI:
3917 case llvm::Triple::GNUEABIHF:
3918 setABI("aapcs-linux");
3919 break;
3920 case llvm::Triple::EABIHF:
3921 case llvm::Triple::EABI:
3922 setABI("aapcs");
3923 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00003924 case llvm::Triple::GNU:
3925 setABI("apcs-gnu");
3926 break;
Eric Christopher0e261882014-12-05 01:06:59 +00003927 default:
3928 if (Triple.getOS() == llvm::Triple::NetBSD)
3929 setABI("apcs-gnu");
3930 else
3931 setABI("aapcs");
3932 break;
3933 }
3934 }
John McCall86353412010-08-21 22:46:04 +00003935
3936 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003937 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003938
3939 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003940 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003941 if (shouldUseInlineAtomic(getTriple()))
3942 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003943
3944 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00003945 // the alignment of the zero-length bitfield is greater than the member
3946 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00003947 // zero length bitfield.
3948 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003949 }
Alp Toker4925ba72014-06-07 23:30:42 +00003950 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003951 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003952 ABI = Name;
3953
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003954 // The defaults (above) are for AAPCS, check if we need to change them.
3955 //
3956 // FIXME: We need support for -meabi... we could just mangle it into the
3957 // name.
3958 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003959 setABIAPCS();
3960 return true;
3961 }
3962 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3963 setABIAAPCS();
3964 return true;
3965 }
3966 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003967 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003968
Craig Topper3164f332014-03-11 03:39:26 +00003969 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00003970 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003971 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3972 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00003973 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00003974 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003975 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003976 }
3977 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003978 Features["vfp4"] = true;
3979 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003980 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3981 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003982 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003983 Features["vfp4"] = true;
3984 Features["neon"] = true;
3985 Features["hwdiv"] = true;
3986 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003987 } else if (CPU == "cyclone") {
3988 Features["v8fp"] = true;
3989 Features["neon"] = true;
3990 Features["hwdiv"] = true;
3991 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003992 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3993 Features["fp-armv8"] = true;
3994 Features["neon"] = true;
3995 Features["hwdiv"] = true;
3996 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003997 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003998 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003999 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004000 // Enable the hwdiv extension for all v8a AArch32 cores by
4001 // default.
4002 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004003 ArchName == "armebv8a" || ArchName == "armebv8" ||
4004 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4005 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004006 Features["hwdiv"] = true;
4007 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004008 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004009 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004010 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004011 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004012
Craig Topper3164f332014-03-11 03:39:26 +00004013 bool handleTargetFeatures(std::vector<std::string> &Features,
4014 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004015 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004016 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004017 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004018 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004019 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004020
4021 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004022 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004023 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004024 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004025 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004026 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004027 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004028 HW_FP = HW_FP_SP | HW_FP_DP;
4029 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004030 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004031 HW_FP = HW_FP_SP | HW_FP_DP;
4032 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004033 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004034 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4035 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004036 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004037 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4038 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004039 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004040 HW_FP = HW_FP_SP | HW_FP_DP;
4041 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004042 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004043 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004044 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004045 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004046 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004047 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004048 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004049 } else if (Feature == "+fp-only-sp") {
4050 HW_FP &= ~HW_FP_DP;
4051 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004052 }
4053
Rafael Espindolaeb265472013-08-21 21:59:03 +00004054 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4055 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4056 return false;
4057 }
4058
4059 if (FPMath == FP_Neon)
4060 Features.push_back("+neonfp");
4061 else if (FPMath == FP_VFP)
4062 Features.push_back("-neonfp");
4063
Daniel Dunbar893d4752009-12-19 04:15:38 +00004064 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004065 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4066 for (const auto &FEFeature : FrontEndFeatures) {
4067 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4068 if (Feature != Features.end())
4069 Features.erase(Feature);
4070 }
4071
Rafael Espindolaeb265472013-08-21 21:59:03 +00004072 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004073 }
4074
Craig Topper3164f332014-03-11 03:39:26 +00004075 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004076 return llvm::StringSwitch<bool>(Feature)
4077 .Case("arm", true)
4078 .Case("softfloat", SoftFloat)
4079 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004080 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004081 .Case("hwdiv", HWDiv & HWDivThumb)
4082 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004083 .Default(false);
4084 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004085 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004086 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004087 return llvm::StringSwitch<const char *>(Name)
4088 .Cases("arm8", "arm810", "4")
4089 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4090 "4")
4091 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4092 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4093 .Case("ep9312", "4T")
4094 .Cases("arm10tdmi", "arm1020t", "5T")
4095 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4096 .Case("arm926ej-s", "5TEJ")
4097 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4098 .Cases("xscale", "iwmmxt", "5TE")
4099 .Case("arm1136j-s", "6J")
4100 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4101 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4102 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4103 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4104 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4105 "7A")
4106 .Cases("cortex-r4", "cortex-r5", "7R")
4107 .Case("swift", "7S")
4108 .Case("cyclone", "8A")
4109 .Case("cortex-m3", "7M")
4110 .Cases("cortex-m4", "cortex-m7", "7EM")
4111 .Case("cortex-m0", "6M")
4112 .Cases("cortex-a53", "cortex-a57", "8A")
4113 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004114 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004115 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004116 return llvm::StringSwitch<const char *>(Name)
4117 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4118 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4119 "A")
4120 .Cases("cortex-a53", "cortex-a57", "A")
4121 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4122 .Cases("cortex-r4", "cortex-r5", "R")
4123 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004124 }
Craig Topper3164f332014-03-11 03:39:26 +00004125 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004126 if (!getCPUDefineSuffix(Name))
4127 return false;
4128
Tim Northovere8c37212014-07-09 09:24:43 +00004129 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4130 StringRef Profile = getCPUProfile(Name);
4131 if (Profile == "M" && MaxAtomicInlineWidth) {
4132 MaxAtomicPromoteWidth = 32;
4133 MaxAtomicInlineWidth = 32;
4134 }
4135
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004136 CPU = Name;
4137 return true;
4138 }
Craig Topper3164f332014-03-11 03:39:26 +00004139 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004140 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4141 unsigned CPUArchVer) const {
4142 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4143 (CPUArch.find('M') != StringRef::npos);
4144 }
4145 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4146 unsigned CPUArchVer) const {
4147 // We check both CPUArchVer and ArchName because when only triple is
4148 // specified, the default CPU is arm1136j-s.
4149 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4150 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4151 }
Craig Topper3164f332014-03-11 03:39:26 +00004152 void getTargetDefines(const LangOptions &Opts,
4153 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004154 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004155 Builder.defineMacro("__arm");
4156 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004157
Chris Lattnerecd49032009-03-02 22:27:17 +00004158 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004159 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004160
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004161 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004162 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004163 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004164 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004165 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004166
4167 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004168 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004169 StringRef ArchName = getTriple().getArchName();
4170
4171 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4172 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004173 if (CPUArch[0] >= '8') {
4174 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4175 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004176 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004177
4178 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4179 // is not defined for the M-profile.
4180 // NOTE that the deffault profile is assumed to be 'A'
4181 if (CPUProfile.empty() || CPUProfile != "M")
4182 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4183
4184 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4185 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4186 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4187 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4188 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4189 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4190 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4191
4192 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4193 // instruction set such as ARM or Thumb.
4194 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4195
4196 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4197
4198 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004199 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004200 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004201
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004202 // ACLE 6.5.1 Hardware Floating Point
4203 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004204 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004205
Yi Konga44c4d72014-06-27 21:25:42 +00004206 // ACLE predefines.
4207 Builder.defineMacro("__ARM_ACLE", "200");
4208
Mike Stump9d54bd72009-04-08 02:07:04 +00004209 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004210
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004211 // FIXME: It's more complicated than this and we don't really support
4212 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004213 // Windows on ARM does not "support" interworking
4214 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004215 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004216
David Tweed8f676532012-10-25 13:33:01 +00004217 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004218 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004219 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4220 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004221 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004222 Builder.defineMacro("__ARM_PCS", "1");
4223
David Tweed8f676532012-10-25 13:33:01 +00004224 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004225 Builder.defineMacro("__ARM_PCS_VFP", "1");
4226 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004227
Daniel Dunbar893d4752009-12-19 04:15:38 +00004228 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004229 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004230
4231 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004232 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004233
4234 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004235 Builder.defineMacro("__THUMBEL__");
4236 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004237 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004238 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004239 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004240 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4241 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004242
4243 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004244 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004245
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004246 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004247 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004248 if (FPU & VFP2FPU)
4249 Builder.defineMacro("__ARM_VFPV2__");
4250 if (FPU & VFP3FPU)
4251 Builder.defineMacro("__ARM_VFPV3__");
4252 if (FPU & VFP4FPU)
4253 Builder.defineMacro("__ARM_VFPV4__");
4254 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004255
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004256 // This only gets set when Neon instructions are actually available, unlike
4257 // the VFP define, hence the soft float and arch check. This is subtly
4258 // different from gcc, we follow the intent which was that it should be set
4259 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004260 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4261 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004262 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004263 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004264
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004265 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4266 Opts.ShortWChar ? "2" : "4");
4267
4268 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4269 Opts.ShortEnums ? "1" : "4");
4270
Bernard Ogden18b57012013-10-29 09:47:51 +00004271 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004272 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004273
Tim Northover02e38602014-02-03 17:28:04 +00004274 if (Crypto)
4275 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4276
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004277 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004278 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4279 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4280 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4281 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4282 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004283
4284 bool is5EOrAbove = (CPUArchVer >= 6 ||
4285 (CPUArchVer == 5 &&
4286 CPUArch.find('E') != StringRef::npos));
4287 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4288 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4289 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004290 }
Craig Topper3164f332014-03-11 03:39:26 +00004291 void getTargetBuiltins(const Builtin::Info *&Records,
4292 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004293 Records = BuiltinInfo;
4294 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004295 }
Craig Topper3164f332014-03-11 03:39:26 +00004296 bool isCLZForZeroUndef() const override { return false; }
4297 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004298 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004299 }
Craig Topper3164f332014-03-11 03:39:26 +00004300 void getGCCRegNames(const char * const *&Names,
4301 unsigned &NumNames) const override;
4302 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4303 unsigned &NumAliases) const override;
4304 bool validateAsmConstraint(const char *&Name,
4305 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004306 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004307 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004308 case 'l': // r0-r7
4309 case 'h': // r8-r15
4310 case 'w': // VFP Floating point register single precision
4311 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004312 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004313 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004314 case 'I':
4315 case 'J':
4316 case 'K':
4317 case 'L':
4318 case 'M':
4319 // FIXME
4320 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004321 case 'Q': // A memory address that is a single base register.
4322 Info.setAllowsMemory();
4323 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004324 case 'U': // a memory reference...
4325 switch (Name[1]) {
4326 case 'q': // ...ARMV4 ldrsb
4327 case 'v': // ...VFP load/store (reg+constant offset)
4328 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004329 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004330 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004331 case 'n': // valid address for Neon doubleword vector load/store
4332 case 'm': // valid address for Neon element and structure load/store
4333 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004334 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004335 Info.setAllowsMemory();
4336 Name++;
4337 return true;
4338 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004339 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004340 return false;
4341 }
Craig Topper3164f332014-03-11 03:39:26 +00004342 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004343 std::string R;
4344 switch (*Constraint) {
4345 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004346 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004347 Constraint++;
4348 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004349 case 'p': // 'p' should be translated to 'r' by default.
4350 R = std::string("r");
4351 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004352 default:
4353 return std::string(1, *Constraint);
4354 }
4355 return R;
4356 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004357 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004358 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004359 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004360 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004361 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004362
Bill Wendling9d1ee112012-10-25 23:28:48 +00004363 // Strip off constraint modifiers.
4364 while (Constraint[0] == '=' ||
4365 Constraint[0] == '+' ||
4366 Constraint[0] == '&')
4367 Constraint = Constraint.substr(1);
4368
4369 switch (Constraint[0]) {
4370 default: break;
4371 case 'r': {
4372 switch (Modifier) {
4373 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004374 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004375 case 'q':
4376 // A register of size 32 cannot fit a vector type.
4377 return false;
4378 }
4379 }
4380 }
4381
4382 return true;
4383 }
Craig Topper3164f332014-03-11 03:39:26 +00004384 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004385 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004386 return "";
4387 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004388
Craig Topper3164f332014-03-11 03:39:26 +00004389 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004390 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4391 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004392
Craig Topper3164f332014-03-11 03:39:26 +00004393 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004394 if (RegNo == 0) return 0;
4395 if (RegNo == 1) return 1;
4396 return -1;
4397 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004398};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004399
Rafael Espindolaeb265472013-08-21 21:59:03 +00004400bool ARMTargetInfo::setFPMath(StringRef Name) {
4401 if (Name == "neon") {
4402 FPMath = FP_Neon;
4403 return true;
4404 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4405 Name == "vfp4") {
4406 FPMath = FP_VFP;
4407 return true;
4408 }
4409 return false;
4410}
4411
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004412const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004413 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004414 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004415 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4416
4417 // Float registers
4418 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4419 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4420 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004421 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004422
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004423 // Double registers
4424 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4425 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004426 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4427 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004428
4429 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004430 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4431 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004432};
4433
4434void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004435 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004436 Names = GCCRegNames;
4437 NumNames = llvm::array_lengthof(GCCRegNames);
4438}
4439
4440const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004441 { { "a1" }, "r0" },
4442 { { "a2" }, "r1" },
4443 { { "a3" }, "r2" },
4444 { { "a4" }, "r3" },
4445 { { "v1" }, "r4" },
4446 { { "v2" }, "r5" },
4447 { { "v3" }, "r6" },
4448 { { "v4" }, "r7" },
4449 { { "v5" }, "r8" },
4450 { { "v6", "rfp" }, "r9" },
4451 { { "sl" }, "r10" },
4452 { { "fp" }, "r11" },
4453 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004454 { { "r13" }, "sp" },
4455 { { "r14" }, "lr" },
4456 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004457 // The S, D and Q registers overlap, but aren't really aliases; we
4458 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004459};
4460
4461void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4462 unsigned &NumAliases) const {
4463 Aliases = GCCRegAliases;
4464 NumAliases = llvm::array_lengthof(GCCRegAliases);
4465}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004466
4467const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004468#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004469#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004470 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004471#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004472
4473#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004474#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004475#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4476 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004477#include "clang/Basic/BuiltinsARM.def"
4478};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004479
4480class ARMleTargetInfo : public ARMTargetInfo {
4481public:
4482 ARMleTargetInfo(const llvm::Triple &Triple)
4483 : ARMTargetInfo(Triple, false) { }
4484 virtual void getTargetDefines(const LangOptions &Opts,
4485 MacroBuilder &Builder) const {
4486 Builder.defineMacro("__ARMEL__");
4487 ARMTargetInfo::getTargetDefines(Opts, Builder);
4488 }
4489};
4490
4491class ARMbeTargetInfo : public ARMTargetInfo {
4492public:
4493 ARMbeTargetInfo(const llvm::Triple &Triple)
4494 : ARMTargetInfo(Triple, true) { }
4495 virtual void getTargetDefines(const LangOptions &Opts,
4496 MacroBuilder &Builder) const {
4497 Builder.defineMacro("__ARMEB__");
4498 Builder.defineMacro("__ARM_BIG_ENDIAN");
4499 ARMTargetInfo::getTargetDefines(Opts, Builder);
4500 }
4501};
Chris Lattner17df24e2008-04-21 18:56:49 +00004502} // end anonymous namespace.
4503
Eli Friedmanf05b7722008-08-20 07:44:10 +00004504namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004505class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4506 const llvm::Triple Triple;
4507public:
4508 WindowsARMTargetInfo(const llvm::Triple &Triple)
4509 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4510 TLSSupported = false;
4511 WCharType = UnsignedShort;
4512 SizeType = UnsignedInt;
4513 UserLabelPrefix = "";
4514 }
4515 void getVisualStudioDefines(const LangOptions &Opts,
4516 MacroBuilder &Builder) const {
4517 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4518
4519 // FIXME: this is invalid for WindowsCE
4520 Builder.defineMacro("_M_ARM_NT", "1");
4521 Builder.defineMacro("_M_ARMT", "_M_ARM");
4522 Builder.defineMacro("_M_THUMB", "_M_ARM");
4523
4524 assert((Triple.getArch() == llvm::Triple::arm ||
4525 Triple.getArch() == llvm::Triple::thumb) &&
4526 "invalid architecture for Windows ARM target info");
4527 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4528 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4529
4530 // TODO map the complete set of values
4531 // 31: VFPv3 40: VFPv4
4532 Builder.defineMacro("_M_ARM_FP", "31");
4533 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004534 BuiltinVaListKind getBuiltinVaListKind() const override {
4535 return TargetInfo::CharPtrBuiltinVaList;
4536 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004537};
4538
4539// Windows ARM + Itanium C++ ABI Target
4540class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4541public:
4542 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4543 : WindowsARMTargetInfo(Triple) {
4544 TheCXXABI.set(TargetCXXABI::GenericARM);
4545 }
4546
4547 void getTargetDefines(const LangOptions &Opts,
4548 MacroBuilder &Builder) const override {
4549 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4550
4551 if (Opts.MSVCCompat)
4552 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4553 }
4554};
4555
4556// Windows ARM, MS (C++) ABI
4557class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4558public:
4559 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4560 : WindowsARMTargetInfo(Triple) {
4561 TheCXXABI.set(TargetCXXABI::Microsoft);
4562 }
4563
4564 void getTargetDefines(const LangOptions &Opts,
4565 MacroBuilder &Builder) const override {
4566 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4567 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4568 }
4569};
4570}
4571
4572
4573namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004574class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004575 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004576protected:
Craig Topper3164f332014-03-11 03:39:26 +00004577 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4578 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004579 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004580 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004581
Torok Edwinb2b37c62009-06-30 17:10:35 +00004582public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004583 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004584 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004585 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004586 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004587 // FIXME: This should be based off of the target features in
4588 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004589 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004590
4591 // Darwin on iOS uses a variant of the ARM C++ ABI.
4592 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004593 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004594};
4595} // end anonymous namespace.
4596
Tony Linthicum76329bf2011-12-12 21:14:55 +00004597
4598namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004599class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004600 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004601 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4602 static const char *const GCCRegNames[];
4603
James Molloy75f5f9e2014-04-16 15:33:48 +00004604 enum FPUModeEnum {
4605 FPUMode,
4606 NeonMode
4607 };
4608
4609 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004610 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004611 unsigned Crypto;
4612
Tim Northovera2ee4332014-03-29 15:09:45 +00004613 static const Builtin::Info BuiltinInfo[];
4614
4615 std::string ABI;
4616
4617public:
Tim Northover573cbee2014-05-24 12:52:07 +00004618 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004619 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004620
4621 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4622 WCharType = SignedInt;
4623
4624 // NetBSD apparently prefers consistency across ARM targets to consistency
4625 // across 64-bit targets.
4626 Int64Type = SignedLongLong;
4627 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004628 } else {
4629 WCharType = UnsignedInt;
4630 Int64Type = SignedLong;
4631 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004632 }
4633
Tim Northovera2ee4332014-03-29 15:09:45 +00004634 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004635 MaxVectorAlign = 128;
4636 RegParmMax = 8;
4637 MaxAtomicInlineWidth = 128;
4638 MaxAtomicPromoteWidth = 128;
4639
4640 LongDoubleWidth = LongDoubleAlign = 128;
4641 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4642
Tim Northovera2ee4332014-03-29 15:09:45 +00004643 // {} in inline assembly are neon specifiers, not assembly variant
4644 // specifiers.
4645 NoAsmVariants = true;
4646
Tim Northover573cbee2014-05-24 12:52:07 +00004647 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004648 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4649 }
4650
Alp Toker4925ba72014-06-07 23:30:42 +00004651 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004652 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004653 if (Name != "aapcs" && Name != "darwinpcs")
4654 return false;
4655
4656 ABI = Name;
4657 return true;
4658 }
4659
David Blaikie1cbb9712014-11-14 19:09:44 +00004660 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004661 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004662 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004663 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004664 .Case("cyclone", true)
4665 .Default(false);
4666 return CPUKnown;
4667 }
4668
4669 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004670 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004671 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004672 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004673
4674 // Target properties.
4675 Builder.defineMacro("_LP64");
4676 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004677
4678 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4679 Builder.defineMacro("__ARM_ACLE", "200");
4680 Builder.defineMacro("__ARM_ARCH", "8");
4681 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4682
4683 Builder.defineMacro("__ARM_64BIT_STATE");
4684 Builder.defineMacro("__ARM_PCS_AAPCS64");
4685 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4686
4687 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4688 Builder.defineMacro("__ARM_FEATURE_CLZ");
4689 Builder.defineMacro("__ARM_FEATURE_FMA");
4690 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004691 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4692 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4693 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4694 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004695
4696 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4697
4698 // 0xe implies support for half, single and double precision operations.
4699 Builder.defineMacro("__ARM_FP", "0xe");
4700
4701 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4702 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4703 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4704
4705 if (Opts.FastMath || Opts.FiniteMathOnly)
4706 Builder.defineMacro("__ARM_FP_FAST");
4707
Richard Smithab506ad2014-10-20 23:26:58 +00004708 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004709 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4710
4711 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4712
4713 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4714 Opts.ShortEnums ? "1" : "4");
4715
James Molloy75f5f9e2014-04-16 15:33:48 +00004716 if (FPU == NeonMode) {
4717 Builder.defineMacro("__ARM_NEON");
4718 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004719 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004720 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004721
Bradley Smith418c5932014-05-02 15:17:51 +00004722 if (CRC)
4723 Builder.defineMacro("__ARM_FEATURE_CRC32");
4724
James Molloy75f5f9e2014-04-16 15:33:48 +00004725 if (Crypto)
4726 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004727 }
4728
4729 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004730 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004731 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004732 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004733 }
4734
David Blaikie1cbb9712014-11-14 19:09:44 +00004735 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004736 return Feature == "aarch64" ||
4737 Feature == "arm64" ||
4738 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004739 }
4740
James Molloy5e73df52014-04-16 15:06:20 +00004741 bool handleTargetFeatures(std::vector<std::string> &Features,
4742 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004743 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004744 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004745 Crypto = 0;
4746 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4747 if (Features[i] == "+neon")
4748 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004749 if (Features[i] == "+crc")
4750 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004751 if (Features[i] == "+crypto")
4752 Crypto = 1;
4753 }
4754
James Molloy5e73df52014-04-16 15:06:20 +00004755 setDescriptionString();
4756
4757 return true;
4758 }
4759
David Blaikie1cbb9712014-11-14 19:09:44 +00004760 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004761
David Blaikie1cbb9712014-11-14 19:09:44 +00004762 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004763 return TargetInfo::AArch64ABIBuiltinVaList;
4764 }
4765
4766 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004767 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004768 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004769 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004770
Eric Christopher917e9522014-11-18 22:36:15 +00004771 virtual bool
4772 validateAsmConstraint(const char *&Name,
4773 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004774 switch (*Name) {
4775 default:
4776 return false;
4777 case 'w': // Floating point and SIMD registers (V0-V31)
4778 Info.setAllowsRegister();
4779 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004780 case 'I': // Constant that can be used with an ADD instruction
4781 case 'J': // Constant that can be used with a SUB instruction
4782 case 'K': // Constant that can be used with a 32-bit logical instruction
4783 case 'L': // Constant that can be used with a 64-bit logical instruction
4784 case 'M': // Constant that can be used as a 32-bit MOV immediate
4785 case 'N': // Constant that can be used as a 64-bit MOV immediate
4786 case 'Y': // Floating point constant zero
4787 case 'Z': // Integer constant zero
4788 return true;
4789 case 'Q': // A memory reference with base register and no offset
4790 Info.setAllowsMemory();
4791 return true;
4792 case 'S': // A symbolic address
4793 Info.setAllowsRegister();
4794 return true;
4795 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004796 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4797 // Utf: A memory address suitable for ldp/stp in TF mode.
4798 // Usa: An absolute symbolic address.
4799 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4800 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004801 case 'z': // Zero register, wzr or xzr
4802 Info.setAllowsRegister();
4803 return true;
4804 case 'x': // Floating point and SIMD registers (V0-V15)
4805 Info.setAllowsRegister();
4806 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004807 }
4808 return false;
4809 }
4810
Akira Hatanaka987f1862014-08-22 06:05:21 +00004811 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004812 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004813 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004814 // Strip off constraint modifiers.
4815 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4816 Constraint = Constraint.substr(1);
4817
4818 switch (Constraint[0]) {
4819 default:
4820 return true;
4821 case 'z':
4822 case 'r': {
4823 switch (Modifier) {
4824 case 'x':
4825 case 'w':
4826 // For now assume that the person knows what they're
4827 // doing with the modifier.
4828 return true;
4829 default:
4830 // By default an 'r' constraint will be in the 'x'
4831 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004832 if (Size == 64)
4833 return true;
4834
4835 SuggestedModifier = "w";
4836 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004837 }
4838 }
4839 }
4840 }
4841
David Blaikie1cbb9712014-11-14 19:09:44 +00004842 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004843
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004844 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004845 if (RegNo == 0)
4846 return 0;
4847 if (RegNo == 1)
4848 return 1;
4849 return -1;
4850 }
4851};
4852
Tim Northover573cbee2014-05-24 12:52:07 +00004853const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004854 // 32-bit Integer registers
4855 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4856 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4857 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4858
4859 // 64-bit Integer registers
4860 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4861 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4862 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4863
4864 // 32-bit floating point regsisters
4865 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4866 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4867 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4868
4869 // 64-bit floating point regsisters
4870 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4871 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4872 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4873
4874 // Vector registers
4875 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4876 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4877 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4878};
4879
Tim Northover573cbee2014-05-24 12:52:07 +00004880void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004881 unsigned &NumNames) const {
4882 Names = GCCRegNames;
4883 NumNames = llvm::array_lengthof(GCCRegNames);
4884}
4885
Tim Northover573cbee2014-05-24 12:52:07 +00004886const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004887 { { "w31" }, "wsp" },
4888 { { "x29" }, "fp" },
4889 { { "x30" }, "lr" },
4890 { { "x31" }, "sp" },
4891 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4892 // don't want to substitute one of these for a different-sized one.
4893};
4894
Tim Northover573cbee2014-05-24 12:52:07 +00004895void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004896 unsigned &NumAliases) const {
4897 Aliases = GCCRegAliases;
4898 NumAliases = llvm::array_lengthof(GCCRegAliases);
4899}
4900
Tim Northover573cbee2014-05-24 12:52:07 +00004901const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004902#define BUILTIN(ID, TYPE, ATTRS) \
4903 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4904#include "clang/Basic/BuiltinsNEON.def"
4905
4906#define BUILTIN(ID, TYPE, ATTRS) \
4907 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004908#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004909};
James Molloy5e73df52014-04-16 15:06:20 +00004910
Tim Northover573cbee2014-05-24 12:52:07 +00004911class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004912 void setDescriptionString() override {
4913 if (getTriple().isOSBinFormatMachO())
4914 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4915 else
4916 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4917 }
4918
4919public:
Tim Northover573cbee2014-05-24 12:52:07 +00004920 AArch64leTargetInfo(const llvm::Triple &Triple)
4921 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004922 BigEndian = false;
4923 }
4924 void getTargetDefines(const LangOptions &Opts,
4925 MacroBuilder &Builder) const override {
4926 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004927 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004928 }
4929};
4930
Tim Northover573cbee2014-05-24 12:52:07 +00004931class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004932 void setDescriptionString() override {
4933 assert(!getTriple().isOSBinFormatMachO());
4934 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4935 }
4936
4937public:
Tim Northover573cbee2014-05-24 12:52:07 +00004938 AArch64beTargetInfo(const llvm::Triple &Triple)
4939 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004940 void getTargetDefines(const LangOptions &Opts,
4941 MacroBuilder &Builder) const override {
4942 Builder.defineMacro("__AARCH64EB__");
4943 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4944 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004945 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004946 }
4947};
Tim Northovera2ee4332014-03-29 15:09:45 +00004948} // end anonymous namespace.
4949
4950namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004951class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004952protected:
4953 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4954 MacroBuilder &Builder) const override {
4955 Builder.defineMacro("__AARCH64_SIMD__");
4956 Builder.defineMacro("__ARM64_ARCH_8__");
4957 Builder.defineMacro("__ARM_NEON__");
4958 Builder.defineMacro("__LITTLE_ENDIAN__");
4959 Builder.defineMacro("__REGISTER_PREFIX__", "");
4960 Builder.defineMacro("__arm64", "1");
4961 Builder.defineMacro("__arm64__", "1");
4962
4963 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4964 }
4965
Tim Northovera2ee4332014-03-29 15:09:45 +00004966public:
Tim Northover573cbee2014-05-24 12:52:07 +00004967 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4968 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004969 Int64Type = SignedLongLong;
4970 WCharType = SignedInt;
4971 UseSignedCharForObjCBool = false;
4972
4973 LongDoubleWidth = LongDoubleAlign = 64;
4974 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4975
4976 TheCXXABI.set(TargetCXXABI::iOS64);
4977 }
4978
David Blaikie1cbb9712014-11-14 19:09:44 +00004979 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004980 return TargetInfo::CharPtrBuiltinVaList;
4981 }
4982};
4983} // end anonymous namespace
4984
4985namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004986// Hexagon abstract base class
4987class HexagonTargetInfo : public TargetInfo {
4988 static const Builtin::Info BuiltinInfo[];
4989 static const char * const GCCRegNames[];
4990 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4991 std::string CPU;
4992public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004993 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004994 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004995 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004996
4997 // {} in inline assembly are packet specifiers, not assembly variant
4998 // specifiers.
4999 NoAsmVariants = true;
5000 }
5001
Craig Topper3164f332014-03-11 03:39:26 +00005002 void getTargetBuiltins(const Builtin::Info *&Records,
5003 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005004 Records = BuiltinInfo;
5005 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5006 }
5007
Craig Topper3164f332014-03-11 03:39:26 +00005008 bool validateAsmConstraint(const char *&Name,
5009 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005010 return true;
5011 }
5012
Craig Topper3164f332014-03-11 03:39:26 +00005013 void getTargetDefines(const LangOptions &Opts,
5014 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005015
Craig Topper3164f332014-03-11 03:39:26 +00005016 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005017 return Feature == "hexagon";
5018 }
Craig Topper3164f332014-03-11 03:39:26 +00005019
5020 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005021 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005022 }
Craig Topper3164f332014-03-11 03:39:26 +00005023 void getGCCRegNames(const char * const *&Names,
5024 unsigned &NumNames) const override;
5025 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5026 unsigned &NumAliases) const override;
5027 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005028 return "";
5029 }
Sebastian Pop86500282012-01-13 20:37:10 +00005030
5031 static const char *getHexagonCPUSuffix(StringRef Name) {
5032 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005033 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005034 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005035 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005036 }
5037
Craig Topper3164f332014-03-11 03:39:26 +00005038 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005039 if (!getHexagonCPUSuffix(Name))
5040 return false;
5041
Tony Linthicum76329bf2011-12-12 21:14:55 +00005042 CPU = Name;
5043 return true;
5044 }
5045};
5046
5047void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5048 MacroBuilder &Builder) const {
5049 Builder.defineMacro("qdsp6");
5050 Builder.defineMacro("__qdsp6", "1");
5051 Builder.defineMacro("__qdsp6__", "1");
5052
5053 Builder.defineMacro("hexagon");
5054 Builder.defineMacro("__hexagon", "1");
5055 Builder.defineMacro("__hexagon__", "1");
5056
5057 if(CPU == "hexagonv1") {
5058 Builder.defineMacro("__HEXAGON_V1__");
5059 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5060 if(Opts.HexagonQdsp6Compat) {
5061 Builder.defineMacro("__QDSP6_V1__");
5062 Builder.defineMacro("__QDSP6_ARCH__", "1");
5063 }
5064 }
5065 else if(CPU == "hexagonv2") {
5066 Builder.defineMacro("__HEXAGON_V2__");
5067 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5068 if(Opts.HexagonQdsp6Compat) {
5069 Builder.defineMacro("__QDSP6_V2__");
5070 Builder.defineMacro("__QDSP6_ARCH__", "2");
5071 }
5072 }
5073 else if(CPU == "hexagonv3") {
5074 Builder.defineMacro("__HEXAGON_V3__");
5075 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5076 if(Opts.HexagonQdsp6Compat) {
5077 Builder.defineMacro("__QDSP6_V3__");
5078 Builder.defineMacro("__QDSP6_ARCH__", "3");
5079 }
5080 }
5081 else if(CPU == "hexagonv4") {
5082 Builder.defineMacro("__HEXAGON_V4__");
5083 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5084 if(Opts.HexagonQdsp6Compat) {
5085 Builder.defineMacro("__QDSP6_V4__");
5086 Builder.defineMacro("__QDSP6_ARCH__", "4");
5087 }
5088 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005089 else if(CPU == "hexagonv5") {
5090 Builder.defineMacro("__HEXAGON_V5__");
5091 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5092 if(Opts.HexagonQdsp6Compat) {
5093 Builder.defineMacro("__QDSP6_V5__");
5094 Builder.defineMacro("__QDSP6_ARCH__", "5");
5095 }
5096 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005097}
5098
5099const char * const HexagonTargetInfo::GCCRegNames[] = {
5100 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5101 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5102 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5103 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5104 "p0", "p1", "p2", "p3",
5105 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5106};
5107
5108void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5109 unsigned &NumNames) const {
5110 Names = GCCRegNames;
5111 NumNames = llvm::array_lengthof(GCCRegNames);
5112}
5113
5114
5115const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5116 { { "sp" }, "r29" },
5117 { { "fp" }, "r30" },
5118 { { "lr" }, "r31" },
5119 };
5120
5121void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5122 unsigned &NumAliases) const {
5123 Aliases = GCCRegAliases;
5124 NumAliases = llvm::array_lengthof(GCCRegAliases);
5125}
5126
5127
5128const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5129#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5130#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5131 ALL_LANGUAGES },
5132#include "clang/Basic/BuiltinsHexagon.def"
5133};
5134}
5135
5136
Chris Lattner5ba61f02006-10-14 07:39:34 +00005137namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005138// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5139class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005140 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5141 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005142 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005143public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005144 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005145
Craig Topper3164f332014-03-11 03:39:26 +00005146 bool handleTargetFeatures(std::vector<std::string> &Features,
5147 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005148 SoftFloat = false;
5149 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5150 if (Features[i] == "+soft-float")
5151 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005152 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005153 }
Craig Topper3164f332014-03-11 03:39:26 +00005154 void getTargetDefines(const LangOptions &Opts,
5155 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005156 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005157 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005158
5159 if (SoftFloat)
5160 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005161 }
Craig Topper3164f332014-03-11 03:39:26 +00005162
5163 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005164 return llvm::StringSwitch<bool>(Feature)
5165 .Case("softfloat", SoftFloat)
5166 .Case("sparc", true)
5167 .Default(false);
5168 }
Craig Topper3164f332014-03-11 03:39:26 +00005169
5170 void getTargetBuiltins(const Builtin::Info *&Records,
5171 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005172 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005173 }
Craig Topper3164f332014-03-11 03:39:26 +00005174 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005175 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005176 }
Craig Topper3164f332014-03-11 03:39:26 +00005177 void getGCCRegNames(const char * const *&Names,
5178 unsigned &NumNames) const override;
5179 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5180 unsigned &NumAliases) const override;
5181 bool validateAsmConstraint(const char *&Name,
5182 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005183 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005184 switch (*Name) {
5185 case 'I': // Signed 13-bit constant
5186 case 'J': // Zero
5187 case 'K': // 32-bit constant with the low 12 bits clear
5188 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5189 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5190 case 'N': // Same as 'K' but zext (required for SIMode)
5191 case 'O': // The constant 4096
5192 return true;
5193 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005194 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005195 }
Craig Topper3164f332014-03-11 03:39:26 +00005196 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005197 // FIXME: Implement!
5198 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005199 }
5200};
5201
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005202const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005203 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5204 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5205 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5206 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5207};
5208
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005209void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5210 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005211 Names = GCCRegNames;
5212 NumNames = llvm::array_lengthof(GCCRegNames);
5213}
5214
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005215const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005216 { { "g0" }, "r0" },
5217 { { "g1" }, "r1" },
5218 { { "g2" }, "r2" },
5219 { { "g3" }, "r3" },
5220 { { "g4" }, "r4" },
5221 { { "g5" }, "r5" },
5222 { { "g6" }, "r6" },
5223 { { "g7" }, "r7" },
5224 { { "o0" }, "r8" },
5225 { { "o1" }, "r9" },
5226 { { "o2" }, "r10" },
5227 { { "o3" }, "r11" },
5228 { { "o4" }, "r12" },
5229 { { "o5" }, "r13" },
5230 { { "o6", "sp" }, "r14" },
5231 { { "o7" }, "r15" },
5232 { { "l0" }, "r16" },
5233 { { "l1" }, "r17" },
5234 { { "l2" }, "r18" },
5235 { { "l3" }, "r19" },
5236 { { "l4" }, "r20" },
5237 { { "l5" }, "r21" },
5238 { { "l6" }, "r22" },
5239 { { "l7" }, "r23" },
5240 { { "i0" }, "r24" },
5241 { { "i1" }, "r25" },
5242 { { "i2" }, "r26" },
5243 { { "i3" }, "r27" },
5244 { { "i4" }, "r28" },
5245 { { "i5" }, "r29" },
5246 { { "i6", "fp" }, "r30" },
5247 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005248};
5249
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005250void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5251 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005252 Aliases = GCCRegAliases;
5253 NumAliases = llvm::array_lengthof(GCCRegAliases);
5254}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005255
5256// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5257class SparcV8TargetInfo : public SparcTargetInfo {
5258public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005259 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005260 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005261 }
5262
Craig Topper3164f332014-03-11 03:39:26 +00005263 void getTargetDefines(const LangOptions &Opts,
5264 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005265 SparcTargetInfo::getTargetDefines(Opts, Builder);
5266 Builder.defineMacro("__sparcv8");
5267 }
5268};
5269
5270// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5271class SparcV9TargetInfo : public SparcTargetInfo {
5272public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005273 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005274 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005275 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005276 // This is an LP64 platform.
5277 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005278
5279 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005280 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005281 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005282 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005283 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005284 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005285
5286 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5287 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5288 LongDoubleWidth = 128;
5289 LongDoubleAlign = 128;
5290 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005291 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005292 }
5293
Craig Topper3164f332014-03-11 03:39:26 +00005294 void getTargetDefines(const LangOptions &Opts,
5295 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005296 SparcTargetInfo::getTargetDefines(Opts, Builder);
5297 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005298 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005299 // Solaris doesn't need these variants, but the BSDs do.
5300 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005301 Builder.defineMacro("__sparc64__");
5302 Builder.defineMacro("__sparc_v9__");
5303 Builder.defineMacro("__sparcv9__");
5304 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005305 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005306
Craig Topper3164f332014-03-11 03:39:26 +00005307 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005308 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5309 .Case("v9", true)
5310 .Case("ultrasparc", true)
5311 .Case("ultrasparc3", true)
5312 .Case("niagara", true)
5313 .Case("niagara2", true)
5314 .Case("niagara3", true)
5315 .Case("niagara4", true)
5316 .Default(false);
5317
5318 // No need to store the CPU yet. There aren't any CPU-specific
5319 // macros to define.
5320 return CPUKnown;
5321 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005322};
5323
Gabor Greif49991682008-02-21 16:29:08 +00005324} // end anonymous namespace.
5325
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005326namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005327class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005328public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005329 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5330 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005331 SizeType = UnsignedInt;
5332 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005333 }
5334};
5335} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005336
Chris Lattnerb781dc792008-05-08 05:58:21 +00005337namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005338class SystemZTargetInfo : public TargetInfo {
5339 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005340
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005341public:
5342 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5343 TLSSupported = true;
5344 IntWidth = IntAlign = 32;
5345 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5346 PointerWidth = PointerAlign = 64;
5347 LongDoubleWidth = 128;
5348 LongDoubleAlign = 64;
5349 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5350 MinGlobalAlign = 16;
5351 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5352 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5353 }
5354 void getTargetDefines(const LangOptions &Opts,
5355 MacroBuilder &Builder) const override {
5356 Builder.defineMacro("__s390__");
5357 Builder.defineMacro("__s390x__");
5358 Builder.defineMacro("__zarch__");
5359 Builder.defineMacro("__LONG_DOUBLE_128__");
5360 }
5361 void getTargetBuiltins(const Builtin::Info *&Records,
5362 unsigned &NumRecords) const override {
5363 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005364 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005365 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005366 }
5367
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005368 void getGCCRegNames(const char *const *&Names,
5369 unsigned &NumNames) const override;
5370 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5371 unsigned &NumAliases) const override {
5372 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005373 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005374 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005375 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005376 bool validateAsmConstraint(const char *&Name,
5377 TargetInfo::ConstraintInfo &info) const override;
5378 const char *getClobbers() const override {
5379 // FIXME: Is this really right?
5380 return "";
5381 }
5382 BuiltinVaListKind getBuiltinVaListKind() const override {
5383 return TargetInfo::SystemZBuiltinVaList;
5384 }
5385 bool setCPU(const std::string &Name) override {
5386 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5387 .Case("z10", true)
5388 .Case("z196", true)
5389 .Case("zEC12", true)
5390 .Default(false);
5391
5392 // No need to store the CPU yet. There aren't any CPU-specific
5393 // macros to define.
5394 return CPUKnown;
5395 }
5396};
5397
5398const char *const SystemZTargetInfo::GCCRegNames[] = {
5399 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5400 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5401 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5402 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5403};
5404
5405void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5406 unsigned &NumNames) const {
5407 Names = GCCRegNames;
5408 NumNames = llvm::array_lengthof(GCCRegNames);
5409}
5410
5411bool SystemZTargetInfo::
5412validateAsmConstraint(const char *&Name,
5413 TargetInfo::ConstraintInfo &Info) const {
5414 switch (*Name) {
5415 default:
5416 return false;
5417
5418 case 'a': // Address register
5419 case 'd': // Data register (equivalent to 'r')
5420 case 'f': // Floating-point register
5421 Info.setAllowsRegister();
5422 return true;
5423
5424 case 'I': // Unsigned 8-bit constant
5425 case 'J': // Unsigned 12-bit constant
5426 case 'K': // Signed 16-bit constant
5427 case 'L': // Signed 20-bit displacement (on all targets we support)
5428 case 'M': // 0x7fffffff
5429 return true;
5430
5431 case 'Q': // Memory with base and unsigned 12-bit displacement
5432 case 'R': // Likewise, plus an index
5433 case 'S': // Memory with base and signed 20-bit displacement
5434 case 'T': // Likewise, plus an index
5435 Info.setAllowsMemory();
5436 return true;
5437 }
5438}
Ulrich Weigand47445072013-05-06 16:26:41 +00005439}
5440
5441namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005442 class MSP430TargetInfo : public TargetInfo {
5443 static const char * const GCCRegNames[];
5444 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005445 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005446 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005447 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005448 IntWidth = 16; IntAlign = 16;
5449 LongWidth = 32; LongLongWidth = 64;
5450 LongAlign = LongLongAlign = 16;
5451 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005452 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005453 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005454 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005455 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005456 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005457 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005458 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005459 }
5460 void getTargetDefines(const LangOptions &Opts,
5461 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005462 Builder.defineMacro("MSP430");
5463 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005464 // FIXME: defines for different 'flavours' of MCU
5465 }
Craig Topper3164f332014-03-11 03:39:26 +00005466 void getTargetBuiltins(const Builtin::Info *&Records,
5467 unsigned &NumRecords) const override {
5468 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005469 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005470 NumRecords = 0;
5471 }
Craig Topper3164f332014-03-11 03:39:26 +00005472 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005473 return Feature == "msp430";
5474 }
Craig Topper3164f332014-03-11 03:39:26 +00005475 void getGCCRegNames(const char * const *&Names,
5476 unsigned &NumNames) const override;
5477 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5478 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005479 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005480 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005481 NumAliases = 0;
5482 }
Eric Christopher917e9522014-11-18 22:36:15 +00005483 bool
5484 validateAsmConstraint(const char *&Name,
5485 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005486 // FIXME: implement
5487 switch (*Name) {
5488 case 'K': // the constant 1
5489 case 'L': // constant -1^20 .. 1^19
5490 case 'M': // constant 1-4:
5491 return true;
5492 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005493 // No target constraints for now.
5494 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005495 }
Craig Topper3164f332014-03-11 03:39:26 +00005496 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005497 // FIXME: Is this really right?
5498 return "";
5499 }
Craig Topper3164f332014-03-11 03:39:26 +00005500 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005501 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005502 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005503 }
5504 };
5505
5506 const char * const MSP430TargetInfo::GCCRegNames[] = {
5507 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5508 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5509 };
5510
5511 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5512 unsigned &NumNames) const {
5513 Names = GCCRegNames;
5514 NumNames = llvm::array_lengthof(GCCRegNames);
5515 }
5516}
5517
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005518namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005519
Mike Stump11289f42009-09-09 15:08:12 +00005520 // LLVM and Clang cannot be used directly to output native binaries for
5521 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005522 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005523 //
5524 // TCE uses the llvm bitcode as input and uses it for generating customized
5525 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005526 // publicly available in http://tce.cs.tut.fi
5527
Eli Friedman1f191002011-10-07 19:51:42 +00005528 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5529 3, // opencl_global
5530 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005531 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005532 // FIXME: generic has to be added to the target
5533 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005534 0, // cuda_device
5535 0, // cuda_constant
5536 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005537 };
5538
Eli Friedmana9c3d712009-08-19 20:47:07 +00005539 class TCETargetInfo : public TargetInfo{
5540 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005541 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005542 TLSSupported = false;
5543 IntWidth = 32;
5544 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005545 PointerWidth = 32;
5546 IntAlign = 32;
5547 LongAlign = LongLongAlign = 32;
5548 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005549 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005550 SizeType = UnsignedInt;
5551 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005552 IntPtrType = SignedInt;
5553 PtrDiffType = SignedInt;
5554 FloatWidth = 32;
5555 FloatAlign = 32;
5556 DoubleWidth = 32;
5557 DoubleAlign = 32;
5558 LongDoubleWidth = 32;
5559 LongDoubleAlign = 32;
5560 FloatFormat = &llvm::APFloat::IEEEsingle;
5561 DoubleFormat = &llvm::APFloat::IEEEsingle;
5562 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005563 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5564 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005565 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005566 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005567 }
5568
Craig Topper3164f332014-03-11 03:39:26 +00005569 void getTargetDefines(const LangOptions &Opts,
5570 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005571 DefineStd(Builder, "tce", Opts);
5572 Builder.defineMacro("__TCE__");
5573 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005574 }
Craig Topper3164f332014-03-11 03:39:26 +00005575 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005576 return Feature == "tce";
5577 }
Craig Topper3164f332014-03-11 03:39:26 +00005578
5579 void getTargetBuiltins(const Builtin::Info *&Records,
5580 unsigned &NumRecords) const override {}
5581 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005582 return "";
5583 }
Craig Topper3164f332014-03-11 03:39:26 +00005584 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005585 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005586 }
Craig Topper3164f332014-03-11 03:39:26 +00005587 void getGCCRegNames(const char * const *&Names,
5588 unsigned &NumNames) const override {}
5589 bool validateAsmConstraint(const char *&Name,
5590 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005591 return true;
5592 }
Craig Topper3164f332014-03-11 03:39:26 +00005593 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5594 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005595 };
5596}
5597
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005598namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005599class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005600 virtual void setDescriptionString() = 0;
5601
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005602 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005603 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005604 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005605 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005606 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005607 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005608 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005609 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005610 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005611 enum DspRevEnum {
5612 NoDSP, DSP1, DSP2
5613 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005614 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005615
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005616protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005617 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005618 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005619
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005620public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005621 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5622 const std::string &CPUStr)
5623 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005624 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005625 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005626
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005627 bool isNaN2008Default() const {
5628 return CPU == "mips32r6" || CPU == "mips64r6";
5629 }
5630
5631 bool isFP64Default() const {
5632 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5633 }
5634
Alp Toker4925ba72014-06-07 23:30:42 +00005635 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005636 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005637 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5638 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005639 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005640 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005641 .Case("mips1", IsMips32)
5642 .Case("mips2", IsMips32)
5643 .Case("mips3", true)
5644 .Case("mips4", true)
5645 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005646 .Case("mips32", IsMips32)
5647 .Case("mips32r2", IsMips32)
5648 .Case("mips32r6", IsMips32)
5649 .Case("mips64", true)
5650 .Case("mips64r2", true)
5651 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005652 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005653 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005654 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005655 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005656 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005657 // The backend enables certain ABI's by default according to the
5658 // architecture.
5659 // Disable both possible defaults so that we don't end up with multiple
5660 // ABI's selected and trigger an assertion.
5661 Features["o32"] = false;
5662 Features["n64"] = false;
5663
Eric Christopher0b26a612010-03-02 02:41:08 +00005664 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005665 if (CPU == "octeon")
5666 Features["mips64r2"] = Features["cnmips"] = true;
5667 else
5668 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005669 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005670
Craig Topper3164f332014-03-11 03:39:26 +00005671 void getTargetDefines(const LangOptions &Opts,
5672 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005673 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005674 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005675 if (Opts.GNUMode)
5676 Builder.defineMacro("mips");
5677
Simon Atanasyan683535b2012-08-29 19:14:58 +00005678 Builder.defineMacro("__REGISTER_PREFIX__", "");
5679
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005680 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005681 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005682 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005683 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005684 case SoftFloat:
5685 Builder.defineMacro("__mips_soft_float", Twine(1));
5686 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005687 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005688
Simon Atanasyan16071912013-04-14 14:07:30 +00005689 if (IsSingleFloat)
5690 Builder.defineMacro("__mips_single_float", Twine(1));
5691
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005692 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5693 Builder.defineMacro("_MIPS_FPSET",
5694 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5695
Simon Atanasyan72244b62012-07-05 16:06:06 +00005696 if (IsMips16)
5697 Builder.defineMacro("__mips16", Twine(1));
5698
Simon Atanasyan60777612013-04-14 14:07:51 +00005699 if (IsMicromips)
5700 Builder.defineMacro("__mips_micromips", Twine(1));
5701
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005702 if (IsNan2008)
5703 Builder.defineMacro("__mips_nan2008", Twine(1));
5704
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005705 switch (DspRev) {
5706 default:
5707 break;
5708 case DSP1:
5709 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5710 Builder.defineMacro("__mips_dsp", Twine(1));
5711 break;
5712 case DSP2:
5713 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5714 Builder.defineMacro("__mips_dspr2", Twine(1));
5715 Builder.defineMacro("__mips_dsp", Twine(1));
5716 break;
5717 }
5718
Jack Carter44ff1e52013-08-12 17:20:29 +00005719 if (HasMSA)
5720 Builder.defineMacro("__mips_msa", Twine(1));
5721
Simon Atanasyan26f19672012-04-05 19:28:31 +00005722 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5723 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5724 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005725
5726 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5727 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005728 }
5729
Craig Topper3164f332014-03-11 03:39:26 +00005730 void getTargetBuiltins(const Builtin::Info *&Records,
5731 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005732 Records = BuiltinInfo;
5733 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005734 }
Craig Topper3164f332014-03-11 03:39:26 +00005735 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005736 return llvm::StringSwitch<bool>(Feature)
5737 .Case("mips", true)
5738 .Case("fp64", HasFP64)
5739 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005740 }
Craig Topper3164f332014-03-11 03:39:26 +00005741 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005742 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005743 }
Craig Topper3164f332014-03-11 03:39:26 +00005744 void getGCCRegNames(const char * const *&Names,
5745 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005746 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005747 // CPU register names
5748 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005749 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5750 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5751 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005752 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5753 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005754 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5755 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5756 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5757 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005758 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005759 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005760 "$fcc5","$fcc6","$fcc7",
5761 // MSA register names
5762 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5763 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5764 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5765 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5766 // MSA control register names
5767 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5768 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005769 };
5770 Names = GCCRegNames;
5771 NumNames = llvm::array_lengthof(GCCRegNames);
5772 }
Craig Topper3164f332014-03-11 03:39:26 +00005773 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5774 unsigned &NumAliases) const override = 0;
5775 bool validateAsmConstraint(const char *&Name,
5776 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005777 switch (*Name) {
5778 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005779 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005780 case 'r': // CPU registers.
5781 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005782 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005783 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005784 case 'c': // $25 for indirect jumps
5785 case 'l': // lo register
5786 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005787 Info.setAllowsRegister();
5788 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005789 case 'I': // Signed 16-bit constant
5790 case 'J': // Integer 0
5791 case 'K': // Unsigned 16-bit constant
5792 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5793 case 'M': // Constants not loadable via lui, addiu, or ori
5794 case 'N': // Constant -1 to -65535
5795 case 'O': // A signed 15-bit constant
5796 case 'P': // A constant between 1 go 65535
5797 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005798 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005799 Info.setAllowsMemory();
5800 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005801 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005802 }
5803
Craig Topper3164f332014-03-11 03:39:26 +00005804 const char *getClobbers() const override {
Toma Tabacu99411952014-12-17 12:02:58 +00005805 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005806 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005807
Craig Topper3164f332014-03-11 03:39:26 +00005808 bool handleTargetFeatures(std::vector<std::string> &Features,
5809 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005810 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005811 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005812 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005813 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005814 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005815 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005816 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005817
5818 for (std::vector<std::string>::iterator it = Features.begin(),
5819 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005820 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005821 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005822 else if (*it == "+soft-float")
5823 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005824 else if (*it == "+mips16")
5825 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005826 else if (*it == "+micromips")
5827 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005828 else if (*it == "+dsp")
5829 DspRev = std::max(DspRev, DSP1);
5830 else if (*it == "+dspr2")
5831 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005832 else if (*it == "+msa")
5833 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005834 else if (*it == "+fp64")
5835 HasFP64 = true;
5836 else if (*it == "-fp64")
5837 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005838 else if (*it == "+nan2008")
5839 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005840 else if (*it == "-nan2008")
5841 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005842 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005843
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005844 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005845 std::vector<std::string>::iterator it =
5846 std::find(Features.begin(), Features.end(), "+soft-float");
5847 if (it != Features.end())
5848 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005849
Akira Hatanaka9064e362013-10-29 18:30:33 +00005850 setDescriptionString();
5851
Rafael Espindolaeb265472013-08-21 21:59:03 +00005852 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005853 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005854
Craig Topper3164f332014-03-11 03:39:26 +00005855 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005856 if (RegNo == 0) return 4;
5857 if (RegNo == 1) return 5;
5858 return -1;
5859 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005860
5861 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005862};
5863
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005864const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5865#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5866#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5867 ALL_LANGUAGES },
5868#include "clang/Basic/BuiltinsMips.def"
5869};
5870
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005871class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005872public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005873 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005874 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005875 SizeType = UnsignedInt;
5876 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005877 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005878 }
Craig Topper3164f332014-03-11 03:39:26 +00005879 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005880 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005881 ABI = Name;
5882 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005883 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005884 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005885 }
Craig Topper3164f332014-03-11 03:39:26 +00005886 void getTargetDefines(const LangOptions &Opts,
5887 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005888 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005889
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005890 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005891 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5892
5893 const std::string& CPUStr = getCPU();
5894 if (CPUStr == "mips32")
5895 Builder.defineMacro("__mips_isa_rev", "1");
5896 else if (CPUStr == "mips32r2")
5897 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005898
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005899 if (ABI == "o32") {
5900 Builder.defineMacro("__mips_o32");
5901 Builder.defineMacro("_ABIO32", "1");
5902 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5903 }
5904 else if (ABI == "eabi")
5905 Builder.defineMacro("__mips_eabi");
5906 else
David Blaikie83d382b2011-09-23 05:06:16 +00005907 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005908 }
Craig Topper3164f332014-03-11 03:39:26 +00005909 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5910 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005911 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5912 { { "at" }, "$1" },
5913 { { "v0" }, "$2" },
5914 { { "v1" }, "$3" },
5915 { { "a0" }, "$4" },
5916 { { "a1" }, "$5" },
5917 { { "a2" }, "$6" },
5918 { { "a3" }, "$7" },
5919 { { "t0" }, "$8" },
5920 { { "t1" }, "$9" },
5921 { { "t2" }, "$10" },
5922 { { "t3" }, "$11" },
5923 { { "t4" }, "$12" },
5924 { { "t5" }, "$13" },
5925 { { "t6" }, "$14" },
5926 { { "t7" }, "$15" },
5927 { { "s0" }, "$16" },
5928 { { "s1" }, "$17" },
5929 { { "s2" }, "$18" },
5930 { { "s3" }, "$19" },
5931 { { "s4" }, "$20" },
5932 { { "s5" }, "$21" },
5933 { { "s6" }, "$22" },
5934 { { "s7" }, "$23" },
5935 { { "t8" }, "$24" },
5936 { { "t9" }, "$25" },
5937 { { "k0" }, "$26" },
5938 { { "k1" }, "$27" },
5939 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005940 { { "sp","$sp" }, "$29" },
5941 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005942 { { "ra" }, "$31" }
5943 };
5944 Aliases = GCCRegAliases;
5945 NumAliases = llvm::array_lengthof(GCCRegAliases);
5946 }
5947};
5948
5949class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005950 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005951 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005952 }
5953
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005954public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005955 Mips32EBTargetInfo(const llvm::Triple &Triple)
5956 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005957 }
Craig Topper3164f332014-03-11 03:39:26 +00005958 void getTargetDefines(const LangOptions &Opts,
5959 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005960 DefineStd(Builder, "MIPSEB", Opts);
5961 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005962 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005963 }
5964};
5965
5966class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005967 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005968 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005969 }
5970
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005971public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005972 Mips32ELTargetInfo(const llvm::Triple &Triple)
5973 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005974 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005975 }
Craig Topper3164f332014-03-11 03:39:26 +00005976 void getTargetDefines(const LangOptions &Opts,
5977 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005978 DefineStd(Builder, "MIPSEL", Opts);
5979 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005980 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005981 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005982};
Akira Hatanakabef17452011-09-20 19:21:49 +00005983
5984class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005985public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005986 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005987 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005988 LongDoubleWidth = LongDoubleAlign = 128;
5989 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005990 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5991 LongDoubleWidth = LongDoubleAlign = 64;
5992 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5993 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005994 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005995 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005996 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005997 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005998
5999 void setN64ABITypes() {
6000 LongWidth = LongAlign = 64;
6001 PointerWidth = PointerAlign = 64;
6002 SizeType = UnsignedLong;
6003 PtrDiffType = SignedLong;
6004 }
6005
6006 void setN32ABITypes() {
6007 LongWidth = LongAlign = 32;
6008 PointerWidth = PointerAlign = 32;
6009 SizeType = UnsignedInt;
6010 PtrDiffType = SignedInt;
6011 }
6012
Craig Topper3164f332014-03-11 03:39:26 +00006013 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006014 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006015 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006016 ABI = Name;
6017 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006018 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006019 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006020 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006021 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006022 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006023 }
6024 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006025 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006026
Craig Topper3164f332014-03-11 03:39:26 +00006027 void getTargetDefines(const LangOptions &Opts,
6028 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006029 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006030
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006031 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006032 Builder.defineMacro("__mips64");
6033 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006034 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6035
6036 const std::string& CPUStr = getCPU();
6037 if (CPUStr == "mips64")
6038 Builder.defineMacro("__mips_isa_rev", "1");
6039 else if (CPUStr == "mips64r2")
6040 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006041
Akira Hatanakabef17452011-09-20 19:21:49 +00006042 if (ABI == "n32") {
6043 Builder.defineMacro("__mips_n32");
6044 Builder.defineMacro("_ABIN32", "2");
6045 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6046 }
6047 else if (ABI == "n64") {
6048 Builder.defineMacro("__mips_n64");
6049 Builder.defineMacro("_ABI64", "3");
6050 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6051 }
6052 else
David Blaikie83d382b2011-09-23 05:06:16 +00006053 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006054 }
Craig Topper3164f332014-03-11 03:39:26 +00006055 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6056 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006057 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6058 { { "at" }, "$1" },
6059 { { "v0" }, "$2" },
6060 { { "v1" }, "$3" },
6061 { { "a0" }, "$4" },
6062 { { "a1" }, "$5" },
6063 { { "a2" }, "$6" },
6064 { { "a3" }, "$7" },
6065 { { "a4" }, "$8" },
6066 { { "a5" }, "$9" },
6067 { { "a6" }, "$10" },
6068 { { "a7" }, "$11" },
6069 { { "t0" }, "$12" },
6070 { { "t1" }, "$13" },
6071 { { "t2" }, "$14" },
6072 { { "t3" }, "$15" },
6073 { { "s0" }, "$16" },
6074 { { "s1" }, "$17" },
6075 { { "s2" }, "$18" },
6076 { { "s3" }, "$19" },
6077 { { "s4" }, "$20" },
6078 { { "s5" }, "$21" },
6079 { { "s6" }, "$22" },
6080 { { "s7" }, "$23" },
6081 { { "t8" }, "$24" },
6082 { { "t9" }, "$25" },
6083 { { "k0" }, "$26" },
6084 { { "k1" }, "$27" },
6085 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006086 { { "sp","$sp" }, "$29" },
6087 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006088 { { "ra" }, "$31" }
6089 };
6090 Aliases = GCCRegAliases;
6091 NumAliases = llvm::array_lengthof(GCCRegAliases);
6092 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006093
6094 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006095};
6096
6097class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006098 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006099 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006100 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 +00006101 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006102 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006103
Akira Hatanakabef17452011-09-20 19:21:49 +00006104 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006105
Akira Hatanakabef17452011-09-20 19:21:49 +00006106public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006107 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006108 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006109 void getTargetDefines(const LangOptions &Opts,
6110 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006111 DefineStd(Builder, "MIPSEB", Opts);
6112 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006113 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006114 }
6115};
6116
6117class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006118 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006119 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006120 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 +00006121 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006122 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006123 }
6124public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006125 Mips64ELTargetInfo(const llvm::Triple &Triple)
6126 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006127 // Default ABI is n64.
6128 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006129 }
Craig Topper3164f332014-03-11 03:39:26 +00006130 void getTargetDefines(const LangOptions &Opts,
6131 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006132 DefineStd(Builder, "MIPSEL", Opts);
6133 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006134 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006135 }
6136};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006137} // end anonymous namespace.
6138
Ivan Krasindd7403e2011-08-24 20:22:22 +00006139namespace {
6140class PNaClTargetInfo : public TargetInfo {
6141public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006142 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006143 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006144 this->UserLabelPrefix = "";
6145 this->LongAlign = 32;
6146 this->LongWidth = 32;
6147 this->PointerAlign = 32;
6148 this->PointerWidth = 32;
6149 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006150 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006151 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006152 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006153 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006154 this->SizeType = TargetInfo::UnsignedInt;
6155 this->PtrDiffType = TargetInfo::SignedInt;
6156 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006157 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006158 }
6159
Craig Topper3164f332014-03-11 03:39:26 +00006160 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006161 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006162 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006163 Builder.defineMacro("__le32__");
6164 Builder.defineMacro("__pnacl__");
6165 }
Craig Topper3164f332014-03-11 03:39:26 +00006166 void getTargetDefines(const LangOptions &Opts,
6167 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006168 getArchDefines(Opts, Builder);
6169 }
Craig Topper3164f332014-03-11 03:39:26 +00006170 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006171 return Feature == "pnacl";
6172 }
Craig Topper3164f332014-03-11 03:39:26 +00006173 void getTargetBuiltins(const Builtin::Info *&Records,
6174 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006175 }
Craig Topper3164f332014-03-11 03:39:26 +00006176 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006177 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006178 }
Craig Topper3164f332014-03-11 03:39:26 +00006179 void getGCCRegNames(const char * const *&Names,
6180 unsigned &NumNames) const override;
6181 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6182 unsigned &NumAliases) const override;
6183 bool validateAsmConstraint(const char *&Name,
6184 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006185 return false;
6186 }
6187
Craig Topper3164f332014-03-11 03:39:26 +00006188 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006189 return "";
6190 }
6191};
6192
6193void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6194 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006195 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006196 NumNames = 0;
6197}
6198
6199void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6200 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006201 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006202 NumAliases = 0;
6203}
6204} // end anonymous namespace.
6205
Guy Benyeib798fc92012-12-11 21:38:14 +00006206namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006207class Le64TargetInfo : public TargetInfo {
6208 static const Builtin::Info BuiltinInfo[];
6209
6210public:
6211 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6212 BigEndian = false;
6213 NoAsmVariants = true;
6214 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6215 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6216 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006217 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006218 }
6219
6220 void getTargetDefines(const LangOptions &Opts,
6221 MacroBuilder &Builder) const override {
6222 DefineStd(Builder, "unix", Opts);
6223 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6224 Builder.defineMacro("__ELF__");
6225 }
6226 void getTargetBuiltins(const Builtin::Info *&Records,
6227 unsigned &NumRecords) const override {
6228 Records = BuiltinInfo;
6229 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6230 }
6231 BuiltinVaListKind getBuiltinVaListKind() const override {
6232 return TargetInfo::PNaClABIBuiltinVaList;
6233 }
6234 const char *getClobbers() const override { return ""; }
6235 void getGCCRegNames(const char *const *&Names,
6236 unsigned &NumNames) const override {
6237 Names = nullptr;
6238 NumNames = 0;
6239 }
6240 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6241 unsigned &NumAliases) const override {
6242 Aliases = nullptr;
6243 NumAliases = 0;
6244 }
6245 bool validateAsmConstraint(const char *&Name,
6246 TargetInfo::ConstraintInfo &Info) const override {
6247 return false;
6248 }
6249
6250 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006251};
6252} // end anonymous namespace.
6253
6254const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6255#define BUILTIN(ID, TYPE, ATTRS) \
6256 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6257#include "clang/Basic/BuiltinsLe64.def"
6258};
6259
6260namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006261 static const unsigned SPIRAddrSpaceMap[] = {
6262 1, // opencl_global
6263 3, // opencl_local
6264 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006265 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006266 0, // cuda_device
6267 0, // cuda_constant
6268 0 // cuda_shared
6269 };
6270 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006271 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006272 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006273 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6274 "SPIR target must use unknown OS");
6275 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6276 "SPIR target must use unknown environment type");
6277 BigEndian = false;
6278 TLSSupported = false;
6279 LongWidth = LongAlign = 64;
6280 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006281 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006282 // Define available target features
6283 // These must be defined in sorted order!
6284 NoAsmVariants = true;
6285 }
Craig Topper3164f332014-03-11 03:39:26 +00006286 void getTargetDefines(const LangOptions &Opts,
6287 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006288 DefineStd(Builder, "SPIR", Opts);
6289 }
Craig Topper3164f332014-03-11 03:39:26 +00006290 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006291 return Feature == "spir";
6292 }
Craig Topper3164f332014-03-11 03:39:26 +00006293
6294 void getTargetBuiltins(const Builtin::Info *&Records,
6295 unsigned &NumRecords) const override {}
6296 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006297 return "";
6298 }
Craig Topper3164f332014-03-11 03:39:26 +00006299 void getGCCRegNames(const char * const *&Names,
6300 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006301 bool
6302 validateAsmConstraint(const char *&Name,
6303 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006304 return true;
6305 }
Craig Topper3164f332014-03-11 03:39:26 +00006306 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6307 unsigned &NumAliases) const override {}
6308 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006309 return TargetInfo::VoidPtrBuiltinVaList;
6310 }
6311 };
6312
6313
6314 class SPIR32TargetInfo : public SPIRTargetInfo {
6315 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006316 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006317 PointerWidth = PointerAlign = 32;
6318 SizeType = TargetInfo::UnsignedInt;
6319 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6320 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006321 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6322 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006323 }
Craig Topper3164f332014-03-11 03:39:26 +00006324 void getTargetDefines(const LangOptions &Opts,
6325 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006326 DefineStd(Builder, "SPIR32", Opts);
6327 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006328 };
6329
6330 class SPIR64TargetInfo : public SPIRTargetInfo {
6331 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006333 PointerWidth = PointerAlign = 64;
6334 SizeType = TargetInfo::UnsignedLong;
6335 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006336 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6337 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006338 }
Craig Topper3164f332014-03-11 03:39:26 +00006339 void getTargetDefines(const LangOptions &Opts,
6340 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006341 DefineStd(Builder, "SPIR64", Opts);
6342 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006343 };
6344}
6345
Robert Lytton0e076492013-08-13 09:43:10 +00006346namespace {
6347class XCoreTargetInfo : public TargetInfo {
6348 static const Builtin::Info BuiltinInfo[];
6349public:
6350 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6351 BigEndian = false;
6352 NoAsmVariants = true;
6353 LongLongAlign = 32;
6354 SuitableAlign = 32;
6355 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006356 SizeType = UnsignedInt;
6357 PtrDiffType = SignedInt;
6358 IntPtrType = SignedInt;
6359 WCharType = UnsignedChar;
6360 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006361 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006362 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 +00006363 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006364 }
Craig Topper3164f332014-03-11 03:39:26 +00006365 void getTargetDefines(const LangOptions &Opts,
6366 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006367 Builder.defineMacro("__XS1B__");
6368 }
Craig Topper3164f332014-03-11 03:39:26 +00006369 void getTargetBuiltins(const Builtin::Info *&Records,
6370 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006371 Records = BuiltinInfo;
6372 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6373 }
Craig Topper3164f332014-03-11 03:39:26 +00006374 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006375 return TargetInfo::VoidPtrBuiltinVaList;
6376 }
Craig Topper3164f332014-03-11 03:39:26 +00006377 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006378 return "";
6379 }
Craig Topper3164f332014-03-11 03:39:26 +00006380 void getGCCRegNames(const char * const *&Names,
6381 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006382 static const char * const GCCRegNames[] = {
6383 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6384 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6385 };
6386 Names = GCCRegNames;
6387 NumNames = llvm::array_lengthof(GCCRegNames);
6388 }
Craig Topper3164f332014-03-11 03:39:26 +00006389 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6390 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006391 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006392 NumAliases = 0;
6393 }
Craig Topper3164f332014-03-11 03:39:26 +00006394 bool validateAsmConstraint(const char *&Name,
6395 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006396 return false;
6397 }
Craig Topper3164f332014-03-11 03:39:26 +00006398 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006399 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6400 return (RegNo < 2)? RegNo : -1;
6401 }
Robert Lytton0e076492013-08-13 09:43:10 +00006402};
6403
6404const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6405#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6406#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6407 ALL_LANGUAGES },
6408#include "clang/Basic/BuiltinsXCore.def"
6409};
6410} // end anonymous namespace.
6411
Ivan Krasindd7403e2011-08-24 20:22:22 +00006412
Chris Lattner5ba61f02006-10-14 07:39:34 +00006413//===----------------------------------------------------------------------===//
6414// Driver code
6415//===----------------------------------------------------------------------===//
6416
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006417static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006418 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006419
Daniel Dunbar52322032009-08-18 05:47:58 +00006420 switch (Triple.getArch()) {
6421 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006422 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006423
Tim Northover2a0783d2014-05-30 14:14:07 +00006424 case llvm::Triple::xcore:
6425 return new XCoreTargetInfo(Triple);
6426
6427 case llvm::Triple::hexagon:
6428 return new HexagonTargetInfo(Triple);
6429
6430 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006431 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006432 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006433
6434 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006435 case llvm::Triple::FreeBSD:
6436 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006437 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006438 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006439 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006440 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006441 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006442 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006443 }
6444
Christian Pirker9b019ae2014-02-25 13:51:00 +00006445 case llvm::Triple::aarch64_be:
6446 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006447 case llvm::Triple::FreeBSD:
6448 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006449 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006450 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006451 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006452 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006453 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006454 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006455 }
6456
Daniel Dunbar52322032009-08-18 05:47:58 +00006457 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006458 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006459 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006460 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006461
Daniel Dunbar52322032009-08-18 05:47:58 +00006462 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006463 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006464 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006465 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006466 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006467 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006468 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006469 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006470 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006471 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006472 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006473 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006474 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006475 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006476 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006477 case llvm::Triple::Win32:
6478 switch (Triple.getEnvironment()) {
6479 default:
6480 return new ARMleTargetInfo(Triple);
6481 case llvm::Triple::Itanium:
6482 return new ItaniumWindowsARMleTargetInfo(Triple);
6483 case llvm::Triple::MSVC:
6484 return new MicrosoftARMleTargetInfo(Triple);
6485 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006486 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006487 return new ARMleTargetInfo(Triple);
6488 }
6489
6490 case llvm::Triple::armeb:
6491 case llvm::Triple::thumbeb:
6492 if (Triple.isOSDarwin())
6493 return new DarwinARMTargetInfo(Triple);
6494
6495 switch (os) {
6496 case llvm::Triple::Linux:
6497 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6498 case llvm::Triple::FreeBSD:
6499 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6500 case llvm::Triple::NetBSD:
6501 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6502 case llvm::Triple::OpenBSD:
6503 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6504 case llvm::Triple::Bitrig:
6505 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6506 case llvm::Triple::RTEMS:
6507 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6508 case llvm::Triple::NaCl:
6509 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6510 default:
6511 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006512 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006513
Daniel Dunbar52322032009-08-18 05:47:58 +00006514 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006515 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006516
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006517 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006518 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006519 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006520 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006521 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006522 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006523 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006524 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006525 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006526 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006527 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006528 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006529 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006530
6531 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006532 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006533 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006534 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006535 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006537 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006538 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006539 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006540 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006541 case llvm::Triple::NaCl:
6542 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006543 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006544 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006545 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006546
Akira Hatanakabef17452011-09-20 19:21:49 +00006547 case llvm::Triple::mips64:
6548 switch (os) {
6549 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006550 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006551 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006552 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006553 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006554 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006555 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006556 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006557 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006558 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006559 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006560 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006561 }
6562
6563 case llvm::Triple::mips64el:
6564 switch (os) {
6565 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006566 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006567 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006568 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006569 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006570 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006571 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006572 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006573 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006574 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006575 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006576 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006577 }
6578
Ivan Krasindd7403e2011-08-24 20:22:22 +00006579 case llvm::Triple::le32:
6580 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006581 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006582 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006583 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006584 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006585 }
6586
JF Bastien643817d2014-09-12 17:52:47 +00006587 case llvm::Triple::le64:
6588 return new Le64TargetInfo(Triple);
6589
Daniel Dunbar52322032009-08-18 05:47:58 +00006590 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006591 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006592 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006593 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006594 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006595 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006596 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006597 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006598 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006599 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006600 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006601 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006602 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006603 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006604 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006605 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006606 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006607
6608 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006609 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006610 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006611 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006612 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006613 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006614 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006615 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006616 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006617 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006618 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006619 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006620 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006621 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006622 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006623
Bill Schmidt778d3872013-07-26 01:36:11 +00006624 case llvm::Triple::ppc64le:
6625 switch (os) {
6626 case llvm::Triple::Linux:
6627 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6628 default:
6629 return new PPC64TargetInfo(Triple);
6630 }
6631
Peter Collingbournec947aae2012-05-20 23:28:41 +00006632 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006633 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006634 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006635 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006636
Eli Friedmand13b41e2012-10-12 23:32:00 +00006637 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006638 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006639
Daniel Dunbar52322032009-08-18 05:47:58 +00006640 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006641 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006642 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006643 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006644 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006646 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006647 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006648 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006649 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006650 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006651 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006652 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006653 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006654 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006655
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006656 case llvm::Triple::sparcv9:
6657 switch (os) {
6658 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006659 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006660 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006661 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006662 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006663 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006664 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006665 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006666 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006668 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006669 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006670 }
6671
Ulrich Weigand47445072013-05-06 16:26:41 +00006672 case llvm::Triple::systemz:
6673 switch (os) {
6674 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006676 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006677 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006678 }
6679
Eli Friedmana9c3d712009-08-19 20:47:07 +00006680 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006681 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006682
Daniel Dunbar52322032009-08-18 05:47:58 +00006683 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006684 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006686
Daniel Dunbar52322032009-08-18 05:47:58 +00006687 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006688 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006689 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006690 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006691 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006692 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006693 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006694 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006695 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006696 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006697 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006698 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006699 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006700 case llvm::Triple::KFreeBSD:
6701 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006702 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006703 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006704 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006705 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006706 case llvm::Triple::Win32: {
6707 switch (Triple.getEnvironment()) {
6708 default:
6709 return new X86_32TargetInfo(Triple);
6710 case llvm::Triple::Cygnus:
6711 return new CygwinX86_32TargetInfo(Triple);
6712 case llvm::Triple::GNU:
6713 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006714 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006715 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006716 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006717 }
6718 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006719 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006720 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006721 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006722 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006723 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006724 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006725 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006726 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006727 }
6728
6729 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006730 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006732
Daniel Dunbar52322032009-08-18 05:47:58 +00006733 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006734 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006736 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006737 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006738 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006739 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006740 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006741 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006742 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006743 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006744 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006745 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006746 case llvm::Triple::KFreeBSD:
6747 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006748 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006750 case llvm::Triple::Win32: {
6751 switch (Triple.getEnvironment()) {
6752 default:
6753 return new X86_64TargetInfo(Triple);
6754 case llvm::Triple::GNU:
6755 return new MinGWX86_64TargetInfo(Triple);
6756 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006757 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006758 }
6759 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006760 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006761 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006762 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006764 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006765
6766 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006767 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006768 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006769 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006770 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006771 }
6772 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006773 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006774 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006775 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006776 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006777 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006778 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006779}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006780
6781/// CreateTargetInfo - Return the target info object for the specified target
6782/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006783TargetInfo *
6784TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6785 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006786 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006787
6788 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006789 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006790 if (!Target) {
6791 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006792 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006793 }
Alp Toker80758082014-07-06 05:26:44 +00006794 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006795
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006796 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006797 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6798 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006799 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006800 }
6801
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006802 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006803 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6804 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006805 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006806 }
6807
Rafael Espindolaeb265472013-08-21 21:59:03 +00006808 // Set the fp math unit.
6809 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6810 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006811 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006812 }
6813
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006814 // Compute the default target features, we need the target to handle this
6815 // because features may have dependencies on one another.
6816 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006817 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006818
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006819 // Apply the user specified deltas.
6820 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6821 I < N; ++I) {
6822 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006823 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006824 bool Enabled = Name[0] == '+';
6825 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006826 }
6827
6828 // Add the features to the compile options.
6829 //
6830 // FIXME: If we are completely confident that we have the right set, we only
6831 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006832 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006833 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6834 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006835 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006836 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006837 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006838
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006839 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006840}