blob: c88fed13c3d199299ed2a1ede564524c6beba6e1 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-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 Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikove7772382009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek38591a22007-12-12 18:05:32 +000011// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerddae7102008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carrutha088d5b2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedmand4011892008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Daniel Dunbar0433a022009-08-19 20:04:03 +000024#include "llvm/ADT/StringRef.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000025#include "llvm/ADT/StringSwitch.h"
Chris Lattnerf54f2212009-08-12 06:24:27 +000026#include "llvm/ADT/Triple.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000027#include "llvm/IR/Type.h"
Chris Lattner43954312009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerf8a85782010-01-09 18:20:57 +000030#include <algorithm>
Stephen Hines651f13c2014-04-23 16:59:28 -070031#include <memory>
Chris Lattner4b009652007-07-25 00:24:17 +000032using namespace clang;
33
Chris Lattner4b009652007-07-25 00:24:17 +000034//===----------------------------------------------------------------------===//
35// Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
Chris Lattnerc345a802009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner5f9e2722011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattnerc345a802009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikove7772382009-05-03 13:42:53 +000044
Chris Lattnerc345a802009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000049
Chris Lattnerc345a802009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000052
Chris Lattnerc345a802009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerc345a802009-03-20 16:06:38 +000055}
56
Benjamin Kramer448f68d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattnerbd00eb82008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner43954312009-08-10 19:03:04 +000068
Edwin Török36565e52009-06-30 17:10:35 +000069namespace {
Douglas Gregor937331f2009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Edwin Török36565e52009-06-30 17:10:35 +000072protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Edwin Török36565e52009-06-30 17:10:35 +000075public:
Benjamin Kramer9df08232013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -070077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Edwin Török2d98f9f2009-06-30 17:00:25 +000081 }
Edwin Török36565e52009-06-30 17:10:35 +000082
83};
Chris Lattnerf54f2212009-08-12 06:24:27 +000084} // end anonymous namespace
Edwin Török2d98f9f2009-06-30 17:00:25 +000085
Chris Lattner43954312009-08-10 19:03:04 +000086
Daniel Dunbareab96a22010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilsond588f5c2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenko087c65f2012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Will Dietz4f45bc02013-01-18 11:30:38 +000096 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikove7772382009-05-03 13:42:53 +000097
John McCall098df7f2011-06-16 00:03:19 +000098 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +000099 // __weak is always defined, for use in blocks and with objc pointers.
100 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000101
John McCallf85e1932011-06-15 23:02:42 +0000102 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000103 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000104 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105 else
106 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000107
John McCallf85e1932011-06-15 23:02:42 +0000108 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109 // allow this in C, since one might have block pointers in structs that
110 // are used in pure C code and in Objective-C ARC.
111 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000112 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000113
Eli Friedmaneff0a422009-06-04 23:00:29 +0000114 if (Opts.Static)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000115 Builder.defineMacro("__STATIC__");
Eli Friedmaneff0a422009-06-04 23:00:29 +0000116 else
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000117 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000118
119 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000120 Builder.defineMacro("_REENTRANT");
Daniel Dunbar93f64532009-04-10 19:52:24 +0000121
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000122 // Get the platform type and version number from the triple.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000123 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000124 if (Triple.isMacOSX()) {
125 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000126 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000127 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000128 Triple.getOSVersion(Maj, Min, Rev);
129 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000130 }
Daniel Dunbareab96a22010-01-26 01:44:04 +0000131
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000132 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000133 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000134 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135 if (PlatformName == "win32") {
136 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137 return;
138 }
139
Stephen Hines651f13c2014-04-23 16:59:28 -0700140 // Set the appropriate OS version define.
141 if (Triple.isiOS()) {
142 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
151 Str);
152 } else if (Triple.isMacOSX()) {
153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
157 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[5];
159 Str[0] = '0' + (Maj / 10);
160 Str[1] = '0' + (Maj % 10);
161 Str[2] = '0' + std::min(Min, 9U);
162 Str[3] = '0' + std::min(Rev, 9U);
163 Str[4] = '\0';
164 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000165 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000166
Stephen Hines651f13c2014-04-23 16:59:28 -0700167 // Tell users about the kernel if there is one.
168 if (Triple.isOSDarwin())
169 Builder.defineMacro("__MACH__");
170
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000171 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman872996c2008-08-20 02:34:37 +0000172}
Chris Lattner4b009652007-07-25 00:24:17 +0000173
Chris Lattner43954312009-08-10 19:03:04 +0000174namespace {
Edwin Török36565e52009-06-30 17:10:35 +0000175template<typename Target>
176class DarwinTargetInfo : public OSTargetInfo<Target> {
177protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700178 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
179 MacroBuilder &Builder) const override {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000180 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000181 this->PlatformMinVersion);
Edwin Török36565e52009-06-30 17:10:35 +0000182 }
Mike Stump25cf7602009-09-09 15:08:12 +0000183
Edwin Török36565e52009-06-30 17:10:35 +0000184public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000185 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
186 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
187 this->MCountName = "\01mcount";
188 }
Edwin Török36565e52009-06-30 17:10:35 +0000189
Stephen Hines651f13c2014-04-23 16:59:28 -0700190 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner43954312009-08-10 19:03:04 +0000191 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000192 StringRef Segment, Section;
Chris Lattner43954312009-08-10 19:03:04 +0000193 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000194 bool HasTAA;
Chris Lattner43954312009-08-10 19:03:04 +0000195 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000196 TAA, HasTAA, StubSize);
Chris Lattner43954312009-08-10 19:03:04 +0000197 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000198
Stephen Hines651f13c2014-04-23 16:59:28 -0700199 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson608b5792010-06-08 22:47:50 +0000200 // FIXME: We should return 0 when building kexts.
201 return "__TEXT,__StaticInit,regular,pure_instructions";
202 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000203
John McCall41887602012-01-29 01:20:30 +0000204 /// Darwin does not support protected visibility. Darwin's "default"
205 /// is very similar to ELF's "protected"; Darwin requires a "weak"
206 /// attribute on declarations that can be dynamically replaced.
Stephen Hines651f13c2014-04-23 16:59:28 -0700207 bool hasProtectedVisibility() const override {
John McCall41887602012-01-29 01:20:30 +0000208 return false;
209 }
Edwin Török36565e52009-06-30 17:10:35 +0000210};
211
Chris Lattner43954312009-08-10 19:03:04 +0000212
Edwin Török36565e52009-06-30 17:10:35 +0000213// DragonFlyBSD Target
214template<typename Target>
215class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
216protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700217 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
218 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000219 // DragonFly defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000220 Builder.defineMacro("__DragonFly__");
221 Builder.defineMacro("__DragonFly_cc_version", "100001");
222 Builder.defineMacro("__ELF__");
223 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
224 Builder.defineMacro("__tune_i386__");
225 DefineStd(Builder, "unix", Opts);
Edwin Török36565e52009-06-30 17:10:35 +0000226 }
227public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000228 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
229 : OSTargetInfo<Target>(Triple) {
230 this->UserLabelPrefix = "";
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000231
Benjamin Kramer9df08232013-06-29 16:37:14 +0000232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000239 }
Edwin Török36565e52009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700246 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer474202f2011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Edwin Török36565e52009-06-30 17:10:35 +0000253
Benjamin Kramer474202f2011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Ed Schouten5ada7a52013-09-29 07:54:52 +0000259
260 // On FreeBSD, wchar_t contains the number of the code point as
261 // used by the character set of the locale. These character sets are
262 // not necessarily a superset of ASCII.
263 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Edwin Török36565e52009-06-30 17:10:35 +0000264 }
265public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000266 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
267 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000268
Benjamin Kramer9df08232013-06-29 16:37:14 +0000269 switch (Triple.getArch()) {
270 default:
271 case llvm::Triple::x86:
272 case llvm::Triple::x86_64:
273 this->MCountName = ".mcount";
274 break;
275 case llvm::Triple::mips:
276 case llvm::Triple::mipsel:
277 case llvm::Triple::ppc:
278 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000279 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000280 this->MCountName = "_mcount";
281 break;
282 case llvm::Triple::arm:
283 this->MCountName = "__mcount";
284 break;
Duncan Sandscd2cb662009-07-08 13:55:08 +0000285 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000286 }
Edwin Török36565e52009-06-30 17:10:35 +0000287};
288
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000289// GNU/kFreeBSD Target
290template<typename Target>
291class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
292protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700293 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
294 MacroBuilder &Builder) const override {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000295 // GNU/kFreeBSD defines; list based off of gcc output
296
297 DefineStd(Builder, "unix", Opts);
298 Builder.defineMacro("__FreeBSD_kernel__");
299 Builder.defineMacro("__GLIBC__");
300 Builder.defineMacro("__ELF__");
301 if (Opts.POSIXThreads)
302 Builder.defineMacro("_REENTRANT");
303 if (Opts.CPlusPlus)
304 Builder.defineMacro("_GNU_SOURCE");
305 }
306public:
Sylvestre Ledrudeb77992013-09-05 13:58:07 +0000307 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000308 this->UserLabelPrefix = "";
309 }
310};
311
Chris Lattner6f4bed52010-07-07 16:01:42 +0000312// Minix Target
313template<typename Target>
314class MinixTargetInfo : public OSTargetInfo<Target> {
315protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700316 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
317 MacroBuilder &Builder) const override {
Chris Lattner6f4bed52010-07-07 16:01:42 +0000318 // Minix defines
319
320 Builder.defineMacro("__minix", "3");
321 Builder.defineMacro("_EM_WSIZE", "4");
322 Builder.defineMacro("_EM_PSIZE", "4");
323 Builder.defineMacro("_EM_SSIZE", "2");
324 Builder.defineMacro("_EM_LSIZE", "4");
325 Builder.defineMacro("_EM_FSIZE", "4");
326 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000327 Builder.defineMacro("__ELF__");
Chris Lattner6f4bed52010-07-07 16:01:42 +0000328 DefineStd(Builder, "unix", Opts);
329 }
330public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000331 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
332 this->UserLabelPrefix = "";
333 }
Chris Lattner6f4bed52010-07-07 16:01:42 +0000334};
335
Edwin Török36565e52009-06-30 17:10:35 +0000336// Linux target
337template<typename Target>
338class LinuxTargetInfo : public OSTargetInfo<Target> {
339protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700340 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
341 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000342 // Linux defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000343 DefineStd(Builder, "unix", Opts);
344 DefineStd(Builder, "linux", Opts);
345 Builder.defineMacro("__gnu_linux__");
346 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000347 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000348 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000349 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000350 Builder.defineMacro("_REENTRANT");
Douglas Gregor9b22a172010-04-21 05:52:38 +0000351 if (Opts.CPlusPlus)
352 Builder.defineMacro("_GNU_SOURCE");
Edwin Török36565e52009-06-30 17:10:35 +0000353 }
354public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000355 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000356 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000357 this->WIntType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700358
359 switch (Triple.getArch()) {
360 default:
361 break;
362 case llvm::Triple::ppc:
363 case llvm::Triple::ppc64:
364 case llvm::Triple::ppc64le:
365 this->MCountName = "_mcount";
366 break;
367 }
Edwin Török36565e52009-06-30 17:10:35 +0000368 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000369
Stephen Hines651f13c2014-04-23 16:59:28 -0700370 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000371 return ".text.startup";
372 }
Edwin Török36565e52009-06-30 17:10:35 +0000373};
374
Chris Lattner25fff082009-07-13 20:29:08 +0000375// NetBSD Target
376template<typename Target>
377class NetBSDTargetInfo : public OSTargetInfo<Target> {
378protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Chris Lattner25fff082009-07-13 20:29:08 +0000381 // NetBSD defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000382 Builder.defineMacro("__NetBSD__");
383 Builder.defineMacro("__unix__");
384 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000385 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000386 Builder.defineMacro("_POSIX_THREADS");
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700387
388 switch (Triple.getArch()) {
389 default:
390 break;
391 case llvm::Triple::arm:
392 case llvm::Triple::armeb:
393 case llvm::Triple::thumb:
394 case llvm::Triple::thumbeb:
395 Builder.defineMacro("__ARM_DWARF_EH__");
396 break;
397 }
Chris Lattner25fff082009-07-13 20:29:08 +0000398 }
399public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000400 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
401 this->UserLabelPrefix = "";
402 }
Chris Lattner25fff082009-07-13 20:29:08 +0000403};
404
Edwin Török36565e52009-06-30 17:10:35 +0000405// OpenBSD Target
406template<typename Target>
407class OpenBSDTargetInfo : public OSTargetInfo<Target> {
408protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000411 // OpenBSD defines; list based off of gcc output
412
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000413 Builder.defineMacro("__OpenBSD__");
414 DefineStd(Builder, "unix", Opts);
415 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000416 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000417 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000418 }
419public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000420 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000423
Eli Friedman62d829a2011-12-15 02:15:56 +0000424 switch (Triple.getArch()) {
425 default:
426 case llvm::Triple::x86:
427 case llvm::Triple::x86_64:
428 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000429 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000430 this->MCountName = "__mcount";
431 break;
432 case llvm::Triple::mips64:
433 case llvm::Triple::mips64el:
434 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000435 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000436 this->MCountName = "_mcount";
437 break;
438 }
439 }
Edwin Török36565e52009-06-30 17:10:35 +0000440};
441
Eli Friedman42f74f22012-08-08 23:57:20 +0000442// Bitrig Target
443template<typename Target>
444class BitrigTargetInfo : public OSTargetInfo<Target> {
445protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700446 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
447 MacroBuilder &Builder) const override {
Eli Friedman42f74f22012-08-08 23:57:20 +0000448 // Bitrig defines; list based off of gcc output
449
450 Builder.defineMacro("__Bitrig__");
451 DefineStd(Builder, "unix", Opts);
452 Builder.defineMacro("__ELF__");
453 if (Opts.POSIXThreads)
454 Builder.defineMacro("_REENTRANT");
455 }
456public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000457 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
458 this->UserLabelPrefix = "";
Benjamin Kramer9df08232013-06-29 16:37:14 +0000459 this->MCountName = "__mcount";
Eli Friedman42f74f22012-08-08 23:57:20 +0000460 }
461};
462
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000463// PSP Target
464template<typename Target>
465class PSPTargetInfo : public OSTargetInfo<Target> {
466protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000469 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000470 Builder.defineMacro("PSP");
471 Builder.defineMacro("_PSP");
472 Builder.defineMacro("__psp__");
473 Builder.defineMacro("__ELF__");
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000474 }
475public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000476 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000477 this->UserLabelPrefix = "";
478 }
479};
480
John Thompsoned7bdbc2009-11-19 17:18:50 +0000481// PS3 PPU Target
482template<typename Target>
483class PS3PPUTargetInfo : public OSTargetInfo<Target> {
484protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700485 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
486 MacroBuilder &Builder) const override {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000487 // PS3 PPU defines.
John Thompsonfdd2fc32010-03-25 16:18:32 +0000488 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000489 Builder.defineMacro("__PPU__");
490 Builder.defineMacro("__CELLOS_LV2__");
491 Builder.defineMacro("__ELF__");
492 Builder.defineMacro("__LP32__");
John Thompson1deeb9f2010-06-24 22:44:13 +0000493 Builder.defineMacro("_ARCH_PPC64");
494 Builder.defineMacro("__powerpc64__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000495 }
496public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000497 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000498 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000499 this->LongWidth = this->LongAlign = 32;
500 this->PointerWidth = this->PointerAlign = 32;
John Thompson1deeb9f2010-06-24 22:44:13 +0000501 this->IntMaxType = TargetInfo::SignedLongLong;
502 this->UIntMaxType = TargetInfo::UnsignedLongLong;
503 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson4c3bd3f2009-12-18 14:21:08 +0000504 this->SizeType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700505 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsoned7bdbc2009-11-19 17:18:50 +0000506 }
507};
508
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +0000509// AuroraUX target
510template<typename Target>
511class AuroraUXTargetInfo : public OSTargetInfo<Target> {
512protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700513 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
514 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000515 DefineStd(Builder, "sun", Opts);
516 DefineStd(Builder, "unix", Opts);
517 Builder.defineMacro("__ELF__");
518 Builder.defineMacro("__svr4__");
519 Builder.defineMacro("__SVR4");
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +0000520 }
521public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000522 AuroraUXTargetInfo(const llvm::Triple &Triple)
523 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +0000524 this->UserLabelPrefix = "";
525 this->WCharType = this->SignedLong;
526 // FIXME: WIntType should be SignedLong
527 }
528};
529
Edwin Török36565e52009-06-30 17:10:35 +0000530// Solaris target
531template<typename Target>
532class SolarisTargetInfo : public OSTargetInfo<Target> {
533protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700534 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
535 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000536 DefineStd(Builder, "sun", Opts);
537 DefineStd(Builder, "unix", Opts);
538 Builder.defineMacro("__ELF__");
539 Builder.defineMacro("__svr4__");
540 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000541 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
542 // newer, but to 500 for everything else. feature_test.h has a check to
543 // ensure that you are not using C99 with an old version of X/Open or C89
544 // with a new version.
545 if (Opts.C99 || Opts.C11)
546 Builder.defineMacro("_XOPEN_SOURCE", "600");
547 else
548 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000549 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000550 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000551 Builder.defineMacro("_LARGEFILE_SOURCE");
552 Builder.defineMacro("_LARGEFILE64_SOURCE");
553 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000554 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000555 }
556public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000557 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000558 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000559 this->WCharType = this->SignedInt;
Edwin Török36565e52009-06-30 17:10:35 +0000560 // FIXME: WIntType should be SignedLong
561 }
562};
Michael J. Spencer01e70082010-10-21 05:21:48 +0000563
564// Windows target
565template<typename Target>
566class WindowsTargetInfo : public OSTargetInfo<Target> {
567protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700568 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
569 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000570 Builder.defineMacro("_WIN32");
571 }
572 void getVisualStudioDefines(const LangOptions &Opts,
573 MacroBuilder &Builder) const {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000574 if (Opts.CPlusPlus) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700575 if (Opts.RTTIData)
Michael J. Spencer01e70082010-10-21 05:21:48 +0000576 Builder.defineMacro("_CPPRTTI");
577
578 if (Opts.Exceptions)
579 Builder.defineMacro("_CPPUNWIND");
580 }
581
582 if (!Opts.CharIsSigned)
583 Builder.defineMacro("_CHAR_UNSIGNED");
584
585 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
586 // but it works for now.
587 if (Opts.POSIXThreads)
588 Builder.defineMacro("_MT");
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000589
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700590 if (Opts.MSCVersion != 0) {
591 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion / 100000));
592 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCVersion));
593 // FIXME We cannot encode the revision information into 32-bits
594 Builder.defineMacro("_MSC_BUILD", Twine(1));
595 }
Michael J. Spencer01e70082010-10-21 05:21:48 +0000596
Francois Pichet62ec1f22011-09-17 17:15:52 +0000597 if (Opts.MicrosoftExt) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000598 Builder.defineMacro("_MSC_EXTENSIONS");
599
Richard Smith80ad52f2013-01-02 11:42:31 +0000600 if (Opts.CPlusPlus11) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000601 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
602 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
603 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
604 }
605 }
606
607 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer01e70082010-10-21 05:21:48 +0000608 }
609
Michael J. Spencer01e70082010-10-21 05:21:48 +0000610public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000611 WindowsTargetInfo(const llvm::Triple &Triple)
612 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer01e70082010-10-21 05:21:48 +0000613};
614
Derek Schuff7da46f92012-10-11 16:55:58 +0000615template <typename Target>
616class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000617protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700618 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
619 MacroBuilder &Builder) const override {
Derek Schuff7da46f92012-10-11 16:55:58 +0000620 if (Opts.POSIXThreads)
621 Builder.defineMacro("_REENTRANT");
622 if (Opts.CPlusPlus)
623 Builder.defineMacro("_GNU_SOURCE");
624
625 DefineStd(Builder, "unix", Opts);
626 Builder.defineMacro("__ELF__");
627 Builder.defineMacro("__native_client__");
628 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000629
630public:
631 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000632 this->UserLabelPrefix = "";
633 this->LongAlign = 32;
634 this->LongWidth = 32;
635 this->PointerAlign = 32;
636 this->PointerWidth = 32;
637 this->IntMaxType = TargetInfo::SignedLongLong;
638 this->UIntMaxType = TargetInfo::UnsignedLongLong;
639 this->Int64Type = TargetInfo::SignedLongLong;
640 this->DoubleAlign = 64;
641 this->LongDoubleWidth = 64;
642 this->LongDoubleAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -0700643 this->LongLongWidth = 64;
644 this->LongLongAlign = 64;
Derek Schuff7da46f92012-10-11 16:55:58 +0000645 this->SizeType = TargetInfo::UnsignedInt;
646 this->PtrDiffType = TargetInfo::SignedInt;
647 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000648 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000649 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines651f13c2014-04-23 16:59:28 -0700650 if (Triple.getArch() == llvm::Triple::arm) {
651 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
652 } else if (Triple.getArch() == llvm::Triple::x86) {
653 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
654 } else if (Triple.getArch() == llvm::Triple::x86_64) {
655 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
656 } else if (Triple.getArch() == llvm::Triple::mipsel) {
657 // Handled on mips' setDescriptionString.
658 } else {
659 assert(Triple.getArch() == llvm::Triple::le32);
660 this->DescriptionString = "e-p:32:32-i64:64";
661 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000662 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700663 typename Target::CallingConvCheckResult checkCallingConvention(
664 CallingConv CC) const override {
Derek Schuff263366f2012-10-16 22:30:41 +0000665 return CC == CC_PnaclCall ? Target::CCCR_OK :
666 Target::checkCallingConvention(CC);
667 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000668};
Mike Stump25cf7602009-09-09 15:08:12 +0000669} // end anonymous namespace.
Edwin Török36565e52009-06-30 17:10:35 +0000670
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000671//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000672// Specific target implementations.
673//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000674
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000675namespace {
676// PPC abstract base class
677class PPCTargetInfo : public TargetInfo {
678 static const Builtin::Info BuiltinInfo[];
679 static const char * const GCCRegNames[];
680 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000681 std::string CPU;
Eric Christopher16543202013-10-16 21:19:26 +0000682
683 // Target cpu features.
684 bool HasVSX;
685
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000686public:
Eric Christopher16543202013-10-16 21:19:26 +0000687 PPCTargetInfo(const llvm::Triple &Triple)
688 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000689 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000690 LongDoubleWidth = LongDoubleAlign = 128;
691 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
692 }
Eli Friedmand9389be2009-06-05 07:05:05 +0000693
Hal Finkel39d5fa12012-07-03 16:51:04 +0000694 /// \brief Flags for architecture specific defines.
695 typedef enum {
696 ArchDefineNone = 0,
697 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
698 ArchDefinePpcgr = 1 << 1,
699 ArchDefinePpcsq = 1 << 2,
700 ArchDefine440 = 1 << 3,
701 ArchDefine603 = 1 << 4,
702 ArchDefine604 = 1 << 5,
703 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000704 ArchDefinePwr5 = 1 << 7,
705 ArchDefinePwr5x = 1 << 8,
706 ArchDefinePwr6 = 1 << 9,
707 ArchDefinePwr6x = 1 << 10,
708 ArchDefinePwr7 = 1 << 11,
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700709 ArchDefinePwr8 = 1 << 12,
710 ArchDefineA2 = 1 << 13,
711 ArchDefineA2q = 1 << 14
Hal Finkel39d5fa12012-07-03 16:51:04 +0000712 } ArchDefineTypes;
713
Bill Schmidt2821e182013-02-01 20:23:10 +0000714 // Note: GCC recognizes the following additional cpus:
715 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
716 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
717 // titan, rs64.
Stephen Hines651f13c2014-04-23 16:59:28 -0700718 bool setCPU(const std::string &Name) override {
Hal Finkel02a84272012-06-11 22:35:19 +0000719 bool CPUKnown = llvm::StringSwitch<bool>(Name)
720 .Case("generic", true)
721 .Case("440", true)
722 .Case("450", true)
723 .Case("601", true)
724 .Case("602", true)
725 .Case("603", true)
726 .Case("603e", true)
727 .Case("603ev", true)
728 .Case("604", true)
729 .Case("604e", true)
730 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000731 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000732 .Case("g3", true)
733 .Case("7400", true)
734 .Case("g4", true)
735 .Case("7450", true)
736 .Case("g4+", true)
737 .Case("750", true)
738 .Case("970", true)
739 .Case("g5", true)
740 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000741 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000742 .Case("e500mc", true)
743 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000744 .Case("power3", true)
745 .Case("pwr3", true)
746 .Case("power4", true)
747 .Case("pwr4", true)
748 .Case("power5", true)
749 .Case("pwr5", true)
750 .Case("power5x", true)
751 .Case("pwr5x", true)
752 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000753 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000754 .Case("power6x", true)
755 .Case("pwr6x", true)
756 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000757 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700758 .Case("power8", true)
759 .Case("pwr8", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000760 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000761 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000762 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000763 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000764 .Case("powerpc64le", true)
765 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000766 .Default(false);
767
768 if (CPUKnown)
769 CPU = Name;
770
771 return CPUKnown;
772 }
773
Stephen Hines651f13c2014-04-23 16:59:28 -0700774 void getTargetBuiltins(const Builtin::Info *&Records,
775 unsigned &NumRecords) const override {
Chris Lattner4b009652007-07-25 00:24:17 +0000776 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000777 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000778 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000779
Stephen Hines651f13c2014-04-23 16:59:28 -0700780 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000781
Stephen Hines651f13c2014-04-23 16:59:28 -0700782 void getTargetDefines(const LangOptions &Opts,
783 MacroBuilder &Builder) const override;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000784
Stephen Hines651f13c2014-04-23 16:59:28 -0700785 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt199402b2013-02-01 02:14:03 +0000786
Stephen Hines651f13c2014-04-23 16:59:28 -0700787 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 Carlsson36834a72009-02-28 17:11:49 +0000797 switch (*Name) {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000798 default: return false;
799 case 'O': // Zero
John Thompson1deeb9f2010-06-24 22:44:13 +0000800 break;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000801 case 'b': // Base register
802 case 'f': // Floating point register
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000803 Info.setAllowsRegister();
John Thompson1deeb9f2010-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. Spencerd5513a32010-10-21 03:16:25 +0000808 case 'd': // Floating point register (containing 64-bit value)
John Thompson1deeb9f2010-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. Spencerd5513a32010-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
Stephen Hines651f13c2014-04-23 16:59:28 -0700818 case 'c':// An individual CR bit
John Thompson1deeb9f2010-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. Spencerd5513a32010-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 Thompson1deeb9f2010-06-24 22:44:13 +0000833 Info.setAllowsRegister();
834 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000835 case 'I': // Signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000836 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencerd5513a32010-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 Thompson1deeb9f2010-06-24 22:44:13 +0000843 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000844 // register with one instruction per word
John Thompson1deeb9f2010-06-24 22:44:13 +0000845 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000846 // into a register using three instructions
John Thompson1deeb9f2010-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 Redl097ce222010-08-17 22:42:34 +0000853 // placeholder for the "update" flag in the corresponding
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000854 // load or store instruction. For example:
John Thompson1deeb9f2010-06-24 22:44:13 +0000855 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000856 // is correct but:
John Thompson1deeb9f2010-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. Spencerd5513a32010-10-21 03:16:25 +0000859 // register to be updated.
860 case 'e':
John Thompsone0a39472010-06-25 00:02:05 +0000861 if (Name[1] != 's')
862 return false;
Sebastian Redl097ce222010-08-17 22:42:34 +0000863 // es: A "stable" memory operand; that is, one which does not
John Thompson1deeb9f2010-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 Thompsone0a39472010-06-25 00:02:05 +0000867 // access it at all.
John Thompson1deeb9f2010-06-24 22:44:13 +0000868 Info.setAllowsMemory();
John Thompsone0a39472010-06-25 00:02:05 +0000869 Name++; // Skip over 'e'.
John Thompson1deeb9f2010-06-24 22:44:13 +0000870 break;
871 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000872 // usually better to use `m' or `es' in asm statements)
John Thompson1deeb9f2010-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. Spencerd5513a32010-10-21 03:16:25 +0000875 // asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000876 Info.setAllowsMemory();
877 Info.setAllowsRegister();
878 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000879 case 'R': // AIX TOC entry
John Thompson1deeb9f2010-06-24 22:44:13 +0000880 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencerd5513a32010-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 Thompson1deeb9f2010-06-24 22:44:13 +0000885 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencerd5513a32010-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 Thompson1deeb9f2010-06-24 22:44:13 +0000889 break;
890 // End FIXME.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000891 }
John Thompson1deeb9f2010-06-24 22:44:13 +0000892 return true;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000893 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700894 std::string convertConstraint(const char *&Constraint) const override {
895 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 }
908 const char *getClobbers() const override {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000909 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000910 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700911 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000912 if (RegNo == 0) return 3;
913 if (RegNo == 1) return 4;
914 return -1;
915 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000916};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000917
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000918const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000919#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000920#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000921 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +0000922#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000923};
Anton Korobeynikove7772382009-05-03 13:42:53 +0000924
Eric Christopher3d11ced2013-10-16 21:26:26 +0000925 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher16543202013-10-16 21:19:26 +0000926/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +0000927bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher16543202013-10-16 21:19:26 +0000928 DiagnosticsEngine &Diags) {
929 // Remember the maximum enabled sselevel.
930 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
931 // Ignore disabled features.
932 if (Features[i][0] == '-')
933 continue;
934
935 StringRef Feature = StringRef(Features[i]).substr(1);
936
937 if (Feature == "vsx") {
938 HasVSX = true;
939 continue;
940 }
941
942 // TODO: Finish this list and add an assert that we've handled them
943 // all.
944 }
945
946 return true;
947}
Anton Korobeynikove7772382009-05-03 13:42:53 +0000948
Chris Lattnerbef1d722009-03-02 22:27:17 +0000949/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
950/// #defines that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000951void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000952 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000953 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000954 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000955 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000956 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerf8030412010-02-16 18:14:57 +0000957 Builder.defineMacro("__powerpc__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000958 Builder.defineMacro("__POWERPC__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000959 if (PointerWidth == 64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000960 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerf8030412010-02-16 18:14:57 +0000961 Builder.defineMacro("__powerpc64__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000962 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000963 Builder.defineMacro("__PPC64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000964 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000965
Chris Lattnerbef1d722009-03-02 22:27:17 +0000966 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000967 if (getTriple().getArch() == llvm::Triple::ppc64le) {
968 Builder.defineMacro("_LITTLE_ENDIAN");
Stephen Hines651f13c2014-04-23 16:59:28 -0700969 Builder.defineMacro("_CALL_ELF","2");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000970 } else {
971 if (getTriple().getOS() != llvm::Triple::NetBSD &&
972 getTriple().getOS() != llvm::Triple::OpenBSD)
973 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000974 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000975
Chris Lattnerbef1d722009-03-02 22:27:17 +0000976 // Subtarget options.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000977 Builder.defineMacro("__NATURAL_ALIGNMENT__");
978 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000979
Chris Lattnerbef1d722009-03-02 22:27:17 +0000980 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +0000981 if (LongDoubleWidth == 128)
982 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000983
John Thompsoned7bdbc2009-11-19 17:18:50 +0000984 if (Opts.AltiVec) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000985 Builder.defineMacro("__VEC__", "10206");
986 Builder.defineMacro("__ALTIVEC__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000987 }
Hal Finkel02a84272012-06-11 22:35:19 +0000988
989 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000990 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
991 .Case("440", ArchDefineName)
992 .Case("450", ArchDefineName | ArchDefine440)
993 .Case("601", ArchDefineName)
994 .Case("602", ArchDefineName | ArchDefinePpcgr)
995 .Case("603", ArchDefineName | ArchDefinePpcgr)
996 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
997 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
998 .Case("604", ArchDefineName | ArchDefinePpcgr)
999 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1000 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +00001001 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001002 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1003 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1004 .Case("750", ArchDefineName | ArchDefinePpcgr)
1005 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1006 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001007 .Case("a2", ArchDefineA2)
1008 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +00001009 .Case("pwr3", ArchDefinePpcgr)
1010 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1011 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
Hal Finkel39d5fa12012-07-03 16:51:04 +00001012 | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001013 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1014 | ArchDefinePpcgr | ArchDefinePpcsq)
1015 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1016 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1017 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1018 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1019 | ArchDefinePpcsq)
1020 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1021 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001022 | ArchDefinePpcgr | ArchDefinePpcsq)
1023 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1024 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1025 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001026 .Case("power3", ArchDefinePpcgr)
1027 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1028 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1029 | ArchDefinePpcsq)
1030 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1031 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1033 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1034 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1035 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1036 | ArchDefinePpcsq)
1037 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1038 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001039 | ArchDefinePpcgr | ArchDefinePpcsq)
1040 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1041 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1042 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001043 .Default(ArchDefineNone);
1044
1045 if (defs & ArchDefineName)
1046 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1047 if (defs & ArchDefinePpcgr)
1048 Builder.defineMacro("_ARCH_PPCGR");
1049 if (defs & ArchDefinePpcsq)
1050 Builder.defineMacro("_ARCH_PPCSQ");
1051 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +00001052 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +00001053 if (defs & ArchDefine603)
1054 Builder.defineMacro("_ARCH_603");
1055 if (defs & ArchDefine604)
1056 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +00001057 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001058 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +00001059 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001060 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +00001061 if (defs & ArchDefinePwr5x)
1062 Builder.defineMacro("_ARCH_PWR5X");
1063 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +00001064 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +00001065 if (defs & ArchDefinePwr6x)
1066 Builder.defineMacro("_ARCH_PWR6X");
1067 if (defs & ArchDefinePwr7)
1068 Builder.defineMacro("_ARCH_PWR7");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001069 if (defs & ArchDefinePwr8)
1070 Builder.defineMacro("_ARCH_PWR8");
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001071 if (defs & ArchDefineA2)
1072 Builder.defineMacro("_ARCH_A2");
1073 if (defs & ArchDefineA2q) {
1074 Builder.defineMacro("_ARCH_A2Q");
1075 Builder.defineMacro("_ARCH_QP");
Hal Finkel02a84272012-06-11 22:35:19 +00001076 }
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001077
1078 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1079 Builder.defineMacro("__bg__");
1080 Builder.defineMacro("__THW_BLUEGENE__");
1081 Builder.defineMacro("__bgq__");
1082 Builder.defineMacro("__TOS_BGQ__");
1083 }
Bill Schmidt2821e182013-02-01 20:23:10 +00001084
Eric Christopher16543202013-10-16 21:19:26 +00001085 if (HasVSX)
1086 Builder.defineMacro("__VSX__");
1087
Bill Schmidt2821e182013-02-01 20:23:10 +00001088 // FIXME: The following are not yet generated here by Clang, but are
1089 // generated by GCC:
1090 //
1091 // _SOFT_FLOAT_
1092 // __RECIP_PRECISION__
1093 // __APPLE_ALTIVEC__
Bill Schmidt2821e182013-02-01 20:23:10 +00001094 // __RECIP__
1095 // __RECIPF__
1096 // __RSQRTE__
1097 // __RSQRTEF__
1098 // _SOFT_DOUBLE_
1099 // __NO_LWSYNC__
1100 // __HAVE_BSWAP__
1101 // __LONGDOUBLE128
1102 // __CMODEL_MEDIUM__
1103 // __CMODEL_LARGE__
1104 // _CALL_SYSV
1105 // _CALL_DARWIN
1106 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001107}
1108
1109void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1110 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1111 .Case("7400", true)
1112 .Case("g4", true)
1113 .Case("7450", true)
1114 .Case("g4+", true)
1115 .Case("970", true)
1116 .Case("g5", true)
1117 .Case("pwr6", true)
1118 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001119 .Case("pwr8", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001120 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001121 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001122 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001123
1124 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001125}
1126
Douglas Gregore727d212012-01-30 06:38:25 +00001127bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1128 return Feature == "powerpc";
1129}
Chris Lattner9fd73612008-04-21 18:56:49 +00001130
Douglas Gregore727d212012-01-30 06:38:25 +00001131
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001132const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattner14d2bb72009-09-16 05:05:27 +00001133 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1134 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1135 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1136 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1137 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1138 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1139 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1140 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001141 "mq", "lr", "ctr", "ap",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001142 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001143 "xer",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001144 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1145 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1146 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1147 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001148 "vrsave", "vscr",
1149 "spe_acc", "spefscr",
1150 "sfp"
1151};
Chris Lattner4b009652007-07-25 00:24:17 +00001152
Anton Korobeynikove7772382009-05-03 13:42:53 +00001153void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001154 unsigned &NumNames) const {
1155 Names = GCCRegNames;
1156 NumNames = llvm::array_lengthof(GCCRegNames);
1157}
Chris Lattner4b009652007-07-25 00:24:17 +00001158
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001159const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1160 // While some of these aliases do map to different registers
1161 // they still share the same register name.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001162 { { "0" }, "r0" },
1163 { { "1"}, "r1" },
1164 { { "2" }, "r2" },
1165 { { "3" }, "r3" },
1166 { { "4" }, "r4" },
1167 { { "5" }, "r5" },
1168 { { "6" }, "r6" },
1169 { { "7" }, "r7" },
1170 { { "8" }, "r8" },
1171 { { "9" }, "r9" },
1172 { { "10" }, "r10" },
1173 { { "11" }, "r11" },
1174 { { "12" }, "r12" },
1175 { { "13" }, "r13" },
1176 { { "14" }, "r14" },
1177 { { "15" }, "r15" },
1178 { { "16" }, "r16" },
1179 { { "17" }, "r17" },
1180 { { "18" }, "r18" },
1181 { { "19" }, "r19" },
1182 { { "20" }, "r20" },
1183 { { "21" }, "r21" },
1184 { { "22" }, "r22" },
1185 { { "23" }, "r23" },
1186 { { "24" }, "r24" },
1187 { { "25" }, "r25" },
1188 { { "26" }, "r26" },
1189 { { "27" }, "r27" },
1190 { { "28" }, "r28" },
1191 { { "29" }, "r29" },
1192 { { "30" }, "r30" },
1193 { { "31" }, "r31" },
1194 { { "fr0" }, "f0" },
1195 { { "fr1" }, "f1" },
1196 { { "fr2" }, "f2" },
1197 { { "fr3" }, "f3" },
1198 { { "fr4" }, "f4" },
1199 { { "fr5" }, "f5" },
1200 { { "fr6" }, "f6" },
1201 { { "fr7" }, "f7" },
1202 { { "fr8" }, "f8" },
1203 { { "fr9" }, "f9" },
Mike Stump369c21c2009-09-17 21:15:00 +00001204 { { "fr10" }, "f10" },
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001205 { { "fr11" }, "f11" },
1206 { { "fr12" }, "f12" },
1207 { { "fr13" }, "f13" },
1208 { { "fr14" }, "f14" },
1209 { { "fr15" }, "f15" },
1210 { { "fr16" }, "f16" },
1211 { { "fr17" }, "f17" },
1212 { { "fr18" }, "f18" },
1213 { { "fr19" }, "f19" },
1214 { { "fr20" }, "f20" },
1215 { { "fr21" }, "f21" },
1216 { { "fr22" }, "f22" },
1217 { { "fr23" }, "f23" },
1218 { { "fr24" }, "f24" },
1219 { { "fr25" }, "f25" },
1220 { { "fr26" }, "f26" },
1221 { { "fr27" }, "f27" },
1222 { { "fr28" }, "f28" },
1223 { { "fr29" }, "f29" },
1224 { { "fr30" }, "f30" },
1225 { { "fr31" }, "f31" },
1226 { { "cc" }, "cr0" },
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001227};
1228
Anton Korobeynikove7772382009-05-03 13:42:53 +00001229void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001230 unsigned &NumAliases) const {
1231 Aliases = GCCRegAliases;
1232 NumAliases = llvm::array_lengthof(GCCRegAliases);
1233}
1234} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001235
1236namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001237class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001238public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001239 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001240 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerf8030412010-02-16 18:14:57 +00001241
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001242 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001243 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001244 case llvm::Triple::FreeBSD:
1245 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001246 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001247 PtrDiffType = SignedInt;
1248 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001249 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001250 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001251 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001252 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001253
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001254 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1255 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001256 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001257 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001258
1259 // PPC32 supports atomics up to 4 bytes.
1260 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001261 }
1262
Stephen Hines651f13c2014-04-23 16:59:28 -07001263 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001264 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001265 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman2b161652008-08-21 00:13:15 +00001266 }
Chris Lattner4b009652007-07-25 00:24:17 +00001267};
1268} // end anonymous namespace.
1269
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001270// Note: ABI differences may eventually require us to have a separate
1271// TargetInfo for little endian.
Chris Lattner4b009652007-07-25 00:24:17 +00001272namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001273class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001274public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001275 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00001276 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman38e31802009-07-01 03:36:11 +00001277 IntMaxType = SignedLong;
1278 UIntMaxType = UnsignedLong;
1279 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001280
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001281 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1282 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001283 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines651f13c2014-04-23 16:59:28 -07001284 DescriptionString = "E-m:e-i64:64-n32:64";
1285 } else {
1286 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1287 DescriptionString = "e-m:e-i64:64-n32:64";
1288 } else {
1289 DescriptionString = "E-m:e-i64:64-n32:64";
1290 }
1291}
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001292
1293 // PPC64 supports atomics up to 8 bytes.
1294 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnere5fde952008-05-09 06:17:04 +00001295 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001296 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001297 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001298 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001299};
1300} // end anonymous namespace.
1301
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001302
1303namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001304class DarwinPPC32TargetInfo :
1305 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001306public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001307 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1308 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001309 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001310 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherf2174002013-10-16 21:19:19 +00001311 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001312 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001313 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001314 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001315 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001316 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001317 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001318 }
1319};
1320
1321class DarwinPPC64TargetInfo :
1322 public DarwinTargetInfo<PPC64TargetInfo> {
1323public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001324 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1325 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001326 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001327 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001328 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001329 }
1330};
1331} // end anonymous namespace.
1332
Chris Lattner4b009652007-07-25 00:24:17 +00001333namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001334 static const unsigned NVPTXAddrSpaceMap[] = {
1335 1, // opencl_global
1336 3, // opencl_local
1337 4, // opencl_constant
1338 1, // cuda_device
1339 4, // cuda_constant
1340 3, // cuda_shared
Justin Holewinski25bedca2011-10-03 17:28:37 +00001341 };
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001342 class NVPTXTargetInfo : public TargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001343 static const char * const GCCRegNames[];
1344 static const Builtin::Info BuiltinInfo[];
1345 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001346 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001347 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +00001348 TLSSupported = false;
1349 LongWidth = LongAlign = 64;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001350 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001351 UseAddrSpaceMapMangling = true;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001352 // Define available target features
Justin Holewinski2c585b92012-05-24 17:43:12 +00001353 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001354 NoAsmVariants = true;
Justin Holewinski285dc652011-04-20 19:34:15 +00001355 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001356 void getTargetDefines(const LangOptions &Opts,
1357 MacroBuilder &Builder) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001358 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001359 Builder.defineMacro("__NVPTX__");
Justin Holewinski285dc652011-04-20 19:34:15 +00001360 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001361 void getTargetBuiltins(const Builtin::Info *&Records,
1362 unsigned &NumRecords) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001363 Records = BuiltinInfo;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001364 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Justin Holewinski285dc652011-04-20 19:34:15 +00001365 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001366 bool hasFeature(StringRef Feature) const override {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001367 return Feature == "ptx" || Feature == "nvptx";
Douglas Gregore727d212012-01-30 06:38:25 +00001368 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001369
1370 void getGCCRegNames(const char * const *&Names,
1371 unsigned &NumNames) const override;
1372 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1373 unsigned &NumAliases) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001374 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001375 Aliases = nullptr;
Justin Holewinski285dc652011-04-20 19:34:15 +00001376 NumAliases = 0;
1377 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001378 bool validateAsmConstraint(const char *&Name,
1379 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001380 switch (*Name) {
1381 default: return false;
1382 case 'c':
1383 case 'h':
1384 case 'r':
1385 case 'l':
1386 case 'f':
1387 case 'd':
1388 Info.setAllowsRegister();
1389 return true;
1390 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001391 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001392 const char *getClobbers() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001393 // FIXME: Is this really right?
1394 return "";
1395 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001396 BuiltinVaListKind getBuiltinVaListKind() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001397 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001398 return TargetInfo::CharPtrBuiltinVaList;
Justin Holewinski285dc652011-04-20 19:34:15 +00001399 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001400 bool setCPU(const std::string &Name) override {
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001401 bool Valid = llvm::StringSwitch<bool>(Name)
1402 .Case("sm_20", true)
1403 .Case("sm_21", true)
1404 .Case("sm_30", true)
1405 .Case("sm_35", true)
1406 .Default(false);
1407
1408 return Valid;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001409 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001410 };
1411
Justin Holewinski2c585b92012-05-24 17:43:12 +00001412 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001413#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +00001414#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001415 ALL_LANGUAGES },
Justin Holewinski2c585b92012-05-24 17:43:12 +00001416#include "clang/Basic/BuiltinsNVPTX.def"
Justin Holewinski285dc652011-04-20 19:34:15 +00001417 };
1418
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001419 const char * const NVPTXTargetInfo::GCCRegNames[] = {
Justin Holewinski285dc652011-04-20 19:34:15 +00001420 "r0"
1421 };
1422
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001423 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
Justin Holewinski285dc652011-04-20 19:34:15 +00001424 unsigned &NumNames) const {
1425 Names = GCCRegNames;
1426 NumNames = llvm::array_lengthof(GCCRegNames);
1427 }
1428
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001429 class NVPTX32TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001430 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001431 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001432 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001433 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07001434 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001435 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001436 };
1437
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001438 class NVPTX64TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001439 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001440 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001441 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001442 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07001443 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001444 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001445 };
1446}
1447
1448namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001449
1450static const unsigned R600AddrSpaceMap[] = {
1451 1, // opencl_global
1452 3, // opencl_local
1453 2, // opencl_constant
1454 1, // cuda_device
1455 2, // cuda_constant
1456 3 // cuda_shared
1457};
1458
Tom Stellardfd075912013-03-04 17:40:53 +00001459static const char *DescriptionStringR600 =
Stephen Hines651f13c2014-04-23 16:59:28 -07001460 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1461 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001462
1463static const char *DescriptionStringR600DoubleOps =
Stephen Hines651f13c2014-04-23 16:59:28 -07001464 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1465 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001466
1467static const char *DescriptionStringSI =
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001468 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Stephen Hines651f13c2014-04-23 16:59:28 -07001469 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1470 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001471
Eli Friedman6505a292012-10-12 23:32:00 +00001472class R600TargetInfo : public TargetInfo {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001473 static const Builtin::Info BuiltinInfo[];
1474
Tom Stellardfd075912013-03-04 17:40:53 +00001475 /// \brief The GPU profiles supported by the R600 target.
1476 enum GPUKind {
1477 GK_NONE,
1478 GK_R600,
1479 GK_R600_DOUBLE_OPS,
1480 GK_R700,
1481 GK_R700_DOUBLE_OPS,
1482 GK_EVERGREEN,
1483 GK_EVERGREEN_DOUBLE_OPS,
1484 GK_NORTHERN_ISLANDS,
1485 GK_CAYMAN,
Tom Stellard42317042013-10-29 16:38:29 +00001486 GK_SOUTHERN_ISLANDS,
1487 GK_SEA_ISLANDS
Tom Stellardfd075912013-03-04 17:40:53 +00001488 } GPU;
1489
Eli Friedman6505a292012-10-12 23:32:00 +00001490public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001491 R600TargetInfo(const llvm::Triple &Triple)
1492 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardfd075912013-03-04 17:40:53 +00001493 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001494 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001495 UseAddrSpaceMapMangling = true;
Eli Friedman6505a292012-10-12 23:32:00 +00001496 }
1497
Stephen Hines651f13c2014-04-23 16:59:28 -07001498 const char * getClobbers() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001499 return "";
1500 }
1501
Stephen Hines651f13c2014-04-23 16:59:28 -07001502 void getGCCRegNames(const char * const *&Names,
1503 unsigned &numNames) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001504 Names = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001505 numNames = 0;
1506 }
1507
Stephen Hines651f13c2014-04-23 16:59:28 -07001508 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1509 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001510 Aliases = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001511 NumAliases = 0;
1512 }
1513
Stephen Hines651f13c2014-04-23 16:59:28 -07001514 bool validateAsmConstraint(const char *&Name,
1515 TargetInfo::ConstraintInfo &info) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001516 return true;
1517 }
1518
Stephen Hines651f13c2014-04-23 16:59:28 -07001519 void getTargetBuiltins(const Builtin::Info *&Records,
1520 unsigned &NumRecords) const override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001521 Records = BuiltinInfo;
1522 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedman6505a292012-10-12 23:32:00 +00001523 }
1524
Stephen Hines651f13c2014-04-23 16:59:28 -07001525 void getTargetDefines(const LangOptions &Opts,
1526 MacroBuilder &Builder) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001527 Builder.defineMacro("__R600__");
1528 }
1529
Stephen Hines651f13c2014-04-23 16:59:28 -07001530 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001531 return TargetInfo::CharPtrBuiltinVaList;
1532 }
1533
Stephen Hines651f13c2014-04-23 16:59:28 -07001534 bool setCPU(const std::string &Name) override {
Tom Stellardfd075912013-03-04 17:40:53 +00001535 GPU = llvm::StringSwitch<GPUKind>(Name)
1536 .Case("r600" , GK_R600)
1537 .Case("rv610", GK_R600)
1538 .Case("rv620", GK_R600)
1539 .Case("rv630", GK_R600)
1540 .Case("rv635", GK_R600)
1541 .Case("rs780", GK_R600)
1542 .Case("rs880", GK_R600)
1543 .Case("rv670", GK_R600_DOUBLE_OPS)
1544 .Case("rv710", GK_R700)
1545 .Case("rv730", GK_R700)
1546 .Case("rv740", GK_R700_DOUBLE_OPS)
1547 .Case("rv770", GK_R700_DOUBLE_OPS)
1548 .Case("palm", GK_EVERGREEN)
1549 .Case("cedar", GK_EVERGREEN)
1550 .Case("sumo", GK_EVERGREEN)
1551 .Case("sumo2", GK_EVERGREEN)
1552 .Case("redwood", GK_EVERGREEN)
1553 .Case("juniper", GK_EVERGREEN)
1554 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1555 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1556 .Case("barts", GK_NORTHERN_ISLANDS)
1557 .Case("turks", GK_NORTHERN_ISLANDS)
1558 .Case("caicos", GK_NORTHERN_ISLANDS)
1559 .Case("cayman", GK_CAYMAN)
1560 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001561 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001562 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1563 .Case("verde", GK_SOUTHERN_ISLANDS)
1564 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard42317042013-10-29 16:38:29 +00001565 .Case("bonaire", GK_SEA_ISLANDS)
1566 .Case("kabini", GK_SEA_ISLANDS)
1567 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard0de6bc82013-11-14 23:45:53 +00001568 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001569 .Default(GK_NONE);
1570
1571 if (GPU == GK_NONE) {
1572 return false;
1573 }
1574
1575 // Set the correct data layout
1576 switch (GPU) {
1577 case GK_NONE:
1578 case GK_R600:
1579 case GK_R700:
1580 case GK_EVERGREEN:
1581 case GK_NORTHERN_ISLANDS:
1582 DescriptionString = DescriptionStringR600;
1583 break;
1584 case GK_R600_DOUBLE_OPS:
1585 case GK_R700_DOUBLE_OPS:
1586 case GK_EVERGREEN_DOUBLE_OPS:
1587 case GK_CAYMAN:
1588 DescriptionString = DescriptionStringR600DoubleOps;
1589 break;
1590 case GK_SOUTHERN_ISLANDS:
Tom Stellard42317042013-10-29 16:38:29 +00001591 case GK_SEA_ISLANDS:
Tom Stellardfd075912013-03-04 17:40:53 +00001592 DescriptionString = DescriptionStringSI;
1593 break;
1594 }
1595
1596 return true;
1597 }
Eli Friedman6505a292012-10-12 23:32:00 +00001598};
1599
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001600const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1601#define BUILTIN(ID, TYPE, ATTRS) \
1602 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1603#include "clang/Basic/BuiltinsR600.def"
1604};
1605
Eli Friedman6505a292012-10-12 23:32:00 +00001606} // end anonymous namespace
1607
1608namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001609// Namespace for x86 abstract base class
1610const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001611#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001612#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001613 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +00001614#include "clang/Basic/BuiltinsX86.def"
Eli Friedman872996c2008-08-20 02:34:37 +00001615};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001616
Nuno Lopesad1010d2009-12-23 17:49:57 +00001617static const char* const GCCRegNames[] = {
Eli Friedman872996c2008-08-20 02:34:37 +00001618 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1619 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001620 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman872996c2008-08-20 02:34:37 +00001621 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1622 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1623 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001624 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001625 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1626 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman872996c2008-08-20 02:34:37 +00001627};
1628
Eric Christophercfd323d2011-06-21 00:05:20 +00001629const TargetInfo::AddlRegName AddlRegNames[] = {
1630 { { "al", "ah", "eax", "rax" }, 0 },
1631 { { "bl", "bh", "ebx", "rbx" }, 3 },
1632 { { "cl", "ch", "ecx", "rcx" }, 2 },
1633 { { "dl", "dh", "edx", "rdx" }, 1 },
1634 { { "esi", "rsi" }, 4 },
1635 { { "edi", "rdi" }, 5 },
1636 { { "esp", "rsp" }, 7 },
1637 { { "ebp", "rbp" }, 6 },
Eli Friedman872996c2008-08-20 02:34:37 +00001638};
1639
1640// X86 target abstract base class; x86-32 and x86-64 are very close, so
1641// most of the implementation can be shared.
1642class X86TargetInfo : public TargetInfo {
Chris Lattner715fe4c2009-03-02 22:40:39 +00001643 enum X86SSEEnum {
Craig Topperb7a95d22013-08-21 03:59:22 +00001644 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner715fe4c2009-03-02 22:40:39 +00001645 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001646 enum MMX3DNowEnum {
1647 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1648 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001649 enum XOPEnum {
1650 NoXOP,
1651 SSE4A,
1652 FMA4,
1653 XOP
1654 } XOPLevel;
Anders Carlssone5e222f2010-01-27 03:47:49 +00001655
Eric Christopher6c4e7872010-04-02 23:50:19 +00001656 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001657 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001658 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001659 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001660 bool HasBMI;
1661 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001662 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001663 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001664 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001665 bool HasRDSEED;
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001666 bool HasTBM;
Craig Topper2ae95072012-06-03 21:46:30 +00001667 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001668 bool HasF16C;
Craig Topperbca2c4f2013-08-21 05:29:10 +00001669 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuirb83f5a72013-09-19 13:22:04 +00001670 bool HasSHA;
Nick Lewyckyaf945462013-10-05 20:14:27 +00001671 bool HasCX16;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001672
Chandler Carruth499d9722011-09-28 08:55:34 +00001673 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1674 ///
1675 /// Each enumeration represents a particular CPU supported by Clang. These
1676 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1677 enum CPUKind {
1678 CK_Generic,
1679
1680 /// \name i386
1681 /// i386-generation processors.
1682 //@{
1683 CK_i386,
1684 //@}
1685
1686 /// \name i486
1687 /// i486-generation processors.
1688 //@{
1689 CK_i486,
1690 CK_WinChipC6,
1691 CK_WinChip2,
1692 CK_C3,
1693 //@}
1694
1695 /// \name i586
1696 /// i586-generation processors, P5 microarchitecture based.
1697 //@{
1698 CK_i586,
1699 CK_Pentium,
1700 CK_PentiumMMX,
1701 //@}
1702
1703 /// \name i686
1704 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1705 //@{
1706 CK_i686,
1707 CK_PentiumPro,
1708 CK_Pentium2,
1709 CK_Pentium3,
1710 CK_Pentium3M,
1711 CK_PentiumM,
1712 CK_C3_2,
1713
1714 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1715 /// Clang however has some logic to suport this.
1716 // FIXME: Warn, deprecate, and potentially remove this.
1717 CK_Yonah,
1718 //@}
1719
1720 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001721 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001722 //@{
1723 CK_Pentium4,
1724 CK_Pentium4M,
1725 CK_Prescott,
1726 CK_Nocona,
1727 //@}
1728
1729 /// \name Core
1730 /// Core microarchitecture based processors.
1731 //@{
1732 CK_Core2,
1733
1734 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1735 /// codename which GCC no longer accepts as an option to -march, but Clang
1736 /// has some logic for recognizing it.
1737 // FIXME: Warn, deprecate, and potentially remove this.
1738 CK_Penryn,
1739 //@}
1740
1741 /// \name Atom
1742 /// Atom processors
1743 //@{
1744 CK_Atom,
Preston Gurdc57ea682013-09-13 19:27:17 +00001745 CK_Silvermont,
Chandler Carruth499d9722011-09-28 08:55:34 +00001746 //@}
1747
1748 /// \name Nehalem
1749 /// Nehalem microarchitecture based processors.
1750 //@{
1751 CK_Corei7,
1752 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001753 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001754 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001755 //@}
1756
Craig Topper10c2c682013-08-20 07:09:39 +00001757 /// \name Knights Landing
1758 /// Knights Landing processor.
1759 CK_KNL,
1760
Chandler Carruth499d9722011-09-28 08:55:34 +00001761 /// \name K6
1762 /// K6 architecture processors.
1763 //@{
1764 CK_K6,
1765 CK_K6_2,
1766 CK_K6_3,
1767 //@}
1768
1769 /// \name K7
1770 /// K7 architecture processors.
1771 //@{
1772 CK_Athlon,
1773 CK_AthlonThunderbird,
1774 CK_Athlon4,
1775 CK_AthlonXP,
1776 CK_AthlonMP,
1777 //@}
1778
1779 /// \name K8
1780 /// K8 architecture processors.
1781 //@{
1782 CK_Athlon64,
1783 CK_Athlon64SSE3,
1784 CK_AthlonFX,
1785 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001786 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001787 CK_Opteron,
1788 CK_OpteronSSE3,
Roman Divackyf051cde2011-10-30 07:48:46 +00001789 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001790 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001791
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001792 /// \name Bobcat
1793 /// Bobcat architecture processors.
1794 //@{
1795 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00001796 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001797 //@}
1798
1799 /// \name Bulldozer
1800 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001801 //@{
1802 CK_BDVER1,
1803 CK_BDVER2,
Benjamin Kramera2420962013-11-04 10:29:51 +00001804 CK_BDVER3,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001805 CK_BDVER4,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001806 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001807
Chandler Carruth499d9722011-09-28 08:55:34 +00001808 /// This specification is deprecated and will be removed in the future.
1809 /// Users should prefer \see CK_K8.
1810 // FIXME: Warn on this when the CPU is set to it.
1811 CK_x86_64,
1812 //@}
1813
1814 /// \name Geode
1815 /// Geode processors.
1816 //@{
1817 CK_Geode
1818 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001819 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001820
Rafael Espindola5389b842013-08-21 21:59:03 +00001821 enum FPMathKind {
1822 FP_Default,
1823 FP_SSE,
1824 FP_387
1825 } FPMath;
1826
Eli Friedman872996c2008-08-20 02:34:37 +00001827public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001828 X86TargetInfo(const llvm::Triple &Triple)
1829 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001830 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1831 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001832 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1833 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewyckyaf945462013-10-05 20:14:27 +00001834 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1835 FPMath(FP_Default) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001836 BigEndian = false;
Eli Friedman872996c2008-08-20 02:34:37 +00001837 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +00001838 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001839 unsigned getFloatEvalMethod() const override {
Benjamin Kramerb4066692011-12-28 15:47:06 +00001840 // X87 evaluates with 80 bits "long double" precision.
1841 return SSELevel == NoSSE ? 2 : 0;
1842 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001843 void getTargetBuiltins(const Builtin::Info *&Records,
1844 unsigned &NumRecords) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001845 Records = BuiltinInfo;
1846 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +00001847 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001848 void getGCCRegNames(const char * const *&Names,
1849 unsigned &NumNames) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001850 Names = GCCRegNames;
1851 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001852 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001853 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1854 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001855 Aliases = nullptr;
Eric Christophercfd323d2011-06-21 00:05:20 +00001856 NumAliases = 0;
1857 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001858 void getGCCAddlRegNames(const AddlRegName *&Names,
1859 unsigned &NumNames) const override {
Eric Christophercfd323d2011-06-21 00:05:20 +00001860 Names = AddlRegNames;
1861 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00001862 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001863 bool validateAsmConstraint(const char *&Name,
1864 TargetInfo::ConstraintInfo &info) const override;
1865 std::string convertConstraint(const char *&Constraint) const override;
1866 const char *getClobbers() const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001867 return "~{dirflag},~{fpsr},~{flags}";
1868 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001869 void getTargetDefines(const LangOptions &Opts,
1870 MacroBuilder &Builder) const override;
Craig Topper319d81f2013-09-17 04:12:55 +00001871 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1872 bool Enabled);
1873 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1874 bool Enabled);
1875 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1876 bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07001877 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1878 StringRef Name, bool Enabled) const override {
Craig Topper85bfef62013-09-17 04:51:29 +00001879 setFeatureEnabledImpl(Features, Name, Enabled);
1880 }
1881 // This exists purely to cut down on the number of virtual calls in
1882 // getDefaultFeatures which calls this repeatedly.
1883 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1884 StringRef Name, bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07001885 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1886 bool hasFeature(StringRef Feature) const override;
1887 bool handleTargetFeatures(std::vector<std::string> &Features,
1888 DiagnosticsEngine &Diags) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001889 StringRef getABI() const override {
Derek Schuffbabaf312012-10-11 15:52:22 +00001890 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001891 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001892 else if (getTriple().getArch() == llvm::Triple::x86 &&
1893 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001894 return "no-mmx";
1895 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001896 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001897 bool setCPU(const std::string &Name) override {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001898 CPU = llvm::StringSwitch<CPUKind>(Name)
1899 .Case("i386", CK_i386)
1900 .Case("i486", CK_i486)
1901 .Case("winchip-c6", CK_WinChipC6)
1902 .Case("winchip2", CK_WinChip2)
1903 .Case("c3", CK_C3)
1904 .Case("i586", CK_i586)
1905 .Case("pentium", CK_Pentium)
1906 .Case("pentium-mmx", CK_PentiumMMX)
1907 .Case("i686", CK_i686)
1908 .Case("pentiumpro", CK_PentiumPro)
1909 .Case("pentium2", CK_Pentium2)
1910 .Case("pentium3", CK_Pentium3)
1911 .Case("pentium3m", CK_Pentium3M)
1912 .Case("pentium-m", CK_PentiumM)
1913 .Case("c3-2", CK_C3_2)
1914 .Case("yonah", CK_Yonah)
1915 .Case("pentium4", CK_Pentium4)
1916 .Case("pentium4m", CK_Pentium4M)
1917 .Case("prescott", CK_Prescott)
1918 .Case("nocona", CK_Nocona)
1919 .Case("core2", CK_Core2)
1920 .Case("penryn", CK_Penryn)
1921 .Case("atom", CK_Atom)
Preston Gurdc57ea682013-09-13 19:27:17 +00001922 .Case("slm", CK_Silvermont)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001923 .Case("corei7", CK_Corei7)
1924 .Case("corei7-avx", CK_Corei7AVX)
1925 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001926 .Case("core-avx2", CK_CoreAVX2)
Craig Topper10c2c682013-08-20 07:09:39 +00001927 .Case("knl", CK_KNL)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001928 .Case("k6", CK_K6)
1929 .Case("k6-2", CK_K6_2)
1930 .Case("k6-3", CK_K6_3)
1931 .Case("athlon", CK_Athlon)
1932 .Case("athlon-tbird", CK_AthlonThunderbird)
1933 .Case("athlon-4", CK_Athlon4)
1934 .Case("athlon-xp", CK_AthlonXP)
1935 .Case("athlon-mp", CK_AthlonMP)
1936 .Case("athlon64", CK_Athlon64)
1937 .Case("athlon64-sse3", CK_Athlon64SSE3)
1938 .Case("athlon-fx", CK_AthlonFX)
1939 .Case("k8", CK_K8)
1940 .Case("k8-sse3", CK_K8SSE3)
1941 .Case("opteron", CK_Opteron)
1942 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divackyf051cde2011-10-30 07:48:46 +00001943 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001944 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00001945 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001946 .Case("bdver1", CK_BDVER1)
1947 .Case("bdver2", CK_BDVER2)
Benjamin Kramera2420962013-11-04 10:29:51 +00001948 .Case("bdver3", CK_BDVER3)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001949 .Case("bdver4", CK_BDVER4)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001950 .Case("x86-64", CK_x86_64)
1951 .Case("geode", CK_Geode)
1952 .Default(CK_Generic);
1953
Chandler Carruth26a39142011-09-28 09:45:08 +00001954 // Perform any per-CPU checks necessary to determine if this CPU is
1955 // acceptable.
1956 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1957 // invalid without explaining *why*.
1958 switch (CPU) {
1959 case CK_Generic:
1960 // No processor selected!
1961 return false;
1962
1963 case CK_i386:
1964 case CK_i486:
1965 case CK_WinChipC6:
1966 case CK_WinChip2:
1967 case CK_C3:
1968 case CK_i586:
1969 case CK_Pentium:
1970 case CK_PentiumMMX:
1971 case CK_i686:
1972 case CK_PentiumPro:
1973 case CK_Pentium2:
1974 case CK_Pentium3:
1975 case CK_Pentium3M:
1976 case CK_PentiumM:
1977 case CK_Yonah:
1978 case CK_C3_2:
1979 case CK_Pentium4:
1980 case CK_Pentium4M:
1981 case CK_Prescott:
1982 case CK_K6:
1983 case CK_K6_2:
1984 case CK_K6_3:
1985 case CK_Athlon:
1986 case CK_AthlonThunderbird:
1987 case CK_Athlon4:
1988 case CK_AthlonXP:
1989 case CK_AthlonMP:
1990 case CK_Geode:
1991 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001992 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001993 return false;
1994
1995 // Fallthrough
1996 case CK_Nocona:
1997 case CK_Core2:
1998 case CK_Penryn:
1999 case CK_Atom:
Preston Gurdc57ea682013-09-13 19:27:17 +00002000 case CK_Silvermont:
Chandler Carruth26a39142011-09-28 09:45:08 +00002001 case CK_Corei7:
2002 case CK_Corei7AVX:
2003 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002004 case CK_CoreAVX2:
Craig Topper10c2c682013-08-20 07:09:39 +00002005 case CK_KNL:
Chandler Carruth26a39142011-09-28 09:45:08 +00002006 case CK_Athlon64:
2007 case CK_Athlon64SSE3:
2008 case CK_AthlonFX:
2009 case CK_K8:
2010 case CK_K8SSE3:
2011 case CK_Opteron:
2012 case CK_OpteronSSE3:
Roman Divackyf051cde2011-10-30 07:48:46 +00002013 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002014 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00002015 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002016 case CK_BDVER1:
2017 case CK_BDVER2:
Benjamin Kramera2420962013-11-04 10:29:51 +00002018 case CK_BDVER3:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002019 case CK_BDVER4:
Chandler Carruth26a39142011-09-28 09:45:08 +00002020 case CK_x86_64:
2021 return true;
2022 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002023 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002024 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002025
Stephen Hines651f13c2014-04-23 16:59:28 -07002026 bool setFPMath(StringRef Name) override;
Rafael Espindola5389b842013-08-21 21:59:03 +00002027
Stephen Hines651f13c2014-04-23 16:59:28 -07002028 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00002029 // We accept all non-ARM calling conventions
2030 return (CC == CC_X86ThisCall ||
2031 CC == CC_X86FastCall ||
2032 CC == CC_X86StdCall ||
2033 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002034 CC == CC_X86Pascal ||
2035 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002036 }
2037
Stephen Hines651f13c2014-04-23 16:59:28 -07002038 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00002039 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002040 }
Chris Lattner4b009652007-07-25 00:24:17 +00002041};
Chris Lattner7d6220c2009-03-02 22:20:04 +00002042
Rafael Espindola5389b842013-08-21 21:59:03 +00002043bool X86TargetInfo::setFPMath(StringRef Name) {
2044 if (Name == "387") {
2045 FPMath = FP_387;
2046 return true;
2047 }
2048 if (Name == "sse") {
2049 FPMath = FP_SSE;
2050 return true;
2051 }
2052 return false;
2053}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002054
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002055void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar07181d72009-05-06 03:16:41 +00002056 // FIXME: This *really* should not be here.
2057
2058 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002059 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper85bfef62013-09-17 04:51:29 +00002060 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar07181d72009-05-06 03:16:41 +00002061
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002062 switch (CPU) {
2063 case CK_Generic:
2064 case CK_i386:
2065 case CK_i486:
2066 case CK_i586:
2067 case CK_Pentium:
2068 case CK_i686:
2069 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002070 break;
2071 case CK_PentiumMMX:
2072 case CK_Pentium2:
Craig Topper85bfef62013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002074 break;
2075 case CK_Pentium3:
2076 case CK_Pentium3M:
Craig Topper85bfef62013-09-17 04:51:29 +00002077 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002078 break;
2079 case CK_PentiumM:
2080 case CK_Pentium4:
2081 case CK_Pentium4M:
2082 case CK_x86_64:
Craig Topper85bfef62013-09-17 04:51:29 +00002083 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002084 break;
2085 case CK_Yonah:
2086 case CK_Prescott:
2087 case CK_Nocona:
Craig Topper85bfef62013-09-17 04:51:29 +00002088 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002089 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002090 break;
2091 case CK_Core2:
Craig Topper85bfef62013-09-17 04:51:29 +00002092 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002093 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002094 break;
2095 case CK_Penryn:
Craig Topper85bfef62013-09-17 04:51:29 +00002096 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002097 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002098 break;
2099 case CK_Atom:
Craig Topper85bfef62013-09-17 04:51:29 +00002100 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002101 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002102 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002103 case CK_Silvermont:
Craig Topper85bfef62013-09-17 04:51:29 +00002104 setFeatureEnabledImpl(Features, "sse4.2", true);
2105 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002106 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002107 setFeatureEnabledImpl(Features, "pclmul", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002108 break;
2109 case CK_Corei7:
Craig Topper85bfef62013-09-17 04:51:29 +00002110 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002111 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002112 break;
2113 case CK_Corei7AVX:
Craig Topper85bfef62013-09-17 04:51:29 +00002114 setFeatureEnabledImpl(Features, "avx", true);
2115 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002116 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002117 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002118 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002119 case CK_CoreAVXi:
Craig Topper85bfef62013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "avx", true);
2121 setFeatureEnabledImpl(Features, "aes", true);
2122 setFeatureEnabledImpl(Features, "pclmul", true);
2123 setFeatureEnabledImpl(Features, "rdrnd", true);
2124 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002125 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002126 case CK_CoreAVX2:
Craig Topper85bfef62013-09-17 04:51:29 +00002127 setFeatureEnabledImpl(Features, "avx2", true);
2128 setFeatureEnabledImpl(Features, "aes", true);
2129 setFeatureEnabledImpl(Features, "pclmul", true);
2130 setFeatureEnabledImpl(Features, "lzcnt", true);
2131 setFeatureEnabledImpl(Features, "rdrnd", true);
2132 setFeatureEnabledImpl(Features, "f16c", true);
2133 setFeatureEnabledImpl(Features, "bmi", true);
2134 setFeatureEnabledImpl(Features, "bmi2", true);
2135 setFeatureEnabledImpl(Features, "rtm", true);
2136 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002137 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002138 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002139 case CK_KNL:
Craig Topper85bfef62013-09-17 04:51:29 +00002140 setFeatureEnabledImpl(Features, "avx512f", true);
2141 setFeatureEnabledImpl(Features, "avx512cd", true);
2142 setFeatureEnabledImpl(Features, "avx512er", true);
2143 setFeatureEnabledImpl(Features, "avx512pf", true);
2144 setFeatureEnabledImpl(Features, "aes", true);
2145 setFeatureEnabledImpl(Features, "pclmul", true);
2146 setFeatureEnabledImpl(Features, "lzcnt", true);
2147 setFeatureEnabledImpl(Features, "rdrnd", true);
2148 setFeatureEnabledImpl(Features, "f16c", true);
2149 setFeatureEnabledImpl(Features, "bmi", true);
2150 setFeatureEnabledImpl(Features, "bmi2", true);
2151 setFeatureEnabledImpl(Features, "rtm", true);
2152 setFeatureEnabledImpl(Features, "fma", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002153 break;
2154 case CK_K6:
2155 case CK_WinChipC6:
Craig Topper85bfef62013-09-17 04:51:29 +00002156 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002157 break;
2158 case CK_K6_2:
2159 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002160 case CK_WinChip2:
2161 case CK_C3:
Craig Topper85bfef62013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002163 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002164 case CK_Athlon:
2165 case CK_AthlonThunderbird:
2166 case CK_Geode:
Craig Topper85bfef62013-09-17 04:51:29 +00002167 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00002168 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002169 case CK_Athlon4:
2170 case CK_AthlonXP:
2171 case CK_AthlonMP:
Craig Topper85bfef62013-09-17 04:51:29 +00002172 setFeatureEnabledImpl(Features, "sse", true);
2173 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002174 break;
2175 case CK_K8:
2176 case CK_Opteron:
2177 case CK_Athlon64:
2178 case CK_AthlonFX:
Craig Topper85bfef62013-09-17 04:51:29 +00002179 setFeatureEnabledImpl(Features, "sse2", true);
2180 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002181 break;
2182 case CK_K8SSE3:
2183 case CK_OpteronSSE3:
2184 case CK_Athlon64SSE3:
Craig Topper85bfef62013-09-17 04:51:29 +00002185 setFeatureEnabledImpl(Features, "sse3", true);
2186 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divacky9979cfe2011-10-30 13:47:56 +00002187 break;
Roman Divackyf051cde2011-10-30 07:48:46 +00002188 case CK_AMDFAM10:
Craig Topper85bfef62013-09-17 04:51:29 +00002189 setFeatureEnabledImpl(Features, "sse3", true);
2190 setFeatureEnabledImpl(Features, "sse4a", true);
2191 setFeatureEnabledImpl(Features, "3dnowa", true);
2192 setFeatureEnabledImpl(Features, "lzcnt", true);
2193 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002194 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002195 case CK_BTVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002196 setFeatureEnabledImpl(Features, "ssse3", true);
2197 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002198 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002199 setFeatureEnabledImpl(Features, "lzcnt", true);
2200 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002201 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002202 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002203 case CK_BTVER2:
Craig Topper85bfef62013-09-17 04:51:29 +00002204 setFeatureEnabledImpl(Features, "avx", true);
2205 setFeatureEnabledImpl(Features, "sse4a", true);
2206 setFeatureEnabledImpl(Features, "lzcnt", true);
2207 setFeatureEnabledImpl(Features, "aes", true);
2208 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002209 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002210 setFeatureEnabledImpl(Features, "bmi", true);
2211 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002212 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer63063f52013-05-03 10:47:15 +00002213 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002214 case CK_BDVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002215 setFeatureEnabledImpl(Features, "xop", true);
2216 setFeatureEnabledImpl(Features, "lzcnt", true);
2217 setFeatureEnabledImpl(Features, "aes", true);
2218 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002219 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002220 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002221 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002222 case CK_BDVER4:
2223 setFeatureEnabledImpl(Features, "avx2", true);
2224 setFeatureEnabledImpl(Features, "bmi2", true);
2225 // FALLTHROUGH
Eli Friedmanfaf35382012-11-17 01:43:10 +00002226 case CK_BDVER2:
Benjamin Kramera2420962013-11-04 10:29:51 +00002227 case CK_BDVER3:
Craig Topper85bfef62013-09-17 04:51:29 +00002228 setFeatureEnabledImpl(Features, "xop", true);
2229 setFeatureEnabledImpl(Features, "lzcnt", true);
2230 setFeatureEnabledImpl(Features, "aes", true);
2231 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002232 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002233 setFeatureEnabledImpl(Features, "bmi", true);
2234 setFeatureEnabledImpl(Features, "fma", true);
2235 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002236 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002237 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002238 break;
2239 case CK_C3_2:
Craig Topper85bfef62013-09-17 04:51:29 +00002240 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002241 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002242 }
Daniel Dunbar07181d72009-05-06 03:16:41 +00002243}
2244
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002245void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002246 X86SSEEnum Level, bool Enabled) {
Daniel Dunbar0838f962009-05-06 21:07:50 +00002247 if (Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002248 switch (Level) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002249 case AVX512F:
2250 Features["avx512f"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002251 case AVX2:
2252 Features["avx2"] = true;
2253 case AVX:
2254 Features["avx"] = true;
2255 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002256 Features["sse4.2"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002257 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002258 Features["sse4.1"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002259 case SSSE3:
2260 Features["ssse3"] = true;
2261 case SSE3:
2262 Features["sse3"] = true;
2263 case SSE2:
2264 Features["sse2"] = true;
2265 case SSE1:
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002266 Features["sse"] = true;
2267 case NoSSE:
2268 break;
2269 }
2270 return;
Daniel Dunbar0838f962009-05-06 21:07:50 +00002271 }
2272
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002273 switch (Level) {
2274 case NoSSE:
2275 case SSE1:
2276 Features["sse"] = false;
2277 case SSE2:
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002278 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2279 Features["sha"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002280 case SSE3:
2281 Features["sse3"] = false;
2282 setXOPLevel(Features, NoXOP, false);
2283 case SSSE3:
2284 Features["ssse3"] = false;
2285 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002286 Features["sse4.1"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002287 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002288 Features["sse4.2"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002289 case AVX:
Craig Topper84f007b2013-09-16 04:54:13 +00002290 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola29f26de2013-08-21 13:28:02 +00002291 setXOPLevel(Features, FMA4, false);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002292 case AVX2:
2293 Features["avx2"] = false;
Craig Topperb7a95d22013-08-21 03:59:22 +00002294 case AVX512F:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002295 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2296 Features["avx512pf"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002297 }
Daniel Dunbar0838f962009-05-06 21:07:50 +00002298}
2299
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002300void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002301 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002302 if (Enabled) {
2303 switch (Level) {
2304 case AMD3DNowAthlon:
2305 Features["3dnowa"] = true;
2306 case AMD3DNow:
2307 Features["3dnow"] = true;
2308 case MMX:
2309 Features["mmx"] = true;
2310 case NoMMX3DNow:
2311 break;
2312 }
2313 return;
2314 }
2315
2316 switch (Level) {
2317 case NoMMX3DNow:
2318 case MMX:
2319 Features["mmx"] = false;
2320 case AMD3DNow:
2321 Features["3dnow"] = false;
2322 case AMD3DNowAthlon:
2323 Features["3dnowa"] = false;
2324 }
2325}
2326
2327void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper319d81f2013-09-17 04:12:55 +00002328 bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002329 if (Enabled) {
2330 switch (Level) {
2331 case XOP:
2332 Features["xop"] = true;
2333 case FMA4:
2334 Features["fma4"] = true;
2335 setSSELevel(Features, AVX, true);
2336 case SSE4A:
2337 Features["sse4a"] = true;
2338 setSSELevel(Features, SSE3, true);
2339 case NoXOP:
2340 break;
2341 }
2342 return;
2343 }
2344
2345 switch (Level) {
2346 case NoXOP:
2347 case SSE4A:
2348 Features["sse4a"] = false;
2349 case FMA4:
2350 Features["fma4"] = false;
2351 case XOP:
2352 Features["xop"] = false;
2353 }
2354}
2355
Craig Topper85bfef62013-09-17 04:51:29 +00002356void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2357 StringRef Name, bool Enabled) {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002358 // FIXME: This *really* should not be here. We need some way of translating
2359 // options into llvm subtarget features.
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002360 if (Name == "sse4")
2361 Name = "sse4.2";
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002362
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002363 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002364
Craig Topperb22352e2013-09-19 01:13:07 +00002365 if (Name == "mmx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002366 setMMXLevel(Features, MMX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002367 } else if (Name == "sse") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002368 setSSELevel(Features, SSE1, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002369 } else if (Name == "sse2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002370 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002371 } else if (Name == "sse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002372 setSSELevel(Features, SSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002373 } else if (Name == "ssse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002374 setSSELevel(Features, SSSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002375 } else if (Name == "sse4.2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002376 setSSELevel(Features, SSE42, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002377 } else if (Name == "sse4.1") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002378 setSSELevel(Features, SSE41, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002379 } else if (Name == "3dnow") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002380 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002381 } else if (Name == "3dnowa") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002382 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002383 } else if (Name == "aes") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002384 if (Enabled)
2385 setSSELevel(Features, SSE2, Enabled);
2386 } else if (Name == "pclmul") {
2387 if (Enabled)
2388 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002389 } else if (Name == "avx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002390 setSSELevel(Features, AVX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002391 } else if (Name == "avx2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002392 setSSELevel(Features, AVX2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002393 } else if (Name == "avx512f") {
Craig Topperb7a95d22013-08-21 03:59:22 +00002394 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002395 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topperbca2c4f2013-08-21 05:29:10 +00002396 if (Enabled)
2397 setSSELevel(Features, AVX512F, Enabled);
2398 } else if (Name == "fma") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002399 if (Enabled)
2400 setSSELevel(Features, AVX, Enabled);
2401 } else if (Name == "fma4") {
2402 setXOPLevel(Features, FMA4, Enabled);
2403 } else if (Name == "xop") {
2404 setXOPLevel(Features, XOP, Enabled);
2405 } else if (Name == "sse4a") {
2406 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper84f007b2013-09-16 04:54:13 +00002407 } else if (Name == "f16c") {
2408 if (Enabled)
2409 setSSELevel(Features, AVX, Enabled);
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002410 } else if (Name == "sha") {
2411 if (Enabled)
2412 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002413 }
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002414}
2415
Eric Christopher3d11ced2013-10-16 21:26:26 +00002416/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar07181d72009-05-06 03:16:41 +00002417/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +00002418bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00002419 DiagnosticsEngine &Diags) {
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002420 // Remember the maximum enabled sselevel.
2421 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2422 // Ignore disabled features.
2423 if (Features[i][0] == '-')
2424 continue;
2425
Benjamin Kramer713575a2012-03-05 15:10:44 +00002426 StringRef Feature = StringRef(Features[i]).substr(1);
2427
2428 if (Feature == "aes") {
Eric Christopher6c4e7872010-04-02 23:50:19 +00002429 HasAES = true;
2430 continue;
2431 }
2432
Craig Topper3c0bc152012-05-31 05:18:48 +00002433 if (Feature == "pclmul") {
2434 HasPCLMUL = true;
2435 continue;
2436 }
2437
Benjamin Kramer713575a2012-03-05 15:10:44 +00002438 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002439 HasLZCNT = true;
2440 continue;
2441 }
2442
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002443 if (Feature == "rdrnd") {
Benjamin Kramer84f30802012-07-07 09:39:18 +00002444 HasRDRND = true;
2445 continue;
2446 }
2447
Benjamin Kramer713575a2012-03-05 15:10:44 +00002448 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002449 HasBMI = true;
2450 continue;
2451 }
2452
Benjamin Kramer713575a2012-03-05 15:10:44 +00002453 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002454 HasBMI2 = true;
2455 continue;
2456 }
2457
Benjamin Kramer713575a2012-03-05 15:10:44 +00002458 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002459 HasPOPCNT = true;
2460 continue;
2461 }
2462
Michael Liao463eb892012-11-10 05:17:46 +00002463 if (Feature == "rtm") {
2464 HasRTM = true;
2465 continue;
2466 }
2467
Michael Liao72339a02013-03-26 17:52:08 +00002468 if (Feature == "prfchw") {
2469 HasPRFCHW = true;
2470 continue;
2471 }
2472
Michael Liao1bfc28c2013-03-29 05:17:55 +00002473 if (Feature == "rdseed") {
2474 HasRDSEED = true;
2475 continue;
2476 }
2477
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002478 if (Feature == "tbm") {
2479 HasTBM = true;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002480 continue;
2481 }
2482
Craig Topper2ae95072012-06-03 21:46:30 +00002483 if (Feature == "fma") {
2484 HasFMA = true;
2485 continue;
2486 }
2487
Manman Ren146e5a42012-10-11 00:59:55 +00002488 if (Feature == "f16c") {
2489 HasF16C = true;
2490 continue;
2491 }
2492
Craig Topperbca2c4f2013-08-21 05:29:10 +00002493 if (Feature == "avx512cd") {
2494 HasAVX512CD = true;
2495 continue;
2496 }
2497
2498 if (Feature == "avx512er") {
2499 HasAVX512ER = true;
2500 continue;
2501 }
2502
2503 if (Feature == "avx512pf") {
2504 HasAVX512PF = true;
2505 continue;
2506 }
2507
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002508 if (Feature == "sha") {
2509 HasSHA = true;
2510 continue;
2511 }
2512
Nick Lewyckyaf945462013-10-05 20:14:27 +00002513 if (Feature == "cx16") {
2514 HasCX16 = true;
2515 continue;
2516 }
2517
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002518 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002519 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002520 .Case("avx512f", AVX512F)
Craig Topper05fe4b52012-01-09 09:19:09 +00002521 .Case("avx2", AVX2)
2522 .Case("avx", AVX)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002523 .Case("sse4.2", SSE42)
2524 .Case("sse4.1", SSE41)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002525 .Case("ssse3", SSSE3)
Nuno Lopes3a16d782010-03-12 10:20:09 +00002526 .Case("sse3", SSE3)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002527 .Case("sse2", SSE2)
2528 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002529 .Default(NoSSE);
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002530 SSELevel = std::max(SSELevel, Level);
Michael J. Spencerd5513a32010-10-21 03:16:25 +00002531
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002532 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002533 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone5e222f2010-01-27 03:47:49 +00002534 .Case("3dnowa", AMD3DNowAthlon)
2535 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002536 .Case("mmx", MMX)
2537 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002538 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002539
2540 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2541 .Case("xop", XOP)
2542 .Case("fma4", FMA4)
2543 .Case("sse4a", SSE4A)
2544 .Default(NoXOP);
2545 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002546 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002547
Craig Topper89a5e792013-09-10 06:55:47 +00002548 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2549 // Can't do this earlier because we need to be able to explicitly enable
2550 // popcnt and still disable sse4.2.
2551 if (!HasPOPCNT && SSELevel >= SSE42 &&
2552 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2553 HasPOPCNT = true;
2554 Features.push_back("+popcnt");
2555 }
2556
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002557 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2558 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2559 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2560 HasPRFCHW = true;
2561 Features.push_back("+prfchw");
2562 }
2563
Rafael Espindola5389b842013-08-21 21:59:03 +00002564 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2565 // matches the selected sse level.
2566 if (FPMath == FP_SSE && SSELevel < SSE1) {
2567 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2568 return false;
2569 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2570 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2571 return false;
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002572 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002573
2574 // Don't tell the backend if we're turning off mmx; it will end up disabling
2575 // SSE, which we don't want.
Craig Topper56bed972013-09-11 06:48:53 +00002576 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2577 // then enable MMX.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002578 std::vector<std::string>::iterator it;
2579 it = std::find(Features.begin(), Features.end(), "-mmx");
2580 if (it != Features.end())
2581 Features.erase(it);
Craig Topper56bed972013-09-11 06:48:53 +00002582 else if (SSELevel > NoSSE)
2583 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindola5389b842013-08-21 21:59:03 +00002584 return true;
Chris Lattner7d6220c2009-03-02 22:20:04 +00002585}
Chris Lattnerbef1d722009-03-02 22:27:17 +00002586
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002587/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2588/// definitions for this particular subtarget.
Chris Lattner79682402009-03-20 15:52:06 +00002589void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002590 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00002591 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002592 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002593 Builder.defineMacro("__amd64__");
2594 Builder.defineMacro("__amd64");
2595 Builder.defineMacro("__x86_64");
2596 Builder.defineMacro("__x86_64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +00002597 } else {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002598 DefineStd(Builder, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +00002599 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00002600
Chris Lattnerc0f59212009-03-02 22:27:17 +00002601 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002602 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2603 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002604 switch (CPU) {
2605 case CK_Generic:
2606 break;
2607 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002608 // The rest are coming from the i386 define above.
2609 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002610 break;
2611 case CK_i486:
2612 case CK_WinChipC6:
2613 case CK_WinChip2:
2614 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002615 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002616 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002617 case CK_PentiumMMX:
2618 Builder.defineMacro("__pentium_mmx__");
2619 Builder.defineMacro("__tune_pentium_mmx__");
2620 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002621 case CK_i586:
2622 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002623 defineCPUMacros(Builder, "i586");
2624 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002625 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002626 case CK_Pentium3:
2627 case CK_Pentium3M:
2628 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002629 Builder.defineMacro("__tune_pentium3__");
2630 // Fallthrough
2631 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002632 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002633 Builder.defineMacro("__tune_pentium2__");
2634 // Fallthrough
2635 case CK_PentiumPro:
2636 Builder.defineMacro("__tune_i686__");
2637 Builder.defineMacro("__tune_pentiumpro__");
2638 // Fallthrough
2639 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002640 Builder.defineMacro("__i686");
2641 Builder.defineMacro("__i686__");
2642 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2643 Builder.defineMacro("__pentiumpro");
2644 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002645 break;
2646 case CK_Pentium4:
2647 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002648 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002649 break;
2650 case CK_Yonah:
2651 case CK_Prescott:
2652 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002653 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002654 break;
2655 case CK_Core2:
2656 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002657 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002658 break;
2659 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002660 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002661 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002662 case CK_Silvermont:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00002663 defineCPUMacros(Builder, "slm");
2664 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002665 case CK_Corei7:
2666 case CK_Corei7AVX:
2667 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002668 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002669 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002670 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002671 case CK_KNL:
2672 defineCPUMacros(Builder, "knl");
2673 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002674 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002675 Builder.defineMacro("__k6_2__");
2676 Builder.defineMacro("__tune_k6_2__");
2677 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002678 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002679 if (CPU != CK_K6_2) { // In case of fallthrough
2680 // FIXME: GCC may be enabling these in cases where some other k6
2681 // architecture is specified but -m3dnow is explicitly provided. The
2682 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002683 Builder.defineMacro("__k6_3__");
2684 Builder.defineMacro("__tune_k6_3__");
2685 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002686 // Fallthrough
2687 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002688 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002689 break;
2690 case CK_Athlon:
2691 case CK_AthlonThunderbird:
2692 case CK_Athlon4:
2693 case CK_AthlonXP:
2694 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002695 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002696 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002697 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002698 Builder.defineMacro("__tune_athlon_sse__");
2699 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002700 break;
2701 case CK_K8:
2702 case CK_K8SSE3:
2703 case CK_x86_64:
2704 case CK_Opteron:
2705 case CK_OpteronSSE3:
2706 case CK_Athlon64:
2707 case CK_Athlon64SSE3:
2708 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002709 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002710 break;
Roman Divackyf051cde2011-10-30 07:48:46 +00002711 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002712 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002713 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002714 case CK_BTVER1:
2715 defineCPUMacros(Builder, "btver1");
Roman Divackyf051cde2011-10-30 07:48:46 +00002716 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002717 case CK_BTVER2:
2718 defineCPUMacros(Builder, "btver2");
2719 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002720 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002721 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002722 break;
2723 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002724 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002725 break;
Benjamin Kramera2420962013-11-04 10:29:51 +00002726 case CK_BDVER3:
2727 defineCPUMacros(Builder, "bdver3");
2728 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002729 case CK_BDVER4:
2730 defineCPUMacros(Builder, "bdver4");
2731 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002732 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002733 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002734 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002735 }
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002736
Chris Lattnerbef1d722009-03-02 22:27:17 +00002737 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002738 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002739
Chris Lattner25ac1c12009-04-19 17:32:33 +00002740 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2741 // functions in glibc header files that use FP Stack inline asm which the
2742 // backend can't deal with (PR879).
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002743 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikove7772382009-05-03 13:42:53 +00002744
Chandler Carruth88c75b02011-09-28 09:54:07 +00002745 if (HasAES)
2746 Builder.defineMacro("__AES__");
2747
Craig Topper3c0bc152012-05-31 05:18:48 +00002748 if (HasPCLMUL)
2749 Builder.defineMacro("__PCLMUL__");
2750
Craig Topper31ceea02011-12-25 05:06:45 +00002751 if (HasLZCNT)
2752 Builder.defineMacro("__LZCNT__");
2753
Benjamin Kramer84f30802012-07-07 09:39:18 +00002754 if (HasRDRND)
2755 Builder.defineMacro("__RDRND__");
2756
Craig Topper31ceea02011-12-25 05:06:45 +00002757 if (HasBMI)
2758 Builder.defineMacro("__BMI__");
2759
2760 if (HasBMI2)
2761 Builder.defineMacro("__BMI2__");
2762
Craig Toppere14e08b2011-12-29 16:10:46 +00002763 if (HasPOPCNT)
2764 Builder.defineMacro("__POPCNT__");
2765
Michael Liao463eb892012-11-10 05:17:46 +00002766 if (HasRTM)
2767 Builder.defineMacro("__RTM__");
2768
Michael Liao72339a02013-03-26 17:52:08 +00002769 if (HasPRFCHW)
2770 Builder.defineMacro("__PRFCHW__");
2771
Michael Liao1bfc28c2013-03-29 05:17:55 +00002772 if (HasRDSEED)
2773 Builder.defineMacro("__RDSEED__");
2774
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002775 if (HasTBM)
2776 Builder.defineMacro("__TBM__");
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002777
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002778 switch (XOPLevel) {
2779 case XOP:
2780 Builder.defineMacro("__XOP__");
2781 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00002782 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002783 case SSE4A:
2784 Builder.defineMacro("__SSE4A__");
2785 case NoXOP:
2786 break;
2787 }
Chandler Carruth88c75b02011-09-28 09:54:07 +00002788
Craig Topper2ae95072012-06-03 21:46:30 +00002789 if (HasFMA)
2790 Builder.defineMacro("__FMA__");
2791
Manman Ren146e5a42012-10-11 00:59:55 +00002792 if (HasF16C)
2793 Builder.defineMacro("__F16C__");
2794
Craig Topperbca2c4f2013-08-21 05:29:10 +00002795 if (HasAVX512CD)
2796 Builder.defineMacro("__AVX512CD__");
2797 if (HasAVX512ER)
2798 Builder.defineMacro("__AVX512ER__");
2799 if (HasAVX512PF)
2800 Builder.defineMacro("__AVX512PF__");
2801
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002802 if (HasSHA)
2803 Builder.defineMacro("__SHA__");
2804
Nick Lewyckyaf945462013-10-05 20:14:27 +00002805 if (HasCX16)
2806 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2807
Chris Lattner715fe4c2009-03-02 22:40:39 +00002808 // Each case falls through to the previous one here.
2809 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002810 case AVX512F:
Craig Topper42f98732013-08-20 07:39:54 +00002811 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00002812 case AVX2:
2813 Builder.defineMacro("__AVX2__");
2814 case AVX:
2815 Builder.defineMacro("__AVX__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002816 case SSE42:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002817 Builder.defineMacro("__SSE4_2__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002818 case SSE41:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002819 Builder.defineMacro("__SSE4_1__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002820 case SSSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002821 Builder.defineMacro("__SSSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002822 case SSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002823 Builder.defineMacro("__SSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002824 case SSE2:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002825 Builder.defineMacro("__SSE2__");
2826 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner715fe4c2009-03-02 22:40:39 +00002827 case SSE1:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002828 Builder.defineMacro("__SSE__");
2829 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002830 case NoSSE:
Chris Lattner715fe4c2009-03-02 22:40:39 +00002831 break;
2832 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00002833
Derek Schuffbabaf312012-10-11 15:52:22 +00002834 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer01e70082010-10-21 05:21:48 +00002835 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002836 case AVX512F:
Craig Topper05fe4b52012-01-09 09:19:09 +00002837 case AVX2:
2838 case AVX:
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00002839 case SSE42:
2840 case SSE41:
2841 case SSSE3:
2842 case SSE3:
Michael J. Spencer01e70082010-10-21 05:21:48 +00002843 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002844 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002845 break;
2846 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002847 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002848 break;
2849 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002850 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002851 }
2852 }
2853
Anders Carlssone5e222f2010-01-27 03:47:49 +00002854 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002855 switch (MMX3DNowLevel) {
Anders Carlssone5e222f2010-01-27 03:47:49 +00002856 case AMD3DNowAthlon:
2857 Builder.defineMacro("__3dNOW_A__");
2858 case AMD3DNow:
2859 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002860 case MMX:
2861 Builder.defineMacro("__MMX__");
2862 case NoMMX3DNow:
Anders Carlssone5e222f2010-01-27 03:47:49 +00002863 break;
2864 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00002865
2866 if (CPU >= CK_i486) {
2867 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2868 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2869 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2870 }
2871 if (CPU >= CK_i586)
2872 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerbef1d722009-03-02 22:27:17 +00002873}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002874
Douglas Gregore727d212012-01-30 06:38:25 +00002875bool X86TargetInfo::hasFeature(StringRef Feature) const {
2876 return llvm::StringSwitch<bool>(Feature)
2877 .Case("aes", HasAES)
2878 .Case("avx", SSELevel >= AVX)
2879 .Case("avx2", SSELevel >= AVX2)
Craig Topperb7a95d22013-08-21 03:59:22 +00002880 .Case("avx512f", SSELevel >= AVX512F)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002881 .Case("avx512cd", HasAVX512CD)
2882 .Case("avx512er", HasAVX512ER)
2883 .Case("avx512pf", HasAVX512PF)
Douglas Gregore727d212012-01-30 06:38:25 +00002884 .Case("bmi", HasBMI)
2885 .Case("bmi2", HasBMI2)
Nick Lewyckyaf945462013-10-05 20:14:27 +00002886 .Case("cx16", HasCX16)
2887 .Case("f16c", HasF16C)
Craig Topper2ae95072012-06-03 21:46:30 +00002888 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002889 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002890 .Case("tbm", HasTBM)
Douglas Gregore727d212012-01-30 06:38:25 +00002891 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002892 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002893 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2894 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2895 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002896 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002897 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002898 .Case("rtm", HasRTM)
Michael Liao72339a02013-03-26 17:52:08 +00002899 .Case("prfchw", HasPRFCHW)
Michael Liao1bfc28c2013-03-29 05:17:55 +00002900 .Case("rdseed", HasRDSEED)
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002901 .Case("sha", HasSHA)
Douglas Gregore727d212012-01-30 06:38:25 +00002902 .Case("sse", SSELevel >= SSE1)
2903 .Case("sse2", SSELevel >= SSE2)
2904 .Case("sse3", SSELevel >= SSE3)
2905 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002906 .Case("sse4.1", SSELevel >= SSE41)
2907 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002908 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregore727d212012-01-30 06:38:25 +00002909 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002910 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2911 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002912 .Case("xop", XOPLevel >= XOP)
Douglas Gregore727d212012-01-30 06:38:25 +00002913 .Default(false);
2914}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002915
Eli Friedman872996c2008-08-20 02:34:37 +00002916bool
Anders Carlsson36834a72009-02-28 17:11:49 +00002917X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00002918 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +00002919 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +00002920 default: return false;
Dale Johanneseneba819a2010-08-24 22:33:12 +00002921 case 'Y': // first letter of a pair:
2922 switch (*(Name+1)) {
2923 default: return false;
2924 case '0': // First SSE register.
2925 case 't': // Any SSE register, when SSE2 is enabled.
2926 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2927 case 'm': // any MMX register, when inter-unit moves enabled.
2928 break; // falls through to setAllowsRegister.
2929 }
Eli Friedman872996c2008-08-20 02:34:37 +00002930 case 'a': // eax.
2931 case 'b': // ebx.
2932 case 'c': // ecx.
2933 case 'd': // edx.
2934 case 'S': // esi.
2935 case 'D': // edi.
2936 case 'A': // edx:eax.
Dale Johanneseneba819a2010-08-24 22:33:12 +00002937 case 'f': // any x87 floating point stack register.
Eli Friedman872996c2008-08-20 02:34:37 +00002938 case 't': // top of floating point stack.
2939 case 'u': // second from top of floating point stack.
2940 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +00002941 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +00002942 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +00002943 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johanneseneba819a2010-08-24 22:33:12 +00002944 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2945 case 'l': // "Index" registers: any general register that can be used as an
2946 // index in a base+index memory access.
2947 Info.setAllowsRegister();
2948 return true;
2949 case 'C': // SSE floating point constant.
2950 case 'G': // x87 floating point constant.
Anton Korobeynikove7772382009-05-03 13:42:53 +00002951 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00002952 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +00002953 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00002954 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +00002955 return true;
2956 }
2957}
2958
Dale Johannesen3a161e52010-10-29 23:12:32 +00002959
Eli Friedman872996c2008-08-20 02:34:37 +00002960std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002961X86TargetInfo::convertConstraint(const char *&Constraint) const {
2962 switch (*Constraint) {
Eli Friedman872996c2008-08-20 02:34:37 +00002963 case 'a': return std::string("{ax}");
2964 case 'b': return std::string("{bx}");
2965 case 'c': return std::string("{cx}");
2966 case 'd': return std::string("{dx}");
2967 case 'S': return std::string("{si}");
2968 case 'D': return std::string("{di}");
Dale Johannesena49254e2010-10-22 21:07:10 +00002969 case 'p': // address
2970 return std::string("im");
Eli Friedman872996c2008-08-20 02:34:37 +00002971 case 't': // top of floating point stack.
2972 return std::string("{st}");
2973 case 'u': // second from top of floating point stack.
2974 return std::string("{st(1)}"); // second from top of floating point stack.
2975 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002976 return std::string(1, *Constraint);
Eli Friedman872996c2008-08-20 02:34:37 +00002977 }
2978}
Eli Friedman872996c2008-08-20 02:34:37 +00002979} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +00002980
2981namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00002982// X86-32 generic target
2983class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00002984public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002985 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00002986 DoubleAlign = LongLongAlign = 32;
2987 LongDoubleWidth = 96;
2988 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002989 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07002990 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman04ede302009-03-29 20:31:09 +00002991 SizeType = UnsignedInt;
2992 PtrDiffType = SignedInt;
2993 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00002994 RegParmMax = 3;
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00002995
2996 // Use fpret for all types.
2997 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2998 (1 << TargetInfo::Double) |
2999 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00003000
3001 // x86-32 has atomics up to 8 bytes
3002 // FIXME: Check that we actually have cmpxchg8b before setting
3003 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3004 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman872996c2008-08-20 02:34:37 +00003005 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003006 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003007 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman872996c2008-08-20 02:34:37 +00003008 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003009
Stephen Hines651f13c2014-04-23 16:59:28 -07003010 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003011 if (RegNo == 0) return 0;
3012 if (RegNo == 1) return 2;
3013 return -1;
3014 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003015 bool validateInputSize(StringRef Constraint,
3016 unsigned Size) const override {
Bill Wendling68fd6082012-11-12 06:42:51 +00003017 switch (Constraint[0]) {
3018 default: break;
3019 case 'a':
3020 case 'b':
3021 case 'c':
3022 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00003023 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00003024 }
3025
3026 return true;
3027 }
Eli Friedman872996c2008-08-20 02:34:37 +00003028};
3029} // end anonymous namespace
3030
3031namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003032class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3033public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003034 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3035 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003036
Stephen Hines651f13c2014-04-23 16:59:28 -07003037 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger8daa7fe2013-11-11 14:00:37 +00003038 unsigned Major, Minor, Micro;
3039 getTriple().getOSVersion(Major, Minor, Micro);
3040 // New NetBSD uses the default rounding mode.
3041 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3042 return X86_32TargetInfo::getFloatEvalMethod();
3043 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003044 return 1;
3045 }
3046};
3047} // end anonymous namespace
3048
3049namespace {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003050class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3051public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003052 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3053 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003054 SizeType = UnsignedLong;
3055 IntPtrType = SignedLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003056 PtrDiffType = SignedLong;
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003057 }
3058};
3059} // end anonymous namespace
3060
3061namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003062class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3063public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003064 BitrigI386TargetInfo(const llvm::Triple &Triple)
3065 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00003066 SizeType = UnsignedLong;
3067 IntPtrType = SignedLong;
3068 PtrDiffType = SignedLong;
3069 }
3070};
3071} // end anonymous namespace
3072
3073namespace {
Edwin Török36565e52009-06-30 17:10:35 +00003074class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman872996c2008-08-20 02:34:37 +00003075public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003076 DarwinI386TargetInfo(const llvm::Triple &Triple)
3077 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003078 LongDoubleWidth = 128;
3079 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003080 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003081 MaxVectorAlign = 256;
Eli Friedman04ede302009-03-29 20:31:09 +00003082 SizeType = UnsignedLong;
3083 IntPtrType = SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003084 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbar9451c542010-05-27 00:35:16 +00003085 HasAlignMac68kSupport = true;
Edwin Török2d98f9f2009-06-30 17:00:25 +00003086 }
3087
Eli Friedman872996c2008-08-20 02:34:37 +00003088};
Daniel Dunbar64c77a12009-06-29 20:52:51 +00003089} // end anonymous namespace
3090
3091namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +00003092// x86-32 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003093class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman23cb7912008-08-21 01:40:19 +00003094public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003095 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3096 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattnera8a69e12009-06-24 17:12:15 +00003097 WCharType = UnsignedShort;
Eli Friedmanb28055e2009-06-08 21:16:17 +00003098 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003099 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedman23cb7912008-08-21 01:40:19 +00003100 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003101 void getTargetDefines(const LangOptions &Opts,
3102 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003103 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Eli Friedman23cb7912008-08-21 01:40:19 +00003104 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003105};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003106
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003107// x86-32 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003108class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003109public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003110 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003111 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003112 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003113 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003114 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003115 void getTargetDefines(const LangOptions &Opts,
3116 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003117 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003118 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003119 // The value of the following reflects processor type.
3120 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3121 // We lost the original triple, so we use the default.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003122 Builder.defineMacro("_M_IX86", "600");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003123 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003124};
3125} // end anonymous namespace
3126
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003127static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3128 Builder.defineMacro("__MSVCRT__");
3129 Builder.defineMacro("__MINGW32__");
3130
3131 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3132 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3133 // macro anyway for pre-processor compatibility.
3134 if (Opts.MicrosoftExt)
3135 Builder.defineMacro("__declspec", "__declspec");
3136 else
3137 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3138
3139 if (!Opts.MicrosoftExt) {
3140 // Provide macros for all the calling convention keywords. Provide both
3141 // single and double underscore prefixed variants. These are available on
3142 // x64 as well as x86, even though they have no effect.
3143 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3144 for (const char *CC : CCs) {
3145 std::string GCCSpelling = "__attribute__((__";
3146 GCCSpelling += CC;
3147 GCCSpelling += "__))";
3148 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3149 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3150 }
3151 }
3152}
3153
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003154namespace {
3155// x86-32 MinGW target
3156class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3157public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003158 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3159 : WindowsX86_32TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003160 void getTargetDefines(const LangOptions &Opts,
3161 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003162 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003163 DefineStd(Builder, "WIN32", Opts);
3164 DefineStd(Builder, "WINNT", Opts);
3165 Builder.defineMacro("_X86_");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003166 addMinGWDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003167 }
3168};
3169} // end anonymous namespace
3170
3171namespace {
3172// x86-32 Cygwin target
3173class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3174public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003175 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3176 : X86_32TargetInfo(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003177 TLSSupported = false;
3178 WCharType = UnsignedShort;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003179 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003180 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003181 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003182 void getTargetDefines(const LangOptions &Opts,
3183 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003184 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003185 Builder.defineMacro("_X86_");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003186 Builder.defineMacro("__CYGWIN__");
3187 Builder.defineMacro("__CYGWIN32__");
3188 DefineStd(Builder, "unix", Opts);
Douglas Gregor9b22a172010-04-21 05:52:38 +00003189 if (Opts.CPlusPlus)
3190 Builder.defineMacro("_GNU_SOURCE");
Eli Friedman6b6ca942009-06-08 06:11:14 +00003191 }
Eli Friedman23cb7912008-08-21 01:40:19 +00003192};
3193} // end anonymous namespace
3194
3195namespace {
Chris Lattnerf853e732010-04-11 19:29:39 +00003196// x86-32 Haiku target
3197class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3198public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003199 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerf853e732010-04-11 19:29:39 +00003200 SizeType = UnsignedLong;
Chris Lattner5b8b18a2010-04-22 17:48:00 +00003201 IntPtrType = SignedLong;
3202 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003203 ProcessIDType = SignedLong;
Rafael Espindolaa7bdfdd2010-11-09 16:41:02 +00003204 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003205 this->TLSSupported = false;
Eli Friedman08f845b2010-08-22 01:00:03 +00003206 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003207 void getTargetDefines(const LangOptions &Opts,
3208 MacroBuilder &Builder) const override {
Chris Lattnerf853e732010-04-11 19:29:39 +00003209 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3210 Builder.defineMacro("__INTEL__");
3211 Builder.defineMacro("__HAIKU__");
3212 }
3213};
3214} // end anonymous namespace
3215
Douglas Gregordca52262011-07-01 22:41:14 +00003216// RTEMS Target
3217template<typename Target>
3218class RTEMSTargetInfo : public OSTargetInfo<Target> {
3219protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07003220 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3221 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003222 // RTEMS defines; list based off of gcc output
3223
Douglas Gregordca52262011-07-01 22:41:14 +00003224 Builder.defineMacro("__rtems__");
3225 Builder.defineMacro("__ELF__");
3226 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003227
Douglas Gregordca52262011-07-01 22:41:14 +00003228public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003229 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3230 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00003231
Benjamin Kramer9df08232013-06-29 16:37:14 +00003232 switch (Triple.getArch()) {
3233 default:
3234 case llvm::Triple::x86:
3235 // this->MCountName = ".mcount";
3236 break;
3237 case llvm::Triple::mips:
3238 case llvm::Triple::mipsel:
3239 case llvm::Triple::ppc:
3240 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003241 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003242 // this->MCountName = "_mcount";
3243 break;
3244 case llvm::Triple::arm:
3245 // this->MCountName = "__mcount";
3246 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003247 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003248 }
Douglas Gregordca52262011-07-01 22:41:14 +00003249};
3250
3251namespace {
3252// x86-32 RTEMS target
3253class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3254public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003255 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003256 SizeType = UnsignedLong;
3257 IntPtrType = SignedLong;
3258 PtrDiffType = SignedLong;
3259 this->UserLabelPrefix = "";
3260 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003261 void getTargetDefines(const LangOptions &Opts,
3262 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003263 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3264 Builder.defineMacro("__INTEL__");
3265 Builder.defineMacro("__rtems__");
3266 }
3267};
3268} // end anonymous namespace
3269
Chris Lattnerf853e732010-04-11 19:29:39 +00003270namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00003271// x86-64 generic target
3272class X86_64TargetInfo : public X86TargetInfo {
3273public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003274 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003275 const bool IsX32{getTriple().getEnvironment() == llvm::Triple::GNUX32};
3276 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003277 LongDoubleWidth = 128;
3278 LongDoubleAlign = 128;
Rafael Espindolabfa7c002010-06-04 23:15:27 +00003279 LargeArrayMinWidth = 128;
3280 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003281 SuitableAlign = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003282 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3283 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3284 IntPtrType = IsX32 ? SignedInt : SignedLong;
3285 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
3286 UIntMaxType = IsX32 ? UnsignedLongLong : UnsignedLong;
3287 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003288 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00003289
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003290 DescriptionString = (IsX32)
3291 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3292 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003293
3294 // Use fpret only for long double.
3295 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003296
Anders Carlsson321b7ac2011-10-31 16:27:11 +00003297 // Use fp2ret for _Complex long double.
3298 ComplexLongDoubleUsesFP2Ret = true;
3299
Eli Friedman2be46072011-10-14 20:59:01 +00003300 // x86-64 has atomics up to 16 bytes.
Eli Friedman2be46072011-10-14 20:59:01 +00003301 MaxAtomicPromoteWidth = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003302 MaxAtomicInlineWidth = 128;
Chris Lattner4b009652007-07-25 00:24:17 +00003303 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003304 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003305 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson7dd1c952007-11-24 23:38:12 +00003306 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00003307
Stephen Hines651f13c2014-04-23 16:59:28 -07003308 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003309 if (RegNo == 0) return 0;
3310 if (RegNo == 1) return 1;
3311 return -1;
3312 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003313
Stephen Hines651f13c2014-04-23 16:59:28 -07003314 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003315 return (CC == CC_C ||
3316 CC == CC_IntelOclBicc ||
3317 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003318 }
3319
Stephen Hines651f13c2014-04-23 16:59:28 -07003320 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00003321 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003322 }
3323
Eli Friedman872996c2008-08-20 02:34:37 +00003324};
3325} // end anonymous namespace
3326
3327namespace {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003328// x86-64 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003329class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003330public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003331 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3332 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003333 WCharType = UnsignedShort;
Mike Stump4da7a162009-10-08 23:00:00 +00003334 LongWidth = LongAlign = 32;
Michael J. Spencer3d796932010-10-18 07:10:59 +00003335 DoubleAlign = LongLongAlign = 64;
Nate Begeman472bd992010-07-21 02:02:56 +00003336 IntMaxType = SignedLongLong;
3337 UIntMaxType = UnsignedLongLong;
3338 Int64Type = SignedLongLong;
Cameron Esfahani32083822010-09-15 00:28:12 +00003339 SizeType = UnsignedLongLong;
3340 PtrDiffType = SignedLongLong;
3341 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003342 this->UserLabelPrefix = "";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003343 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003344 void getTargetDefines(const LangOptions &Opts,
3345 MacroBuilder &Builder) const override {
Michael J. Spencer01e70082010-10-21 05:21:48 +00003346 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003347 Builder.defineMacro("_WIN64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003348 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003350 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003351 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003352 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003353 return (CC == CC_C ||
3354 CC == CC_IntelOclBicc ||
3355 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3356 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003357};
3358} // end anonymous namespace
3359
3360namespace {
3361// x86-64 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003362class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003363public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003364 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003365 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003366 LongDoubleWidth = LongDoubleAlign = 64;
3367 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003368 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003369 void getTargetDefines(const LangOptions &Opts,
3370 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003371 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003372 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003373 Builder.defineMacro("_M_X64");
Michael J. Spencer01e70082010-10-21 05:21:48 +00003374 Builder.defineMacro("_M_AMD64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003375 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003376};
3377} // end anonymous namespace
3378
3379namespace {
3380// x86-64 MinGW target
3381class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3382public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003383 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3384 : WindowsX86_64TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003385 void getTargetDefines(const LangOptions &Opts,
3386 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003387 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003388 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003389 Builder.defineMacro("__MINGW64__");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003390 addMinGWDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003391 }
3392};
3393} // end anonymous namespace
3394
3395namespace {
Eli Friedman38e31802009-07-01 03:36:11 +00003396class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3397public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003398 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3399 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman38e31802009-07-01 03:36:11 +00003400 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003401 MaxVectorAlign = 256;
Stephen Hines651f13c2014-04-23 16:59:28 -07003402 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3403 llvm::Triple T = llvm::Triple(Triple);
3404 if (T.getOS() == llvm::Triple::IOS)
3405 UseSignedCharForObjCBool = false;
3406 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman38e31802009-07-01 03:36:11 +00003407 }
3408};
3409} // end anonymous namespace
3410
3411namespace {
Eli Friedman96ada022009-07-05 22:31:18 +00003412class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3413public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003414 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3415 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman96ada022009-07-05 22:31:18 +00003416 IntMaxType = SignedLongLong;
3417 UIntMaxType = UnsignedLongLong;
3418 Int64Type = SignedLongLong;
3419 }
3420};
3421} // end anonymous namespace
3422
3423namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003424class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3425public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003426 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3427 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3428 IntMaxType = SignedLongLong;
3429 UIntMaxType = UnsignedLongLong;
3430 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003431 }
3432};
Tim Northoverc264e162013-01-31 12:13:10 +00003433}
3434
Eli Friedman42f74f22012-08-08 23:57:20 +00003435
3436namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00003437class ARMTargetInfo : public TargetInfo {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003438 // Possible FPU choices.
3439 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003440 VFP2FPU = (1 << 0),
3441 VFP3FPU = (1 << 1),
3442 VFP4FPU = (1 << 2),
Bernard Ogdenf779e652013-10-24 18:32:51 +00003443 NeonFPU = (1 << 3),
3444 FPARMV8 = (1 << 4)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003445 };
3446
Silviu Baranga1db2e272013-10-21 10:54:53 +00003447 // Possible HWDiv features.
3448 enum HWDivMode {
3449 HWDivThumb = (1 << 0),
3450 HWDivARM = (1 << 1)
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003451 };
3452
3453 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenf779e652013-10-24 18:32:51 +00003454 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003455 }
3456
3457 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3458 static const char * const GCCRegNames[];
Daniel Dunbar40b774e2009-09-17 07:03:19 +00003459
Daniel Dunbar33b40752009-12-18 18:42:37 +00003460 std::string ABI, CPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003461
Rafael Espindola5389b842013-08-21 21:59:03 +00003462 enum {
3463 FP_Default,
3464 FP_VFP,
3465 FP_Neon
3466 } FPMath;
3467
Bernard Ogdenf779e652013-10-24 18:32:51 +00003468 unsigned FPU : 5;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003469
Logan Chieneae5a8202012-10-10 06:56:20 +00003470 unsigned IsAAPCS : 1;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003471 unsigned IsThumb : 1;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003472 unsigned HWDiv : 2;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003473
3474 // Initialized via features.
3475 unsigned SoftFloat : 1;
3476 unsigned SoftFloatABI : 1;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003477
Bernard Ogden909f35a2013-10-29 09:47:51 +00003478 unsigned CRC : 1;
Stephen Hines651f13c2014-04-23 16:59:28 -07003479 unsigned Crypto : 1;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003480
Chris Lattnerb4527522010-03-03 19:03:45 +00003481 static const Builtin::Info BuiltinInfo[];
3482
Rafael Espindola620c0af2013-05-13 20:09:47 +00003483 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola620c0af2013-05-13 20:09:47 +00003484 StringRef ArchName = T.getArchName();
Stephen Hines651f13c2014-04-23 16:59:28 -07003485 if (T.getArch() == llvm::Triple::arm ||
3486 T.getArch() == llvm::Triple::armeb) {
3487 StringRef VersionStr;
3488 if (ArchName.startswith("armv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003489 VersionStr = ArchName.substr(4, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003490 else if (ArchName.startswith("armebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003491 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003492 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003493 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003494 unsigned Version;
3495 if (VersionStr.getAsInteger(10, Version))
3496 return false;
3497 return Version >= 6;
3498 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003499 assert(T.getArch() == llvm::Triple::thumb ||
3500 T.getArch() == llvm::Triple::thumbeb);
3501 StringRef VersionStr;
3502 if (ArchName.startswith("thumbv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003503 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003504 else if (ArchName.startswith("thumbebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003505 VersionStr = ArchName.substr(8, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003506 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003507 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003508 unsigned Version;
3509 if (VersionStr.getAsInteger(10, Version))
3510 return false;
3511 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003512 }
3513
Stephen Hines651f13c2014-04-23 16:59:28 -07003514 void setABIAAPCS() {
3515 IsAAPCS = true;
3516
3517 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3518 const llvm::Triple &T = getTriple();
3519
3520 // size_t is unsigned long on Darwin and NetBSD.
3521 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003522 SizeType = UnsignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003523 else
3524 SizeType = UnsignedInt;
3525
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003526 switch (T.getOS()) {
3527 case llvm::Triple::NetBSD:
Bill Wendling604470b2013-12-01 04:22:48 +00003528 WCharType = SignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003529 break;
3530 case llvm::Triple::Win32:
3531 WCharType = UnsignedShort;
3532 break;
3533 case llvm::Triple::Linux:
3534 default:
Bill Wendling604470b2013-12-01 04:22:48 +00003535 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3536 WCharType = UnsignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003537 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07003538 }
3539
3540 UseBitFieldTypeAlignment = true;
3541
3542 ZeroLengthBitfieldBoundary = 0;
3543
3544 if (IsThumb) {
3545 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3546 // so set preferred for small types to 32.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003547 if (T.isOSBinFormatMachO()) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003548 DescriptionString = BigEndian ?
3549 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3550 "v128:64:128-a:0:32-n32-S64" :
3551 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3552 "v128:64:128-a:0:32-n32-S64";
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003553 } else if (T.isOSWindows()) {
3554 // FIXME: this is invalid for WindowsCE
3555 assert(!BigEndian && "Windows on ARM does not support big endian");
3556 DescriptionString = "e"
3557 "-m:e"
3558 "-p:32:32"
3559 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3560 "-v128:64:128"
3561 "-a:0:32"
3562 "-n32"
3563 "-S64";
3564 } else {
Stephen Hines651f13c2014-04-23 16:59:28 -07003565 DescriptionString = BigEndian ?
3566 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3567 "v128:64:128-a:0:32-n32-S64" :
3568 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3569 "v128:64:128-a:0:32-n32-S64";
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003570 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003571 } else {
3572 if (T.isOSBinFormatMachO())
3573 DescriptionString = BigEndian ?
3574 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3575 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3576 else
3577 DescriptionString = BigEndian ?
3578 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3579 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
3580 }
3581
3582 // FIXME: Enumerated types are variable width in straight AAPCS.
3583 }
3584
3585 void setABIAPCS() {
3586 const llvm::Triple &T = getTriple();
3587
3588 IsAAPCS = false;
3589
3590 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3591
3592 // size_t is unsigned int on FreeBSD.
3593 if (T.getOS() == llvm::Triple::FreeBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003594 SizeType = UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07003595 else
3596 SizeType = UnsignedLong;
3597
3598 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3599 WCharType = SignedInt;
3600
3601 // Do not respect the alignment of bit-field types when laying out
3602 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3603 UseBitFieldTypeAlignment = false;
3604
3605 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3606 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3607 /// gcc.
3608 ZeroLengthBitfieldBoundary = 32;
3609
3610 if (IsThumb) {
3611 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3612 // so set preferred for small types to 32.
3613 if (T.isOSBinFormatMachO())
3614 DescriptionString = BigEndian ?
3615 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3616 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3617 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3618 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3619 else
3620 DescriptionString = BigEndian ?
3621 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3622 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3623 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3624 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3625 } else {
3626 if (T.isOSBinFormatMachO())
3627 DescriptionString = BigEndian ?
3628 "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3629 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3630 else
3631 DescriptionString = BigEndian ?
3632 "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3633 "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3634 }
3635
3636 // FIXME: Override "preferred align" for double and long long.
3637 }
3638
3639public:
3640 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
3641 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3642 IsAAPCS(true) {
3643 BigEndian = IsBigEndian;
3644
3645 switch (getTriple().getOS()) {
3646 case llvm::Triple::NetBSD:
3647 PtrDiffType = SignedLong;
3648 break;
3649 default:
Bill Wendling85ad3892013-12-02 19:19:57 +00003650 PtrDiffType = SignedInt;
Bill Wendling604470b2013-12-01 04:22:48 +00003651 break;
3652 }
Daniel Dunbarf0156562009-09-17 16:21:10 +00003653
Chris Lattnere20b8122010-04-23 16:29:58 +00003654 // {} in inline assembly are neon specifiers, not assembly variant
3655 // specifiers.
3656 NoAsmVariants = true;
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003657
Daniel Dunbar33b40752009-12-18 18:42:37 +00003658 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0a542ca2009-12-18 19:57:13 +00003659 IsThumb = getTriple().getArchName().startswith("thumb");
Stephen Hines651f13c2014-04-23 16:59:28 -07003660
3661 setABI("aapcs-linux");
John McCall68086b92010-08-21 22:46:04 +00003662
3663 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003664 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003665
3666 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003667 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003668 if (shouldUseInlineAtomic(getTriple()))
3669 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003670
3671 // Do force alignment of members that follow zero length bitfields. If
3672 // the alignment of the zero-length bitfield is greater than the member
3673 // that follows it, `bar', `bar' will be aligned as the type of the
3674 // zero length bitfield.
3675 UseZeroLengthBitfieldAlignment = true;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003676 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003677 StringRef getABI() const override { return ABI; }
Stephen Hines651f13c2014-04-23 16:59:28 -07003678 bool setABI(const std::string &Name) override {
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003679 ABI = Name;
3680
Daniel Dunbarb9531632009-09-14 00:02:24 +00003681 // The defaults (above) are for AAPCS, check if we need to change them.
3682 //
3683 // FIXME: We need support for -meabi... we could just mangle it into the
3684 // name.
3685 if (Name == "apcs-gnu") {
Stephen Hines651f13c2014-04-23 16:59:28 -07003686 setABIAPCS();
3687 return true;
3688 }
3689 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3690 setABIAAPCS();
3691 return true;
3692 }
3693 return false;
Daniel Dunbarb9531632009-09-14 00:02:24 +00003694 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00003695
Stephen Hines651f13c2014-04-23 16:59:28 -07003696 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
3697 if (IsAAPCS)
3698 Features["aapcs"] = true;
3699 else
3700 Features["apcs"] = true;
3701
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003702 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003703 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3704 Features["vfp2"] = true;
Renato Golin1302f9f2013-09-13 17:02:45 +00003705 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3706 CPU == "cortex-a9-mp") {
3707 Features["vfp3"] = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003708 Features["neon"] = true;
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003709 }
3710 else if (CPU == "cortex-a5") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003711 Features["vfp4"] = true;
3712 Features["neon"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003713 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3714 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3715 CPU == "krait") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003716 Features["vfp4"] = true;
3717 Features["neon"] = true;
3718 Features["hwdiv"] = true;
3719 Features["hwdiv-arm"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003720 } else if (CPU == "cyclone") {
3721 Features["v8fp"] = true;
3722 Features["neon"] = true;
3723 Features["hwdiv"] = true;
3724 Features["hwdiv-arm"] = true;
Bernard Ogdenf779e652013-10-24 18:32:51 +00003725 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3726 Features["fp-armv8"] = true;
3727 Features["neon"] = true;
3728 Features["hwdiv"] = true;
3729 Features["hwdiv-arm"] = true;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003730 Features["crc"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003731 Features["crypto"] = true;
3732 } else if (CPU == "cortex-r5" ||
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003733 // Enable the hwdiv extension for all v8a AArch32 cores by
3734 // default.
3735 ArchName == "armv8a" || ArchName == "armv8" ||
Stephen Hines651f13c2014-04-23 16:59:28 -07003736 ArchName == "armebv8a" || ArchName == "armebv8" ||
3737 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3738 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003739 Features["hwdiv"] = true;
3740 Features["hwdiv-arm"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003741 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3742 Features["hwdiv"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003743 }
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003744 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003745
Stephen Hines651f13c2014-04-23 16:59:28 -07003746 bool handleTargetFeatures(std::vector<std::string> &Features,
3747 DiagnosticsEngine &Diags) override {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003748 FPU = 0;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003749 CRC = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07003750 Crypto = 0;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003751 SoftFloat = SoftFloatABI = false;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003752 HWDiv = 0;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003753 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3754 if (Features[i] == "+soft-float")
3755 SoftFloat = true;
3756 else if (Features[i] == "+soft-float-abi")
3757 SoftFloatABI = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003758 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003759 FPU |= VFP2FPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003760 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003761 FPU |= VFP3FPU;
3762 else if (Features[i] == "+vfp4")
3763 FPU |= VFP4FPU;
Bernard Ogdenf779e652013-10-24 18:32:51 +00003764 else if (Features[i] == "+fp-armv8")
3765 FPU |= FPARMV8;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003766 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003767 FPU |= NeonFPU;
Stephen Hines64f85312011-10-21 14:54:52 -07003768 else if (Features[i] == "+long64")
3769 LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
Silviu Baranga1db2e272013-10-21 10:54:53 +00003770 else if (Features[i] == "+hwdiv")
3771 HWDiv |= HWDivThumb;
3772 else if (Features[i] == "+hwdiv-arm")
3773 HWDiv |= HWDivARM;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003774 else if (Features[i] == "+crc")
3775 CRC = 1;
Stephen Hines651f13c2014-04-23 16:59:28 -07003776 else if (Features[i] == "+crypto")
3777 Crypto = 1;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003778 }
3779
Rafael Espindola5389b842013-08-21 21:59:03 +00003780 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3781 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3782 return false;
3783 }
3784
3785 if (FPMath == FP_Neon)
3786 Features.push_back("+neonfp");
3787 else if (FPMath == FP_VFP)
3788 Features.push_back("-neonfp");
3789
Daniel Dunbar48075d82009-12-19 04:15:38 +00003790 // Remove front-end specific options which the backend handles differently.
3791 std::vector<std::string>::iterator it;
3792 it = std::find(Features.begin(), Features.end(), "+soft-float");
3793 if (it != Features.end())
3794 Features.erase(it);
3795 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3796 if (it != Features.end())
3797 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00003798 return true;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003799 }
3800
Stephen Hines651f13c2014-04-23 16:59:28 -07003801 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00003802 return llvm::StringSwitch<bool>(Feature)
3803 .Case("arm", true)
3804 .Case("softfloat", SoftFloat)
3805 .Case("thumb", IsThumb)
Amara Emerson2440fb12013-09-16 18:07:35 +00003806 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Baranga1db2e272013-10-21 10:54:53 +00003807 .Case("hwdiv", HWDiv & HWDivThumb)
3808 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregore727d212012-01-30 06:38:25 +00003809 .Default(false);
3810 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003811 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003812 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbar33b40752009-12-18 18:42:37 +00003813 return llvm::StringSwitch<const char*>(Name)
3814 .Cases("arm8", "arm810", "4")
3815 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3816 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3817 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3818 .Case("ep9312", "4T")
3819 .Cases("arm10tdmi", "arm1020t", "5T")
3820 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3821 .Case("arm926ej-s", "5TEJ")
3822 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3823 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003824 .Case("arm1136j-s", "6J")
Daniel Dunbar33b40752009-12-18 18:42:37 +00003825 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003826 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbar33b40752009-12-18 18:42:37 +00003827 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Stephen Hines651f13c2014-04-23 16:59:28 -07003828 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
3829 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin5df40452013-09-13 17:02:54 +00003830 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003831 .Case("swift", "7S")
Stephen Hines651f13c2014-04-23 16:59:28 -07003832 .Case("cyclone", "8A")
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003833 .Case("cortex-m3", "7M")
3834 .Case("cortex-m4", "7EM")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003835 .Case("cortex-m0", "6M")
Bernard Ogdenc4272492013-10-24 18:32:36 +00003836 .Cases("cortex-a53", "cortex-a57", "8A")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003837 .Default(nullptr);
Daniel Dunbar33b40752009-12-18 18:42:37 +00003838 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003839 static const char *getCPUProfile(StringRef Name) {
3840 return llvm::StringSwitch<const char*>(Name)
Renato Golin5df40452013-09-13 17:02:54 +00003841 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Stephen Hines651f13c2014-04-23 16:59:28 -07003842 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogdenc4272492013-10-24 18:32:36 +00003843 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003844 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin5df40452013-09-13 17:02:54 +00003845 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003846 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003847 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003848 bool setCPU(const std::string &Name) override {
Daniel Dunbar33b40752009-12-18 18:42:37 +00003849 if (!getCPUDefineSuffix(Name))
3850 return false;
3851
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003852 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3853 StringRef Profile = getCPUProfile(Name);
3854 if (Profile == "M" && MaxAtomicInlineWidth) {
3855 MaxAtomicPromoteWidth = 32;
3856 MaxAtomicInlineWidth = 32;
3857 }
3858
Daniel Dunbar33b40752009-12-18 18:42:37 +00003859 CPU = Name;
3860 return true;
3861 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003862 bool setFPMath(StringRef Name) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003863 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3864 unsigned CPUArchVer) const {
3865 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3866 (CPUArch.find('M') != StringRef::npos);
3867 }
3868 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3869 unsigned CPUArchVer) const {
3870 // We check both CPUArchVer and ArchName because when only triple is
3871 // specified, the default CPU is arm1136j-s.
3872 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3873 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3874 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003875 void getTargetDefines(const LangOptions &Opts,
3876 MacroBuilder &Builder) const override {
Chris Lattnerbef1d722009-03-02 22:27:17 +00003877 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003878 Builder.defineMacro("__arm");
3879 Builder.defineMacro("__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00003880
Chris Lattnerbef1d722009-03-02 22:27:17 +00003881 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003882 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbar33b40752009-12-18 18:42:37 +00003883
Chris Lattner5f9e2722011-07-23 10:55:15 +00003884 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden51f997d2013-10-24 18:32:44 +00003885 unsigned int CPUArchVer;
3886 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3887 llvm_unreachable("Invalid char for architecture version number");
3888 }
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003889 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003890
3891 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003892 StringRef CPUProfile = getCPUProfile(CPU);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003893 StringRef ArchName = getTriple().getArchName();
3894
3895 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3896 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3897
3898 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
3899 // is not defined for the M-profile.
3900 // NOTE that the deffault profile is assumed to be 'A'
3901 if (CPUProfile.empty() || CPUProfile != "M")
3902 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3903
3904 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3905 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
3906 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3907 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3908 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3909 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3910 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3911
3912 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3913 // instruction set such as ARM or Thumb.
3914 Builder.defineMacro("__ARM_32BIT_STATE", "1");
3915
3916 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3917
3918 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003919 if (!CPUProfile.empty())
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003920 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
3921
3922 // ACLE predefines.
3923 Builder.defineMacro("__ARM_ACLE", "200");
Stephen Hines651f13c2014-04-23 16:59:28 -07003924
Mike Stumpf90a29f2009-04-08 02:07:04 +00003925 // Subtarget options.
Daniel Dunbarf0156562009-09-17 16:21:10 +00003926
Daniel Dunbar33b40752009-12-18 18:42:37 +00003927 // FIXME: It's more complicated than this and we don't really support
3928 // interworking.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003929 // Windows on ARM does not "support" interworking
3930 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003931 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00003932
David Tweedb16abb12012-10-25 13:33:01 +00003933 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northover9b796302013-11-11 19:11:22 +00003934 // Embedded targets on Darwin follow AAPCS, but not EABI.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003935 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
3936 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbar849289e2012-10-22 18:51:13 +00003937 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003938 Builder.defineMacro("__ARM_PCS", "1");
3939
David Tweedb16abb12012-10-25 13:33:01 +00003940 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003941 Builder.defineMacro("__ARM_PCS_VFP", "1");
3942 }
Daniel Dunbar33b40752009-12-18 18:42:37 +00003943
Daniel Dunbar48075d82009-12-19 04:15:38 +00003944 if (SoftFloat)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003945 Builder.defineMacro("__SOFTFP__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00003946
3947 if (CPU == "xscale")
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003948 Builder.defineMacro("__XSCALE__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00003949
3950 if (IsThumb) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003951 Builder.defineMacro("__THUMBEL__");
3952 Builder.defineMacro("__thumb__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003953 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003954 Builder.defineMacro("__thumb2__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00003955 }
Silviu Baranga1db2e272013-10-21 10:54:53 +00003956 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3957 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbarf0156562009-09-17 16:21:10 +00003958
3959 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003960 Builder.defineMacro("__APCS_32__");
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003961
Bob Wilsoncfaab002012-09-29 23:52:52 +00003962 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003963 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003964 if (FPU & VFP2FPU)
3965 Builder.defineMacro("__ARM_VFPV2__");
3966 if (FPU & VFP3FPU)
3967 Builder.defineMacro("__ARM_VFPV3__");
3968 if (FPU & VFP4FPU)
3969 Builder.defineMacro("__ARM_VFPV4__");
3970 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003971
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003972 // This only gets set when Neon instructions are actually available, unlike
3973 // the VFP define, hence the soft float and arch check. This is subtly
3974 // different from gcc, we follow the intent which was that it should be set
3975 // when Neon instructions are actually available.
Stephen Hines651f13c2014-04-23 16:59:28 -07003976 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
3977 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003978 Builder.defineMacro("__ARM_NEON__");
Stephen Hines651f13c2014-04-23 16:59:28 -07003979 }
3980
3981 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
3982 Opts.ShortWChar ? "2" : "4");
3983
3984 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
3985 Opts.ShortEnums ? "1" : "4");
Joey Gouly520ec1e2013-09-18 10:07:09 +00003986
Bernard Ogden909f35a2013-10-29 09:47:51 +00003987 if (CRC)
Joey Gouly520ec1e2013-09-18 10:07:09 +00003988 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao8712ded2013-09-30 22:51:32 +00003989
Stephen Hines651f13c2014-04-23 16:59:28 -07003990 if (Crypto)
3991 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
3992
Bernard Ogden51f997d2013-10-24 18:32:44 +00003993 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao8712ded2013-09-30 22:51:32 +00003994 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3995 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3996 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3997 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3998 }
Chris Lattner9fd73612008-04-21 18:56:49 +00003999 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004000 void getTargetBuiltins(const Builtin::Info *&Records,
4001 unsigned &NumRecords) const override {
Chris Lattnerb4527522010-03-03 19:03:45 +00004002 Records = BuiltinInfo;
4003 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner9fd73612008-04-21 18:56:49 +00004004 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004005 bool isCLZForZeroUndef() const override { return false; }
4006 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chieneae5a8202012-10-10 06:56:20 +00004007 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner9fd73612008-04-21 18:56:49 +00004008 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004009 void getGCCRegNames(const char * const *&Names,
4010 unsigned &NumNames) const override;
4011 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4012 unsigned &NumAliases) const override;
4013 bool validateAsmConstraint(const char *&Name,
4014 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +00004015 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00004016 default: break;
Nate Begeman222823a2008-04-22 05:03:19 +00004017 case 'l': // r0-r7
4018 case 'h': // r8-r15
4019 case 'w': // VFP Floating point register single precision
4020 case 'P': // VFP Floating point register double precision
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00004021 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00004022 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00004023 case 'Q': // A memory address that is a single base register.
4024 Info.setAllowsMemory();
4025 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00004026 case 'U': // a memory reference...
4027 switch (Name[1]) {
4028 case 'q': // ...ARMV4 ldrsb
4029 case 'v': // ...VFP load/store (reg+constant offset)
4030 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00004031 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00004032 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00004033 case 'n': // valid address for Neon doubleword vector load/store
4034 case 'm': // valid address for Neon element and structure load/store
4035 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00004036 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00004037 Info.setAllowsMemory();
4038 Name++;
4039 return true;
4040 }
Nate Begeman222823a2008-04-22 05:03:19 +00004041 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004042 return false;
4043 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004044 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings002333f2011-06-07 23:45:05 +00004045 std::string R;
4046 switch (*Constraint) {
4047 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00004048 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00004049 Constraint++;
4050 break;
Eric Christopher283f4472011-06-17 00:40:18 +00004051 case 'p': // 'p' should be translated to 'r' by default.
4052 R = std::string("r");
4053 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00004054 default:
4055 return std::string(1, *Constraint);
4056 }
4057 return R;
4058 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004059 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4060 unsigned Size) const override {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004061 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00004062 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004063
Bill Wendling50d46ca2012-10-25 23:28:48 +00004064 // Strip off constraint modifiers.
4065 while (Constraint[0] == '=' ||
4066 Constraint[0] == '+' ||
4067 Constraint[0] == '&')
4068 Constraint = Constraint.substr(1);
4069
4070 switch (Constraint[0]) {
4071 default: break;
4072 case 'r': {
4073 switch (Modifier) {
4074 default:
Bill Wendlingdd6669d2013-12-09 02:58:56 +00004075 return (isInOut || isOutput || Size <= 64);
Bill Wendling50d46ca2012-10-25 23:28:48 +00004076 case 'q':
4077 // A register of size 32 cannot fit a vector type.
4078 return false;
4079 }
4080 }
4081 }
4082
4083 return true;
4084 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004085 const char *getClobbers() const override {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004086 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00004087 return "";
4088 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00004089
Stephen Hines651f13c2014-04-23 16:59:28 -07004090 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00004091 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4092 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004093
Stephen Hines651f13c2014-04-23 16:59:28 -07004094 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00004095 if (RegNo == 0) return 0;
4096 if (RegNo == 1) return 1;
4097 return -1;
4098 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004099};
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004100
Rafael Espindola5389b842013-08-21 21:59:03 +00004101bool ARMTargetInfo::setFPMath(StringRef Name) {
4102 if (Name == "neon") {
4103 FPMath = FP_Neon;
4104 return true;
4105 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4106 Name == "vfp4") {
4107 FPMath = FP_VFP;
4108 return true;
4109 }
4110 return false;
4111}
4112
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004113const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004114 // Integer registers
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004115 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004116 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4117
4118 // Float registers
4119 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4120 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4121 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004122 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004123
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004124 // Double registers
4125 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4126 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesen0d79b042010-10-28 01:05:37 +00004127 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4128 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004129
4130 // Quad registers
Dale Johannesen0d79b042010-10-28 01:05:37 +00004131 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4132 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004133};
4134
4135void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004136 unsigned &NumNames) const {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004137 Names = GCCRegNames;
4138 NumNames = llvm::array_lengthof(GCCRegNames);
4139}
4140
4141const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004142 { { "a1" }, "r0" },
4143 { { "a2" }, "r1" },
4144 { { "a3" }, "r2" },
4145 { { "a4" }, "r3" },
4146 { { "v1" }, "r4" },
4147 { { "v2" }, "r5" },
4148 { { "v3" }, "r6" },
4149 { { "v4" }, "r7" },
4150 { { "v5" }, "r8" },
4151 { { "v6", "rfp" }, "r9" },
4152 { { "sl" }, "r10" },
4153 { { "fp" }, "r11" },
4154 { { "ip" }, "r12" },
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004155 { { "r13" }, "sp" },
4156 { { "r14" }, "lr" },
4157 { { "r15" }, "pc" },
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004158 // The S, D and Q registers overlap, but aren't really aliases; we
4159 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004160};
4161
4162void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4163 unsigned &NumAliases) const {
4164 Aliases = GCCRegAliases;
4165 NumAliases = llvm::array_lengthof(GCCRegAliases);
4166}
Chris Lattnerb4527522010-03-03 19:03:45 +00004167
4168const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00004169#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00004170#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00004171 ALL_LANGUAGES },
Stephen Hines651f13c2014-04-23 16:59:28 -07004172#include "clang/Basic/BuiltinsNEON.def"
4173
4174#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004175#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Stephen Hines651f13c2014-04-23 16:59:28 -07004176#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4177 ALL_LANGUAGES },
Chris Lattnerb4527522010-03-03 19:03:45 +00004178#include "clang/Basic/BuiltinsARM.def"
4179};
Stephen Hines651f13c2014-04-23 16:59:28 -07004180
4181class ARMleTargetInfo : public ARMTargetInfo {
4182public:
4183 ARMleTargetInfo(const llvm::Triple &Triple)
4184 : ARMTargetInfo(Triple, false) { }
4185 virtual void getTargetDefines(const LangOptions &Opts,
4186 MacroBuilder &Builder) const {
4187 Builder.defineMacro("__ARMEL__");
4188 ARMTargetInfo::getTargetDefines(Opts, Builder);
4189 }
4190};
4191
4192class ARMbeTargetInfo : public ARMTargetInfo {
4193public:
4194 ARMbeTargetInfo(const llvm::Triple &Triple)
4195 : ARMTargetInfo(Triple, true) { }
4196 virtual void getTargetDefines(const LangOptions &Opts,
4197 MacroBuilder &Builder) const {
4198 Builder.defineMacro("__ARMEB__");
4199 Builder.defineMacro("__ARM_BIG_ENDIAN");
4200 ARMTargetInfo::getTargetDefines(Opts, Builder);
4201 }
4202};
Chris Lattner9fd73612008-04-21 18:56:49 +00004203} // end anonymous namespace.
4204
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004205namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004206class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4207 const llvm::Triple Triple;
4208public:
4209 WindowsARMTargetInfo(const llvm::Triple &Triple)
4210 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4211 TLSSupported = false;
4212 WCharType = UnsignedShort;
4213 SizeType = UnsignedInt;
4214 UserLabelPrefix = "";
4215 }
4216 void getVisualStudioDefines(const LangOptions &Opts,
4217 MacroBuilder &Builder) const {
4218 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4219
4220 // FIXME: this is invalid for WindowsCE
4221 Builder.defineMacro("_M_ARM_NT", "1");
4222 Builder.defineMacro("_M_ARMT", "_M_ARM");
4223 Builder.defineMacro("_M_THUMB", "_M_ARM");
4224
4225 assert((Triple.getArch() == llvm::Triple::arm ||
4226 Triple.getArch() == llvm::Triple::thumb) &&
4227 "invalid architecture for Windows ARM target info");
4228 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4229 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4230
4231 // TODO map the complete set of values
4232 // 31: VFPv3 40: VFPv4
4233 Builder.defineMacro("_M_ARM_FP", "31");
4234 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004235 BuiltinVaListKind getBuiltinVaListKind() const override {
4236 return TargetInfo::CharPtrBuiltinVaList;
4237 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004238};
4239
4240// Windows ARM + Itanium C++ ABI Target
4241class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4242public:
4243 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4244 : WindowsARMTargetInfo(Triple) {
4245 TheCXXABI.set(TargetCXXABI::GenericARM);
4246 }
4247
4248 void getTargetDefines(const LangOptions &Opts,
4249 MacroBuilder &Builder) const override {
4250 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4251
4252 if (Opts.MSVCCompat)
4253 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4254 }
4255};
4256
4257// Windows ARM, MS (C++) ABI
4258class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4259public:
4260 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4261 : WindowsARMTargetInfo(Triple) {
4262 TheCXXABI.set(TargetCXXABI::Microsoft);
4263 }
4264
4265 void getTargetDefines(const LangOptions &Opts,
4266 MacroBuilder &Builder) const override {
4267 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4268 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4269 }
4270};
4271}
4272
4273
4274namespace {
Mike Stump25cf7602009-09-09 15:08:12 +00004275class DarwinARMTargetInfo :
Stephen Hines651f13c2014-04-23 16:59:28 -07004276 public DarwinTargetInfo<ARMleTargetInfo> {
Edwin Török36565e52009-06-30 17:10:35 +00004277protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07004278 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4279 MacroBuilder &Builder) const override {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004280 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedman8f575172009-04-19 21:38:35 +00004281 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004282
Edwin Török36565e52009-06-30 17:10:35 +00004283public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004284 DarwinARMTargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004285 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar01045582010-05-27 07:00:26 +00004286 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004287 // iOS always has 64-bit atomic instructions.
Stephen Hines651f13c2014-04-23 16:59:28 -07004288 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman2be46072011-10-14 20:59:01 +00004289 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004290
4291 // Darwin on iOS uses a variant of the ARM C++ ABI.
4292 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar01045582010-05-27 07:00:26 +00004293 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004294};
4295} // end anonymous namespace.
4296
Tony Linthicum96319392011-12-12 21:14:55 +00004297
4298namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004299class AArch64TargetInfo : public TargetInfo {
4300 virtual void setDescriptionString() = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07004301 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4302 static const char *const GCCRegNames[];
4303
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004304 enum FPUModeEnum {
4305 FPUMode,
4306 NeonMode
4307 };
4308
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004309 std::string CPU;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004310 unsigned FPU;
4311 unsigned CRC;
4312 unsigned Crypto;
4313
Stephen Hines651f13c2014-04-23 16:59:28 -07004314 static const Builtin::Info BuiltinInfo[];
4315
4316 std::string ABI;
4317
4318public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004319 AArch64TargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004320 : TargetInfo(Triple), ABI("aapcs") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004321
4322 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4323 WCharType = SignedInt;
4324
4325 // NetBSD apparently prefers consistency across ARM targets to consistency
4326 // across 64-bit targets.
4327 Int64Type = SignedLongLong;
4328 IntMaxType = SignedLongLong;
4329 UIntMaxType = UnsignedLongLong;
4330 } else {
4331 WCharType = UnsignedInt;
4332 Int64Type = SignedLong;
4333 IntMaxType = SignedLong;
4334 UIntMaxType = UnsignedLong;
4335 }
4336
Stephen Hines651f13c2014-04-23 16:59:28 -07004337 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07004338 MaxVectorAlign = 128;
4339 RegParmMax = 8;
4340 MaxAtomicInlineWidth = 128;
4341 MaxAtomicPromoteWidth = 128;
4342
4343 LongDoubleWidth = LongDoubleAlign = 128;
4344 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4345
Stephen Hines651f13c2014-04-23 16:59:28 -07004346 // {} in inline assembly are neon specifiers, not assembly variant
4347 // specifiers.
4348 NoAsmVariants = true;
4349
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004350 // AArch64 targets default to using the ARM C++ ABI.
Stephen Hines651f13c2014-04-23 16:59:28 -07004351 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4352 }
4353
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004354 StringRef getABI() const override { return ABI; }
Stephen Hines651f13c2014-04-23 16:59:28 -07004355 virtual bool setABI(const std::string &Name) {
4356 if (Name != "aapcs" && Name != "darwinpcs")
4357 return false;
4358
4359 ABI = Name;
4360 return true;
4361 }
4362
4363 virtual bool setCPU(const std::string &Name) {
4364 bool CPUKnown = llvm::StringSwitch<bool>(Name)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004365 .Case("generic", true)
4366 .Cases("cortex-a53", "cortex-a57", true)
Stephen Hines651f13c2014-04-23 16:59:28 -07004367 .Case("cyclone", true)
4368 .Default(false);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004369 if (CPUKnown)
4370 CPU = Name;
Stephen Hines651f13c2014-04-23 16:59:28 -07004371 return CPUKnown;
4372 }
4373
4374 virtual void getTargetDefines(const LangOptions &Opts,
4375 MacroBuilder &Builder) const {
4376 // Target identification.
Stephen Hines651f13c2014-04-23 16:59:28 -07004377 Builder.defineMacro("__aarch64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004378
4379 // Target properties.
4380 Builder.defineMacro("_LP64");
4381 Builder.defineMacro("__LP64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004382
4383 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4384 Builder.defineMacro("__ARM_ACLE", "200");
4385 Builder.defineMacro("__ARM_ARCH", "8");
4386 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4387
4388 Builder.defineMacro("__ARM_64BIT_STATE");
4389 Builder.defineMacro("__ARM_PCS_AAPCS64");
4390 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4391
4392 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4393 Builder.defineMacro("__ARM_FEATURE_CLZ");
4394 Builder.defineMacro("__ARM_FEATURE_FMA");
4395 Builder.defineMacro("__ARM_FEATURE_DIV");
4396
4397 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4398
4399 // 0xe implies support for half, single and double precision operations.
4400 Builder.defineMacro("__ARM_FP", "0xe");
4401
4402 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4403 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4404 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4405
4406 if (Opts.FastMath || Opts.FiniteMathOnly)
4407 Builder.defineMacro("__ARM_FP_FAST");
4408
4409 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4410 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4411
4412 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4413
4414 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4415 Opts.ShortEnums ? "1" : "4");
4416
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004417 if (FPU == NeonMode) {
4418 Builder.defineMacro("__ARM_NEON");
4419 // 64-bit NEON supports half, single and double precision operations.
4420 Builder.defineMacro("__ARM_NEON_FP", "0xe");
4421 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004422
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004423 if (CRC)
4424 Builder.defineMacro("__ARM_FEATURE_CRC32");
Stephen Hines651f13c2014-04-23 16:59:28 -07004425
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004426 if (Crypto)
4427 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Stephen Hines651f13c2014-04-23 16:59:28 -07004428 }
4429
4430 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4431 unsigned &NumRecords) const {
4432 Records = BuiltinInfo;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004433 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Stephen Hines651f13c2014-04-23 16:59:28 -07004434 }
4435
4436 virtual bool hasFeature(StringRef Feature) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004437 return Feature == "aarch64" ||
4438 Feature == "arm64" ||
4439 (Feature == "neon" && FPU == NeonMode);
4440 }
4441
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004442 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
4443
4444 if (CPU == "cyclone") {
4445 Features["fp-armv8"] = true;
4446 Features["neon"] = true;
4447 Features["crypto"] = true;
4448 Features["crc"] = true;
4449 Features["zcm"] = true;
4450 Features["zcz"] = true;
4451 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
4452 Features["fp-armv8"] = true;
4453 Features["neon"] = true;
4454 Features["crypto"] = true;
4455 Features["crc"] = true;
4456 }
4457}
4458
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004459 bool handleTargetFeatures(std::vector<std::string> &Features,
4460 DiagnosticsEngine &Diags) override {
4461 FPU = FPUMode;
4462 CRC = 0;
4463 Crypto = 0;
4464 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4465 if (Features[i] == "+neon")
4466 FPU = NeonMode;
4467 if (Features[i] == "+crc")
4468 CRC = 1;
4469 if (Features[i] == "+crypto")
4470 Crypto = 1;
4471 }
4472
4473 setDescriptionString();
4474
4475 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004476 }
4477
4478 virtual bool isCLZForZeroUndef() const { return false; }
4479
4480 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4481 return TargetInfo::AArch64ABIBuiltinVaList;
4482 }
4483
4484 virtual void getGCCRegNames(const char *const *&Names,
4485 unsigned &NumNames) const;
4486 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4487 unsigned &NumAliases) const;
4488
4489 virtual bool validateAsmConstraint(const char *&Name,
4490 TargetInfo::ConstraintInfo &Info) const {
4491 switch (*Name) {
4492 default:
4493 return false;
4494 case 'w': // Floating point and SIMD registers (V0-V31)
4495 Info.setAllowsRegister();
4496 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004497 case 'I': // Constant that can be used with an ADD instruction
4498 case 'J': // Constant that can be used with a SUB instruction
4499 case 'K': // Constant that can be used with a 32-bit logical instruction
4500 case 'L': // Constant that can be used with a 64-bit logical instruction
4501 case 'M': // Constant that can be used as a 32-bit MOV immediate
4502 case 'N': // Constant that can be used as a 64-bit MOV immediate
4503 case 'Y': // Floating point constant zero
4504 case 'Z': // Integer constant zero
4505 return true;
4506 case 'Q': // A memory reference with base register and no offset
4507 Info.setAllowsMemory();
4508 return true;
4509 case 'S': // A symbolic address
4510 Info.setAllowsRegister();
4511 return true;
4512 case 'U':
4513 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4514 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4515 // Usa: An absolute symbolic address
4516 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4517 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Stephen Hines651f13c2014-04-23 16:59:28 -07004518 case 'z': // Zero register, wzr or xzr
4519 Info.setAllowsRegister();
4520 return true;
4521 case 'x': // Floating point and SIMD registers (V0-V15)
4522 Info.setAllowsRegister();
4523 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004524 }
4525 return false;
4526 }
4527
Stephen Hines651f13c2014-04-23 16:59:28 -07004528 virtual const char *getClobbers() const { return ""; }
4529
4530 int getEHDataRegisterNumber(unsigned RegNo) const {
4531 if (RegNo == 0)
4532 return 0;
4533 if (RegNo == 1)
4534 return 1;
4535 return -1;
4536 }
4537};
4538
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004539const char *const AArch64TargetInfo::GCCRegNames[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004540 // 32-bit Integer registers
4541 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4542 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4543 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4544
4545 // 64-bit Integer registers
4546 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4547 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4548 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4549
4550 // 32-bit floating point regsisters
4551 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4552 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4553 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4554
4555 // 64-bit floating point regsisters
4556 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4557 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4558 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4559
4560 // Vector registers
4561 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4562 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4563 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4564};
4565
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004566void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Stephen Hines651f13c2014-04-23 16:59:28 -07004567 unsigned &NumNames) const {
4568 Names = GCCRegNames;
4569 NumNames = llvm::array_lengthof(GCCRegNames);
4570}
4571
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004572const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004573 { { "w31" }, "wsp" },
4574 { { "x29" }, "fp" },
4575 { { "x30" }, "lr" },
4576 { { "x31" }, "sp" },
4577 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4578 // don't want to substitute one of these for a different-sized one.
4579};
4580
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004581void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Stephen Hines651f13c2014-04-23 16:59:28 -07004582 unsigned &NumAliases) const {
4583 Aliases = GCCRegAliases;
4584 NumAliases = llvm::array_lengthof(GCCRegAliases);
4585}
4586
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004587const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004588#define BUILTIN(ID, TYPE, ATTRS) \
4589 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4590#include "clang/Basic/BuiltinsNEON.def"
4591
4592#define BUILTIN(ID, TYPE, ATTRS) \
4593 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004594#include "clang/Basic/BuiltinsAArch64.def"
4595};
4596
4597class AArch64leTargetInfo : public AArch64TargetInfo {
4598 void setDescriptionString() override {
4599 if (getTriple().isOSBinFormatMachO())
4600 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4601 else
4602 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4603 }
4604
4605public:
4606 AArch64leTargetInfo(const llvm::Triple &Triple)
4607 : AArch64TargetInfo(Triple) {
4608 BigEndian = false;
4609 }
4610 void getTargetDefines(const LangOptions &Opts,
4611 MacroBuilder &Builder) const override {
4612 Builder.defineMacro("__AARCH64EL__");
4613 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4614 }
4615};
4616
4617class AArch64beTargetInfo : public AArch64TargetInfo {
4618 void setDescriptionString() override {
4619 assert(!getTriple().isOSBinFormatMachO());
4620 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4621 }
4622
4623public:
4624 AArch64beTargetInfo(const llvm::Triple &Triple)
4625 : AArch64TargetInfo(Triple) { }
4626 void getTargetDefines(const LangOptions &Opts,
4627 MacroBuilder &Builder) const override {
4628 Builder.defineMacro("__AARCH64EB__");
4629 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4630 Builder.defineMacro("__ARM_BIG_ENDIAN");
4631 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4632 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004633};
4634} // end anonymous namespace.
4635
4636namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004637class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
4638protected:
4639 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4640 MacroBuilder &Builder) const override {
4641 Builder.defineMacro("__AARCH64_SIMD__");
4642 Builder.defineMacro("__ARM64_ARCH_8__");
4643 Builder.defineMacro("__ARM_NEON__");
4644 Builder.defineMacro("__LITTLE_ENDIAN__");
4645 Builder.defineMacro("__REGISTER_PREFIX__", "");
4646 Builder.defineMacro("__arm64", "1");
4647 Builder.defineMacro("__arm64__", "1");
4648
4649 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4650 }
4651
Stephen Hines651f13c2014-04-23 16:59:28 -07004652public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004653 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4654 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004655 Int64Type = SignedLongLong;
4656 WCharType = SignedInt;
4657 UseSignedCharForObjCBool = false;
4658
4659 LongDoubleWidth = LongDoubleAlign = 64;
4660 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4661
4662 TheCXXABI.set(TargetCXXABI::iOS64);
4663 }
4664
4665 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4666 return TargetInfo::CharPtrBuiltinVaList;
4667 }
4668};
4669} // end anonymous namespace
4670
4671namespace {
Tony Linthicum96319392011-12-12 21:14:55 +00004672// Hexagon abstract base class
4673class HexagonTargetInfo : public TargetInfo {
4674 static const Builtin::Info BuiltinInfo[];
4675 static const char * const GCCRegNames[];
4676 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4677 std::string CPU;
4678public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004679 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004680 BigEndian = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07004681 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum96319392011-12-12 21:14:55 +00004682
4683 // {} in inline assembly are packet specifiers, not assembly variant
4684 // specifiers.
4685 NoAsmVariants = true;
4686 }
4687
Stephen Hines651f13c2014-04-23 16:59:28 -07004688 void getTargetBuiltins(const Builtin::Info *&Records,
4689 unsigned &NumRecords) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004690 Records = BuiltinInfo;
4691 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4692 }
4693
Stephen Hines651f13c2014-04-23 16:59:28 -07004694 bool validateAsmConstraint(const char *&Name,
4695 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004696 return true;
4697 }
4698
Stephen Hines651f13c2014-04-23 16:59:28 -07004699 void getTargetDefines(const LangOptions &Opts,
4700 MacroBuilder &Builder) const override;
Tony Linthicum96319392011-12-12 21:14:55 +00004701
Stephen Hines651f13c2014-04-23 16:59:28 -07004702 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00004703 return Feature == "hexagon";
4704 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004705
4706 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00004707 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00004708 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004709 void getGCCRegNames(const char * const *&Names,
4710 unsigned &NumNames) const override;
4711 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4712 unsigned &NumAliases) const override;
4713 const char *getClobbers() const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004714 return "";
4715 }
Sebastian Pop43115d42012-01-13 20:37:10 +00004716
4717 static const char *getHexagonCPUSuffix(StringRef Name) {
4718 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00004719 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00004720 .Case("hexagonv5", "5")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004721 .Default(nullptr);
Sebastian Pop43115d42012-01-13 20:37:10 +00004722 }
4723
Stephen Hines651f13c2014-04-23 16:59:28 -07004724 bool setCPU(const std::string &Name) override {
Sebastian Pop43115d42012-01-13 20:37:10 +00004725 if (!getHexagonCPUSuffix(Name))
4726 return false;
4727
Tony Linthicum96319392011-12-12 21:14:55 +00004728 CPU = Name;
4729 return true;
4730 }
4731};
4732
4733void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4734 MacroBuilder &Builder) const {
4735 Builder.defineMacro("qdsp6");
4736 Builder.defineMacro("__qdsp6", "1");
4737 Builder.defineMacro("__qdsp6__", "1");
4738
4739 Builder.defineMacro("hexagon");
4740 Builder.defineMacro("__hexagon", "1");
4741 Builder.defineMacro("__hexagon__", "1");
4742
4743 if(CPU == "hexagonv1") {
4744 Builder.defineMacro("__HEXAGON_V1__");
4745 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4746 if(Opts.HexagonQdsp6Compat) {
4747 Builder.defineMacro("__QDSP6_V1__");
4748 Builder.defineMacro("__QDSP6_ARCH__", "1");
4749 }
4750 }
4751 else if(CPU == "hexagonv2") {
4752 Builder.defineMacro("__HEXAGON_V2__");
4753 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4754 if(Opts.HexagonQdsp6Compat) {
4755 Builder.defineMacro("__QDSP6_V2__");
4756 Builder.defineMacro("__QDSP6_ARCH__", "2");
4757 }
4758 }
4759 else if(CPU == "hexagonv3") {
4760 Builder.defineMacro("__HEXAGON_V3__");
4761 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4762 if(Opts.HexagonQdsp6Compat) {
4763 Builder.defineMacro("__QDSP6_V3__");
4764 Builder.defineMacro("__QDSP6_ARCH__", "3");
4765 }
4766 }
4767 else if(CPU == "hexagonv4") {
4768 Builder.defineMacro("__HEXAGON_V4__");
4769 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4770 if(Opts.HexagonQdsp6Compat) {
4771 Builder.defineMacro("__QDSP6_V4__");
4772 Builder.defineMacro("__QDSP6_ARCH__", "4");
4773 }
4774 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004775 else if(CPU == "hexagonv5") {
4776 Builder.defineMacro("__HEXAGON_V5__");
4777 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4778 if(Opts.HexagonQdsp6Compat) {
4779 Builder.defineMacro("__QDSP6_V5__");
4780 Builder.defineMacro("__QDSP6_ARCH__", "5");
4781 }
4782 }
Tony Linthicum96319392011-12-12 21:14:55 +00004783}
4784
4785const char * const HexagonTargetInfo::GCCRegNames[] = {
4786 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4787 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4788 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4789 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4790 "p0", "p1", "p2", "p3",
4791 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4792};
4793
4794void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4795 unsigned &NumNames) const {
4796 Names = GCCRegNames;
4797 NumNames = llvm::array_lengthof(GCCRegNames);
4798}
4799
4800
4801const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4802 { { "sp" }, "r29" },
4803 { { "fp" }, "r30" },
4804 { { "lr" }, "r31" },
4805 };
4806
4807void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4808 unsigned &NumAliases) const {
4809 Aliases = GCCRegAliases;
4810 NumAliases = llvm::array_lengthof(GCCRegAliases);
4811}
4812
4813
4814const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4815#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4816#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4817 ALL_LANGUAGES },
4818#include "clang/Basic/BuiltinsHexagon.def"
4819};
4820}
4821
4822
Chris Lattner4b009652007-07-25 00:24:17 +00004823namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004824// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4825class SparcTargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004826 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4827 static const char * const GCCRegNames[];
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004828 bool SoftFloat;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004829public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004830 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004831
Stephen Hines651f13c2014-04-23 16:59:28 -07004832 bool handleTargetFeatures(std::vector<std::string> &Features,
4833 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004834 SoftFloat = false;
4835 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4836 if (Features[i] == "+soft-float")
4837 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00004838 return true;
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004839 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004840 void getTargetDefines(const LangOptions &Opts,
4841 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004842 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004843 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004844
4845 if (SoftFloat)
4846 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004847 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004848
4849 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00004850 return llvm::StringSwitch<bool>(Feature)
4851 .Case("softfloat", SoftFloat)
4852 .Case("sparc", true)
4853 .Default(false);
4854 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004855
4856 void getTargetBuiltins(const Builtin::Info *&Records,
4857 unsigned &NumRecords) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00004858 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004859 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004860 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00004861 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004862 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004863 void getGCCRegNames(const char * const *&Names,
4864 unsigned &NumNames) const override;
4865 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4866 unsigned &NumAliases) const override;
4867 bool validateAsmConstraint(const char *&Name,
4868 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00004869 // FIXME: Implement!
4870 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004871 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004872 const char *getClobbers() const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00004873 // FIXME: Implement!
4874 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004875 }
4876};
4877
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004878const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004879 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4880 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4881 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4882 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4883};
4884
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004885void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4886 unsigned &NumNames) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004887 Names = GCCRegNames;
4888 NumNames = llvm::array_lengthof(GCCRegNames);
4889}
4890
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004891const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikove7772382009-05-03 13:42:53 +00004892 { { "g0" }, "r0" },
4893 { { "g1" }, "r1" },
4894 { { "g2" }, "r2" },
4895 { { "g3" }, "r3" },
4896 { { "g4" }, "r4" },
4897 { { "g5" }, "r5" },
4898 { { "g6" }, "r6" },
4899 { { "g7" }, "r7" },
4900 { { "o0" }, "r8" },
4901 { { "o1" }, "r9" },
4902 { { "o2" }, "r10" },
4903 { { "o3" }, "r11" },
4904 { { "o4" }, "r12" },
4905 { { "o5" }, "r13" },
4906 { { "o6", "sp" }, "r14" },
4907 { { "o7" }, "r15" },
4908 { { "l0" }, "r16" },
4909 { { "l1" }, "r17" },
4910 { { "l2" }, "r18" },
4911 { { "l3" }, "r19" },
4912 { { "l4" }, "r20" },
4913 { { "l5" }, "r21" },
4914 { { "l6" }, "r22" },
4915 { { "l7" }, "r23" },
4916 { { "i0" }, "r24" },
4917 { { "i1" }, "r25" },
4918 { { "i2" }, "r26" },
4919 { { "i3" }, "r27" },
4920 { { "i4" }, "r28" },
4921 { { "i5" }, "r29" },
4922 { { "i6", "fp" }, "r30" },
4923 { { "i7" }, "r31" },
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004924};
4925
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004926void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4927 unsigned &NumAliases) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004928 Aliases = GCCRegAliases;
4929 NumAliases = llvm::array_lengthof(GCCRegAliases);
4930}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004931
4932// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4933class SparcV8TargetInfo : public SparcTargetInfo {
4934public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004935 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004936 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004937 }
4938
Stephen Hines651f13c2014-04-23 16:59:28 -07004939 void getTargetDefines(const LangOptions &Opts,
4940 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004941 SparcTargetInfo::getTargetDefines(Opts, Builder);
4942 Builder.defineMacro("__sparcv8");
4943 }
4944};
4945
4946// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4947class SparcV9TargetInfo : public SparcTargetInfo {
4948public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004949 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004950 // FIXME: Support Sparc quad-precision long double?
Stephen Hines651f13c2014-04-23 16:59:28 -07004951 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00004952 // This is an LP64 platform.
4953 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00004954
4955 // OpenBSD uses long long for int64_t and intmax_t.
4956 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4957 IntMaxType = SignedLongLong;
4958 UIntMaxType = UnsignedLongLong;
4959 } else {
4960 IntMaxType = SignedLong;
4961 UIntMaxType = UnsignedLong;
4962 }
4963 Int64Type = IntMaxType;
Stephen Hines651f13c2014-04-23 16:59:28 -07004964
4965 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4966 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4967 LongDoubleWidth = 128;
4968 LongDoubleAlign = 128;
4969 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4970 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004971 }
4972
Stephen Hines651f13c2014-04-23 16:59:28 -07004973 void getTargetDefines(const LangOptions &Opts,
4974 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004975 SparcTargetInfo::getTargetDefines(Opts, Builder);
4976 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00004977 Builder.defineMacro("__arch64__");
4978 // Solaris and its derivative AuroraUX don't need these variants, but the
4979 // BSDs do.
4980 if (getTriple().getOS() != llvm::Triple::Solaris &&
4981 getTriple().getOS() != llvm::Triple::AuroraUX) {
4982 Builder.defineMacro("__sparc64__");
4983 Builder.defineMacro("__sparc_v9__");
4984 Builder.defineMacro("__sparcv9__");
4985 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004986 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004987
4988 bool setCPU(const std::string &Name) override {
4989 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4990 .Case("v9", true)
4991 .Case("ultrasparc", true)
4992 .Case("ultrasparc3", true)
4993 .Case("niagara", true)
4994 .Case("niagara2", true)
4995 .Case("niagara3", true)
4996 .Case("niagara4", true)
4997 .Default(false);
4998
4999 // No need to store the CPU yet. There aren't any CPU-specific
5000 // macros to define.
5001 return CPUKnown;
5002 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005003};
5004
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005005} // end anonymous namespace.
5006
Eli Friedmanff158dd2008-08-20 07:28:14 +00005007namespace {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00005008class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5009public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005010 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5011 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00005012 SizeType = UnsignedInt;
5013 PtrDiffType = SignedInt;
5014 }
5015};
Edwin Török36565e52009-06-30 17:10:35 +00005016class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005017public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005018 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5019 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedman7cca0982008-11-02 02:43:55 +00005020 SizeType = UnsignedInt;
5021 PtrDiffType = SignedInt;
Eli Friedmanff158dd2008-08-20 07:28:14 +00005022 }
5023};
5024} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00005025
Chris Lattner85970f32008-05-08 05:58:21 +00005026namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005027class SystemZTargetInfo : public TargetInfo {
5028 static const char *const GCCRegNames[];
Ulrich Weigandb8409212013-05-06 16:26:41 +00005029
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005030public:
5031 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5032 TLSSupported = true;
5033 IntWidth = IntAlign = 32;
5034 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5035 PointerWidth = PointerAlign = 64;
5036 LongDoubleWidth = 128;
5037 LongDoubleAlign = 64;
5038 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5039 MinGlobalAlign = 16;
5040 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5041 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5042 }
5043 void getTargetDefines(const LangOptions &Opts,
5044 MacroBuilder &Builder) const override {
5045 Builder.defineMacro("__s390__");
5046 Builder.defineMacro("__s390x__");
5047 Builder.defineMacro("__zarch__");
5048 Builder.defineMacro("__LONG_DOUBLE_128__");
5049 }
5050 void getTargetBuiltins(const Builtin::Info *&Records,
5051 unsigned &NumRecords) const override {
5052 // FIXME: Implement.
5053 Records = nullptr;
5054 NumRecords = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005055 }
5056
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005057 void getGCCRegNames(const char *const *&Names,
5058 unsigned &NumNames) const override;
5059 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5060 unsigned &NumAliases) const override {
5061 // No aliases.
5062 Aliases = nullptr;
5063 NumAliases = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005064 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005065 bool validateAsmConstraint(const char *&Name,
5066 TargetInfo::ConstraintInfo &info) const override;
5067 const char *getClobbers() const override {
5068 // FIXME: Is this really right?
5069 return "";
5070 }
5071 BuiltinVaListKind getBuiltinVaListKind() const override {
5072 return TargetInfo::SystemZBuiltinVaList;
5073 }
5074 bool setCPU(const std::string &Name) override {
5075 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5076 .Case("z10", true)
5077 .Case("z196", true)
5078 .Case("zEC12", true)
5079 .Default(false);
5080
5081 // No need to store the CPU yet. There aren't any CPU-specific
5082 // macros to define.
5083 return CPUKnown;
5084 }
5085};
5086
5087const char *const SystemZTargetInfo::GCCRegNames[] = {
5088 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5089 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5090 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5091 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5092};
5093
5094void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5095 unsigned &NumNames) const {
5096 Names = GCCRegNames;
5097 NumNames = llvm::array_lengthof(GCCRegNames);
5098}
5099
5100bool SystemZTargetInfo::
5101validateAsmConstraint(const char *&Name,
5102 TargetInfo::ConstraintInfo &Info) const {
5103 switch (*Name) {
5104 default:
5105 return false;
5106
5107 case 'a': // Address register
5108 case 'd': // Data register (equivalent to 'r')
5109 case 'f': // Floating-point register
5110 Info.setAllowsRegister();
5111 return true;
5112
5113 case 'I': // Unsigned 8-bit constant
5114 case 'J': // Unsigned 12-bit constant
5115 case 'K': // Signed 16-bit constant
5116 case 'L': // Signed 20-bit displacement (on all targets we support)
5117 case 'M': // 0x7fffffff
5118 return true;
5119
5120 case 'Q': // Memory with base and unsigned 12-bit displacement
5121 case 'R': // Likewise, plus an index
5122 case 'S': // Memory with base and signed 20-bit displacement
5123 case 'T': // Likewise, plus an index
5124 Info.setAllowsMemory();
5125 return true;
5126 }
5127}
Ulrich Weigandb8409212013-05-06 16:26:41 +00005128}
5129
5130namespace {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005131 class MSP430TargetInfo : public TargetInfo {
5132 static const char * const GCCRegNames[];
5133 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005134 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005135 BigEndian = false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005136 TLSSupported = false;
Anton Korobeynikov2a6630a2010-01-30 12:55:11 +00005137 IntWidth = 16; IntAlign = 16;
5138 LongWidth = 32; LongLongWidth = 64;
5139 LongAlign = LongLongAlign = 16;
5140 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005141 SuitableAlign = 16;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005142 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005143 IntMaxType = SignedLongLong;
5144 UIntMaxType = UnsignedLongLong;
5145 IntPtrType = SignedInt;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005146 PtrDiffType = SignedInt;
Edward O'Callaghan14a70a32009-11-21 00:49:54 +00005147 SigAtomicType = SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07005148 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
5149 }
5150 void getTargetDefines(const LangOptions &Opts,
5151 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005152 Builder.defineMacro("MSP430");
5153 Builder.defineMacro("__MSP430__");
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005154 // FIXME: defines for different 'flavours' of MCU
5155 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005156 void getTargetBuiltins(const Builtin::Info *&Records,
5157 unsigned &NumRecords) const override {
5158 // FIXME: Implement.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005159 Records = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005160 NumRecords = 0;
5161 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005162 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005163 return Feature == "msp430";
5164 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005165 void getGCCRegNames(const char * const *&Names,
5166 unsigned &NumNames) const override;
5167 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5168 unsigned &NumAliases) const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005169 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005170 Aliases = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005171 NumAliases = 0;
5172 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005173 bool validateAsmConstraint(const char *&Name,
5174 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov174219b2009-10-15 23:17:13 +00005175 // No target constraints for now.
5176 return false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005177 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005178 const char *getClobbers() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005179 // FIXME: Is this really right?
5180 return "";
5181 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005182 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005183 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00005184 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005185 }
5186 };
5187
5188 const char * const MSP430TargetInfo::GCCRegNames[] = {
5189 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5190 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5191 };
5192
5193 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5194 unsigned &NumNames) const {
5195 Names = GCCRegNames;
5196 NumNames = llvm::array_lengthof(GCCRegNames);
5197 }
5198}
5199
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00005200namespace {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005201
Mike Stump25cf7602009-09-09 15:08:12 +00005202 // LLVM and Clang cannot be used directly to output native binaries for
5203 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005204 // type and alignment information.
Mike Stump25cf7602009-09-09 15:08:12 +00005205 //
5206 // TCE uses the llvm bitcode as input and uses it for generating customized
5207 // target processor and program binary. TCE co-design environment is
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005208 // publicly available in http://tce.cs.tut.fi
5209
Eli Friedman209f5bb2011-10-07 19:51:42 +00005210 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5211 3, // opencl_global
5212 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00005213 5, // opencl_constant
5214 0, // cuda_device
5215 0, // cuda_constant
5216 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00005217 };
5218
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005219 class TCETargetInfo : public TargetInfo{
5220 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005221 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005222 TLSSupported = false;
5223 IntWidth = 32;
5224 LongWidth = LongLongWidth = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005225 PointerWidth = 32;
5226 IntAlign = 32;
5227 LongAlign = LongLongAlign = 32;
5228 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005229 SuitableAlign = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005230 SizeType = UnsignedInt;
5231 IntMaxType = SignedLong;
5232 UIntMaxType = UnsignedLong;
5233 IntPtrType = SignedInt;
5234 PtrDiffType = SignedInt;
5235 FloatWidth = 32;
5236 FloatAlign = 32;
5237 DoubleWidth = 32;
5238 DoubleAlign = 32;
5239 LongDoubleWidth = 32;
5240 LongDoubleAlign = 32;
5241 FloatFormat = &llvm::APFloat::IEEEsingle;
5242 DoubleFormat = &llvm::APFloat::IEEEsingle;
5243 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Stephen Hines651f13c2014-04-23 16:59:28 -07005244 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5245 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00005246 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005247 UseAddrSpaceMapMangling = true;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005248 }
5249
Stephen Hines651f13c2014-04-23 16:59:28 -07005250 void getTargetDefines(const LangOptions &Opts,
5251 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005252 DefineStd(Builder, "tce", Opts);
5253 Builder.defineMacro("__TCE__");
5254 Builder.defineMacro("__TCE_V1__");
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005255 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005256 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005257 return Feature == "tce";
5258 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005259
5260 void getTargetBuiltins(const Builtin::Info *&Records,
5261 unsigned &NumRecords) const override {}
5262 const char *getClobbers() const override {
Daniel Dunbar2e967de2009-08-24 09:54:37 +00005263 return "";
5264 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005265 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005266 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005267 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005268 void getGCCRegNames(const char * const *&Names,
5269 unsigned &NumNames) const override {}
5270 bool validateAsmConstraint(const char *&Name,
5271 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005272 return true;
5273 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005274 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5275 unsigned &NumAliases) const override {}
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005276 };
5277}
5278
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005279namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005280class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005281 virtual void setDescriptionString() = 0;
5282
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005283 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005284 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005285 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005286 bool IsMicromips;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005287 bool IsNan2008;
Simon Atanasyand96e3152013-04-14 14:07:30 +00005288 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005289 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00005290 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005291 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005292 enum DspRevEnum {
5293 NoDSP, DSP1, DSP2
5294 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00005295 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005296
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005297protected:
Akira Hatanaka550ed202013-10-29 19:00:35 +00005298 bool HasFP64;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005299 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005300
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005301public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005302 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5303 const std::string &CPUStr)
5304 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005305 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005306 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005307
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005308 bool isNaN2008Default() const {
5309 return CPU == "mips32r6" || CPU == "mips64r6";
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005310 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005311
5312 bool isFP64Default() const {
5313 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5314 }
5315
5316 StringRef getABI() const override { return ABI; }
5317 bool setCPU(const std::string &Name) override {
5318 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5319 getTriple().getArch() == llvm::Triple::mipsel;
5320 CPU = Name;
5321 return llvm::StringSwitch<bool>(Name)
5322 .Case("mips1", IsMips32)
5323 .Case("mips2", IsMips32)
5324 .Case("mips3", true)
5325 .Case("mips4", true)
5326 .Case("mips5", true)
5327 .Case("mips32", IsMips32)
5328 .Case("mips32r2", IsMips32)
5329 .Case("mips32r6", IsMips32)
5330 .Case("mips64", true)
5331 .Case("mips64r2", true)
5332 .Case("mips64r6", true)
5333 .Case("octeon", true)
5334 .Default(false);
5335 }
5336 const std::string& getCPU() const { return CPU; }
Stephen Hines651f13c2014-04-23 16:59:28 -07005337 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5338 // The backend enables certain ABI's by default according to the
5339 // architecture.
5340 // Disable both possible defaults so that we don't end up with multiple
5341 // ABI's selected and trigger an assertion.
5342 Features["o32"] = false;
5343 Features["n64"] = false;
5344
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005345 Features[ABI] = true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005346 if (CPU == "octeon")
5347 Features["mips64r2"] = Features["cnmips"] = true;
5348 else
5349 Features[CPU] = true;
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005350 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005351
Stephen Hines651f13c2014-04-23 16:59:28 -07005352 void getTargetDefines(const LangOptions &Opts,
5353 MacroBuilder &Builder) const override {
5354 Builder.defineMacro("__mips__");
Simon Atanasyand4935a02012-08-29 19:14:58 +00005355 Builder.defineMacro("_mips");
Stephen Hines651f13c2014-04-23 16:59:28 -07005356 if (Opts.GNUMode)
5357 Builder.defineMacro("mips");
5358
Simon Atanasyand4935a02012-08-29 19:14:58 +00005359 Builder.defineMacro("__REGISTER_PREFIX__", "");
5360
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005361 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005362 case HardFloat:
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005363 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005364 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005365 case SoftFloat:
5366 Builder.defineMacro("__mips_soft_float", Twine(1));
5367 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00005368 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005369
Simon Atanasyand96e3152013-04-14 14:07:30 +00005370 if (IsSingleFloat)
5371 Builder.defineMacro("__mips_single_float", Twine(1));
5372
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005373 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5374 Builder.defineMacro("_MIPS_FPSET",
5375 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5376
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005377 if (IsMips16)
5378 Builder.defineMacro("__mips16", Twine(1));
5379
Simon Atanasyan321ae792013-04-14 14:07:51 +00005380 if (IsMicromips)
5381 Builder.defineMacro("__mips_micromips", Twine(1));
5382
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005383 if (IsNan2008)
5384 Builder.defineMacro("__mips_nan2008", Twine(1));
5385
Simon Atanasyana1b62272012-07-05 20:16:22 +00005386 switch (DspRev) {
5387 default:
5388 break;
5389 case DSP1:
5390 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5391 Builder.defineMacro("__mips_dsp", Twine(1));
5392 break;
5393 case DSP2:
5394 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5395 Builder.defineMacro("__mips_dspr2", Twine(1));
5396 Builder.defineMacro("__mips_dsp", Twine(1));
5397 break;
5398 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005399
Jack Carterc613b672013-08-12 17:20:29 +00005400 if (HasMSA)
5401 Builder.defineMacro("__mips_msa", Twine(1));
5402
Simon Atanasyan90913892012-04-05 19:28:31 +00005403 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5404 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5405 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00005406
5407 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5408 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005409 }
5410
Stephen Hines651f13c2014-04-23 16:59:28 -07005411 void getTargetBuiltins(const Builtin::Info *&Records,
5412 unsigned &NumRecords) const override {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005413 Records = BuiltinInfo;
5414 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005415 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005416 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka550ed202013-10-29 19:00:35 +00005417 return llvm::StringSwitch<bool>(Feature)
5418 .Case("mips", true)
5419 .Case("fp64", HasFP64)
5420 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00005421 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005422 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005423 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005424 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005425 void getGCCRegNames(const char * const *&Names,
5426 unsigned &NumNames) const override {
Daniel Sanders838f9332013-11-12 12:56:01 +00005427 static const char *const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00005428 // CPU register names
5429 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005430 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5431 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5432 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005433 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5434 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005435 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5436 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5437 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5438 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005439 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005440 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders838f9332013-11-12 12:56:01 +00005441 "$fcc5","$fcc6","$fcc7",
5442 // MSA register names
5443 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5444 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5445 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5446 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5447 // MSA control register names
5448 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5449 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005450 };
5451 Names = GCCRegNames;
5452 NumNames = llvm::array_lengthof(GCCRegNames);
5453 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005454 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5455 unsigned &NumAliases) const override = 0;
5456 bool validateAsmConstraint(const char *&Name,
5457 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005458 switch (*Name) {
5459 default:
Douglas Gregora95cba92011-11-02 20:52:01 +00005460 return false;
5461
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005462 case 'r': // CPU registers.
5463 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5464 case 'y': // Equivalent to "r", backwards compatibility only.
5465 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00005466 case 'c': // $25 for indirect jumps
5467 case 'l': // lo register
5468 case 'x': // hilo register pair
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005469 Info.setAllowsRegister();
5470 return true;
Jack Carter97102302013-03-05 19:10:54 +00005471 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00005472 Info.setAllowsMemory();
5473 return true;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005474 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005475 }
5476
Stephen Hines651f13c2014-04-23 16:59:28 -07005477 const char *getClobbers() const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005478 // FIXME: Implement!
5479 return "";
5480 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005481
Stephen Hines651f13c2014-04-23 16:59:28 -07005482 bool handleTargetFeatures(std::vector<std::string> &Features,
5483 DiagnosticsEngine &Diags) override {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005484 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005485 IsMicromips = false;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005486 IsNan2008 = isNaN2008Default();
Simon Atanasyand96e3152013-04-14 14:07:30 +00005487 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005488 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005489 DspRev = NoDSP;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005490 HasFP64 = isFP64Default();
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005491
5492 for (std::vector<std::string>::iterator it = Features.begin(),
5493 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005494 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00005495 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005496 else if (*it == "+soft-float")
5497 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005498 else if (*it == "+mips16")
5499 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005500 else if (*it == "+micromips")
5501 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005502 else if (*it == "+dsp")
5503 DspRev = std::max(DspRev, DSP1);
5504 else if (*it == "+dspr2")
5505 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00005506 else if (*it == "+msa")
5507 HasMSA = true;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005508 else if (*it == "+fp64")
5509 HasFP64 = true;
5510 else if (*it == "-fp64")
5511 HasFP64 = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005512 else if (*it == "+nan2008")
5513 IsNan2008 = true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005514 else if (*it == "-nan2008")
5515 IsNan2008 = false;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005516 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005517
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005518 // Remove front-end specific options.
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005519 std::vector<std::string>::iterator it =
5520 std::find(Features.begin(), Features.end(), "+soft-float");
5521 if (it != Features.end())
5522 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00005523
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005524 setDescriptionString();
5525
Rafael Espindola5389b842013-08-21 21:59:03 +00005526 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005527 }
Logan Chiena8f7a972013-02-23 04:24:36 +00005528
Stephen Hines651f13c2014-04-23 16:59:28 -07005529 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00005530 if (RegNo == 0) return 4;
5531 if (RegNo == 1) return 5;
5532 return -1;
5533 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005534
5535 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005536};
5537
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005538const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5539#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5540#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5541 ALL_LANGUAGES },
5542#include "clang/Basic/BuiltinsMips.def"
5543};
5544
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005545class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005546public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005547 Mips32TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07005548 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005549 SizeType = UnsignedInt;
5550 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005551 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005552 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005553 bool setABI(const std::string &Name) override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005554 if (Name == "o32" || Name == "eabi") {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005555 ABI = Name;
5556 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005557 }
5558 return false;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005559 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005560 void getTargetDefines(const LangOptions &Opts,
5561 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005562 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Douglas Gregorb7bcfe82011-11-09 15:17:16 +00005563
Stephen Hines651f13c2014-04-23 16:59:28 -07005564 Builder.defineMacro("__mips", "32");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005565 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5566
5567 const std::string& CPUStr = getCPU();
5568 if (CPUStr == "mips32")
5569 Builder.defineMacro("__mips_isa_rev", "1");
5570 else if (CPUStr == "mips32r2")
5571 Builder.defineMacro("__mips_isa_rev", "2");
Stephen Hines651f13c2014-04-23 16:59:28 -07005572
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005573 if (ABI == "o32") {
5574 Builder.defineMacro("__mips_o32");
5575 Builder.defineMacro("_ABIO32", "1");
5576 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5577 }
5578 else if (ABI == "eabi")
5579 Builder.defineMacro("__mips_eabi");
5580 else
David Blaikieb219cfc2011-09-23 05:06:16 +00005581 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005582 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005583 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5584 unsigned &NumAliases) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005585 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5586 { { "at" }, "$1" },
5587 { { "v0" }, "$2" },
5588 { { "v1" }, "$3" },
5589 { { "a0" }, "$4" },
5590 { { "a1" }, "$5" },
5591 { { "a2" }, "$6" },
5592 { { "a3" }, "$7" },
5593 { { "t0" }, "$8" },
5594 { { "t1" }, "$9" },
5595 { { "t2" }, "$10" },
5596 { { "t3" }, "$11" },
5597 { { "t4" }, "$12" },
5598 { { "t5" }, "$13" },
5599 { { "t6" }, "$14" },
5600 { { "t7" }, "$15" },
5601 { { "s0" }, "$16" },
5602 { { "s1" }, "$17" },
5603 { { "s2" }, "$18" },
5604 { { "s3" }, "$19" },
5605 { { "s4" }, "$20" },
5606 { { "s5" }, "$21" },
5607 { { "s6" }, "$22" },
5608 { { "s7" }, "$23" },
5609 { { "t8" }, "$24" },
5610 { { "t9" }, "$25" },
5611 { { "k0" }, "$26" },
5612 { { "k1" }, "$27" },
5613 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005614 { { "sp","$sp" }, "$29" },
5615 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005616 { { "ra" }, "$31" }
5617 };
5618 Aliases = GCCRegAliases;
5619 NumAliases = llvm::array_lengthof(GCCRegAliases);
5620 }
5621};
5622
5623class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005624 void setDescriptionString() override {
5625 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005626 }
5627
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005628public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005629 Mips32EBTargetInfo(const llvm::Triple &Triple)
5630 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005631 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005632 void getTargetDefines(const LangOptions &Opts,
5633 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005634 DefineStd(Builder, "MIPSEB", Opts);
5635 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005636 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005637 }
5638};
5639
5640class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005641 void setDescriptionString() override {
5642 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005643 }
5644
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005645public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005646 Mips32ELTargetInfo(const llvm::Triple &Triple)
5647 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005648 BigEndian = false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005649 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005650 void getTargetDefines(const LangOptions &Opts,
5651 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005652 DefineStd(Builder, "MIPSEL", Opts);
5653 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005654 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005655 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005656};
5657
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005658class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005659public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005660 Mips64TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07005661 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanaka12507592011-10-22 00:07:27 +00005662 LongDoubleWidth = LongDoubleAlign = 128;
5663 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00005664 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5665 LongDoubleWidth = LongDoubleAlign = 64;
5666 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5667 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005668 setN64ABITypes();
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005669 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005670 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanaka12507592011-10-22 00:07:27 +00005671 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005672
5673 void setN64ABITypes() {
5674 LongWidth = LongAlign = 64;
5675 PointerWidth = PointerAlign = 64;
5676 SizeType = UnsignedLong;
5677 PtrDiffType = SignedLong;
5678 }
5679
5680 void setN32ABITypes() {
5681 LongWidth = LongAlign = 32;
5682 PointerWidth = PointerAlign = 32;
5683 SizeType = UnsignedInt;
5684 PtrDiffType = SignedInt;
5685 }
5686
Stephen Hines651f13c2014-04-23 16:59:28 -07005687 bool setABI(const std::string &Name) override {
Akira Hatanaka12507592011-10-22 00:07:27 +00005688 if (Name == "n32") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005689 setN32ABITypes();
Simon Atanasyane9616a42013-02-27 14:55:49 +00005690 ABI = Name;
5691 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005692 }
5693 if (Name == "n64") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005694 setN64ABITypes();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005695 ABI = Name;
Simon Atanasyane9616a42013-02-27 14:55:49 +00005696 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005697 }
5698 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005699 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005700
Stephen Hines651f13c2014-04-23 16:59:28 -07005701 void getTargetDefines(const LangOptions &Opts,
5702 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005703 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005704
Stephen Hines651f13c2014-04-23 16:59:28 -07005705 Builder.defineMacro("__mips", "64");
Simon Atanasyan600a5132012-08-29 20:50:11 +00005706 Builder.defineMacro("__mips64");
5707 Builder.defineMacro("__mips64__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005708 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5709
5710 const std::string& CPUStr = getCPU();
5711 if (CPUStr == "mips64")
5712 Builder.defineMacro("__mips_isa_rev", "1");
5713 else if (CPUStr == "mips64r2")
5714 Builder.defineMacro("__mips_isa_rev", "2");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005715
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005716 if (ABI == "n32") {
5717 Builder.defineMacro("__mips_n32");
5718 Builder.defineMacro("_ABIN32", "2");
5719 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5720 }
5721 else if (ABI == "n64") {
5722 Builder.defineMacro("__mips_n64");
5723 Builder.defineMacro("_ABI64", "3");
5724 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5725 }
5726 else
5727 llvm_unreachable("Invalid ABI for Mips64.");
5728 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005729 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5730 unsigned &NumAliases) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005731 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5732 { { "at" }, "$1" },
5733 { { "v0" }, "$2" },
5734 { { "v1" }, "$3" },
5735 { { "a0" }, "$4" },
5736 { { "a1" }, "$5" },
5737 { { "a2" }, "$6" },
5738 { { "a3" }, "$7" },
5739 { { "a4" }, "$8" },
5740 { { "a5" }, "$9" },
5741 { { "a6" }, "$10" },
5742 { { "a7" }, "$11" },
5743 { { "t0" }, "$12" },
5744 { { "t1" }, "$13" },
5745 { { "t2" }, "$14" },
5746 { { "t3" }, "$15" },
5747 { { "s0" }, "$16" },
5748 { { "s1" }, "$17" },
5749 { { "s2" }, "$18" },
5750 { { "s3" }, "$19" },
5751 { { "s4" }, "$20" },
5752 { { "s5" }, "$21" },
5753 { { "s6" }, "$22" },
5754 { { "s7" }, "$23" },
5755 { { "t8" }, "$24" },
5756 { { "t9" }, "$25" },
5757 { { "k0" }, "$26" },
5758 { { "k1" }, "$27" },
5759 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005760 { { "sp","$sp" }, "$29" },
5761 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005762 { { "ra" }, "$31" }
5763 };
5764 Aliases = GCCRegAliases;
5765 NumAliases = llvm::array_lengthof(GCCRegAliases);
5766 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005767
5768 bool hasInt128Type() const override { return true; }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005769};
5770
5771class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005772 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005773 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07005774 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005775 else
Stephen Hines651f13c2014-04-23 16:59:28 -07005776 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005777
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005778 }
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005779
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005780public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005781 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005782 : Mips64TargetInfoBase(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07005783 void getTargetDefines(const LangOptions &Opts,
5784 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005785 DefineStd(Builder, "MIPSEB", Opts);
5786 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005787 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005788 }
5789};
5790
5791class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005792 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005793 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07005794 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005795 else
Stephen Hines651f13c2014-04-23 16:59:28 -07005796 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005797 }
5798public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005799 Mips64ELTargetInfo(const llvm::Triple &Triple)
5800 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005801 // Default ABI is n64.
5802 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005803 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005804 void getTargetDefines(const LangOptions &Opts,
5805 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005806 DefineStd(Builder, "MIPSEL", Opts);
5807 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005808 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005809 }
5810};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005811} // end anonymous namespace.
5812
Ivan Krasinef05abd2011-08-24 20:22:22 +00005813namespace {
5814class PNaClTargetInfo : public TargetInfo {
5815public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005816 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005817 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005818 this->UserLabelPrefix = "";
5819 this->LongAlign = 32;
5820 this->LongWidth = 32;
5821 this->PointerAlign = 32;
5822 this->PointerWidth = 32;
5823 this->IntMaxType = TargetInfo::SignedLongLong;
5824 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5825 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005826 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005827 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005828 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005829 this->SizeType = TargetInfo::UnsignedInt;
5830 this->PtrDiffType = TargetInfo::SignedInt;
5831 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00005832 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00005833 }
5834
Stephen Hines651f13c2014-04-23 16:59:28 -07005835 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005836 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005837 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005838 Builder.defineMacro("__le32__");
5839 Builder.defineMacro("__pnacl__");
5840 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005841 void getTargetDefines(const LangOptions &Opts,
5842 MacroBuilder &Builder) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005843 getArchDefines(Opts, Builder);
5844 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005845 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005846 return Feature == "pnacl";
5847 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005848 void getTargetBuiltins(const Builtin::Info *&Records,
5849 unsigned &NumRecords) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005850 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005851 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005852 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005853 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005854 void getGCCRegNames(const char * const *&Names,
5855 unsigned &NumNames) const override;
5856 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5857 unsigned &NumAliases) const override;
5858 bool validateAsmConstraint(const char *&Name,
5859 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005860 return false;
5861 }
5862
Stephen Hines651f13c2014-04-23 16:59:28 -07005863 const char *getClobbers() const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005864 return "";
5865 }
5866};
5867
5868void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5869 unsigned &NumNames) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005870 Names = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005871 NumNames = 0;
5872}
5873
5874void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5875 unsigned &NumAliases) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005876 Aliases = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005877 NumAliases = 0;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005878}
5879} // end anonymous namespace.
5880
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005881namespace {
5882 static const unsigned SPIRAddrSpaceMap[] = {
5883 1, // opencl_global
5884 3, // opencl_local
5885 2, // opencl_constant
5886 0, // cuda_device
5887 0, // cuda_constant
5888 0 // cuda_shared
5889 };
5890 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005891 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005892 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005893 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5894 "SPIR target must use unknown OS");
5895 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5896 "SPIR target must use unknown environment type");
5897 BigEndian = false;
5898 TLSSupported = false;
5899 LongWidth = LongAlign = 64;
5900 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005901 UseAddrSpaceMapMangling = true;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005902 // Define available target features
5903 // These must be defined in sorted order!
5904 NoAsmVariants = true;
5905 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005906 void getTargetDefines(const LangOptions &Opts,
5907 MacroBuilder &Builder) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005908 DefineStd(Builder, "SPIR", Opts);
5909 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005910 bool hasFeature(StringRef Feature) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005911 return Feature == "spir";
5912 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005913
5914 void getTargetBuiltins(const Builtin::Info *&Records,
5915 unsigned &NumRecords) const override {}
5916 const char *getClobbers() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005917 return "";
5918 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005919 void getGCCRegNames(const char * const *&Names,
5920 unsigned &NumNames) const override {}
5921 bool validateAsmConstraint(const char *&Name,
5922 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005923 return true;
5924 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005925 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5926 unsigned &NumAliases) const override {}
5927 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005928 return TargetInfo::VoidPtrBuiltinVaList;
5929 }
5930 };
5931
5932
5933 class SPIR32TargetInfo : public SPIRTargetInfo {
5934 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005935 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005936 PointerWidth = PointerAlign = 32;
5937 SizeType = TargetInfo::UnsignedInt;
5938 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5939 DescriptionString
Stephen Hines651f13c2014-04-23 16:59:28 -07005940 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5941 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005942 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005943 void getTargetDefines(const LangOptions &Opts,
5944 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00005945 DefineStd(Builder, "SPIR32", Opts);
5946 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005947 };
5948
5949 class SPIR64TargetInfo : public SPIRTargetInfo {
5950 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005951 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005952 PointerWidth = PointerAlign = 64;
5953 SizeType = TargetInfo::UnsignedLong;
5954 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07005955 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5956 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005957 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005958 void getTargetDefines(const LangOptions &Opts,
5959 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00005960 DefineStd(Builder, "SPIR64", Opts);
5961 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005962 };
5963}
5964
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005965namespace {
5966class XCoreTargetInfo : public TargetInfo {
5967 static const Builtin::Info BuiltinInfo[];
5968public:
5969 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5970 BigEndian = false;
5971 NoAsmVariants = true;
5972 LongLongAlign = 32;
5973 SuitableAlign = 32;
5974 DoubleAlign = LongDoubleAlign = 32;
Robert Lytton18162192013-11-12 10:09:30 +00005975 SizeType = UnsignedInt;
5976 PtrDiffType = SignedInt;
5977 IntPtrType = SignedInt;
5978 WCharType = UnsignedChar;
5979 WIntType = UnsignedInt;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005980 UseZeroLengthBitfieldAlignment = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07005981 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
5982 "-f64:32-a:0:32-n32";
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005983 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005984 void getTargetDefines(const LangOptions &Opts,
5985 MacroBuilder &Builder) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005986 Builder.defineMacro("__XS1B__");
5987 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005988 void getTargetBuiltins(const Builtin::Info *&Records,
5989 unsigned &NumRecords) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005990 Records = BuiltinInfo;
5991 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5992 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005993 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005994 return TargetInfo::VoidPtrBuiltinVaList;
5995 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005996 const char *getClobbers() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005997 return "";
5998 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005999 void getGCCRegNames(const char * const *&Names,
6000 unsigned &NumNames) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006001 static const char * const GCCRegNames[] = {
6002 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6003 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6004 };
6005 Names = GCCRegNames;
6006 NumNames = llvm::array_lengthof(GCCRegNames);
6007 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006008 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6009 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006010 Aliases = nullptr;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006011 NumAliases = 0;
6012 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006013 bool validateAsmConstraint(const char *&Name,
6014 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006015 return false;
6016 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006017 int getEHDataRegisterNumber(unsigned RegNo) const override {
6018 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6019 return (RegNo < 2)? RegNo : -1;
6020 }
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006021};
6022
6023const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6024#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6025#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6026 ALL_LANGUAGES },
6027#include "clang/Basic/BuiltinsXCore.def"
6028};
6029} // end anonymous namespace.
6030
Ivan Krasinef05abd2011-08-24 20:22:22 +00006031
Chris Lattner4b009652007-07-25 00:24:17 +00006032//===----------------------------------------------------------------------===//
6033// Driver code
6034//===----------------------------------------------------------------------===//
6035
Benjamin Kramer9df08232013-06-29 16:37:14 +00006036static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006037 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006038
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006039 switch (Triple.getArch()) {
6040 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006041 return nullptr;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006042
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006043 case llvm::Triple::xcore:
6044 return new XCoreTargetInfo(Triple);
6045
6046 case llvm::Triple::hexagon:
6047 return new HexagonTargetInfo(Triple);
6048
6049 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006050 case llvm::Triple::arm64:
6051 if (Triple.isOSDarwin())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006052 return new DarwinAArch64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006053
6054 switch (os) {
6055 case llvm::Triple::Linux:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006056 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
6057 case llvm::Triple::NetBSD:
6058 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006059 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006060 return new AArch64leTargetInfo(Triple);
6061 }
6062
Stephen Hines651f13c2014-04-23 16:59:28 -07006063 case llvm::Triple::aarch64_be:
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006064 case llvm::Triple::arm64_be:
Stephen Hines651f13c2014-04-23 16:59:28 -07006065 switch (os) {
6066 case llvm::Triple::Linux:
6067 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6068 case llvm::Triple::NetBSD:
6069 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6070 default:
6071 return new AArch64beTargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00006072 }
6073
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006074 case llvm::Triple::arm:
Daniel Dunbar3f361b52009-09-11 01:14:50 +00006075 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07006076 if (Triple.isOSBinFormatMachO())
6077 return new DarwinARMTargetInfo(Triple);
6078
6079 switch (os) {
6080 case llvm::Triple::Linux:
6081 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
6082 case llvm::Triple::FreeBSD:
6083 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
6084 case llvm::Triple::NetBSD:
6085 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
6086 case llvm::Triple::OpenBSD:
6087 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
6088 case llvm::Triple::Bitrig:
6089 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
6090 case llvm::Triple::RTEMS:
6091 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
6092 case llvm::Triple::NaCl:
6093 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006094 case llvm::Triple::Win32:
6095 switch (Triple.getEnvironment()) {
6096 default:
6097 return new ARMleTargetInfo(Triple);
6098 case llvm::Triple::Itanium:
6099 return new ItaniumWindowsARMleTargetInfo(Triple);
6100 case llvm::Triple::MSVC:
6101 return new MicrosoftARMleTargetInfo(Triple);
6102 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006103 default:
6104 return new ARMleTargetInfo(Triple);
6105 }
6106
6107 case llvm::Triple::armeb:
6108 case llvm::Triple::thumbeb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006109 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006110 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006111
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006112 switch (os) {
Rafael Espindolad16a2202010-06-10 00:46:51 +00006113 case llvm::Triple::Linux:
Stephen Hines651f13c2014-04-23 16:59:28 -07006114 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006115 case llvm::Triple::FreeBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006116 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006117 case llvm::Triple::NetBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006118 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006119 case llvm::Triple::OpenBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006120 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006121 case llvm::Triple::Bitrig:
Stephen Hines651f13c2014-04-23 16:59:28 -07006122 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006123 case llvm::Triple::RTEMS:
Stephen Hines651f13c2014-04-23 16:59:28 -07006124 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006125 case llvm::Triple::NaCl:
Stephen Hines651f13c2014-04-23 16:59:28 -07006126 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006127 default:
Stephen Hines651f13c2014-04-23 16:59:28 -07006128 return new ARMbeTargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006129 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006130
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006131 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006132 return new MSP430TargetInfo(Triple);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006133
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006134 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006135 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006136 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006137 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006138 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006139 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006140 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006141 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006142 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006143 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006144 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006145 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006146 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006147
6148 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006149 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006150 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006151 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006152 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006153 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006154 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006155 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006156 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006157 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicbbac9aa2013-09-21 01:27:01 +00006158 case llvm::Triple::NaCl:
6159 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006160 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006161 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006162 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00006163
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006164 case llvm::Triple::mips64:
6165 switch (os) {
6166 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006167 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006168 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006169 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006170 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006171 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006172 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006173 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006174 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006175 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006176 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006177 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006178 }
6179
6180 case llvm::Triple::mips64el:
6181 switch (os) {
6182 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006183 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006184 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006185 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006186 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006187 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006188 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006189 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006190 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006191 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006192 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006193 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006194 }
6195
Ivan Krasinef05abd2011-08-24 20:22:22 +00006196 case llvm::Triple::le32:
6197 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00006198 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006199 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00006200 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006201 return nullptr;
Chris Lattnere03ae302010-02-16 18:14:57 +00006202 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006203
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006204 case llvm::Triple::ppc:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006205 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006206 return new DarwinPPC32TargetInfo(Triple);
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00006207 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006208 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006209 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006210 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006211 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006212 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006213 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006214 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006215 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006216 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006217 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006218 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006219 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006220 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006221
6222 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006223 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006224 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006225 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006226 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006227 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006228 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006229 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006230 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006231 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006232 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006233 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006234 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006235 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006236 }
Daniel Dunbard58c03f2009-11-15 06:48:46 +00006237
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006238 case llvm::Triple::ppc64le:
6239 switch (os) {
6240 case llvm::Triple::Linux:
6241 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6242 default:
6243 return new PPC64TargetInfo(Triple);
Reid Spencer5f016e22007-07-11 17:01:13 +00006244 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006245
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006246 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006247 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006248 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006249 return new NVPTX64TargetInfo(Triple);
Chris Lattner2c026472010-03-06 21:21:27 +00006250
Eli Friedman6505a292012-10-12 23:32:00 +00006251 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006252 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00006253
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006254 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006255 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006256 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006257 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006258 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006259 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006260 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006261 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006262 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006263 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006264 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006265 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006266 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006267 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006268 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006269 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006270 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006271
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006272 case llvm::Triple::sparcv9:
6273 switch (os) {
6274 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006275 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006276 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006277 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006278 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006279 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006280 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006281 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006282 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006283 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006284 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006285 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006286 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006287 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006288 }
6289
Ulrich Weigandb8409212013-05-06 16:26:41 +00006290 case llvm::Triple::systemz:
6291 switch (os) {
6292 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006293 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006294 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006295 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006296 }
6297
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006298 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006299 return new TCETargetInfo(Triple);
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006300
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006301 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006302 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006303 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006304
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006305 switch (os) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00006306 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006307 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006308 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006309 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006310 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006311 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006312 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006313 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006314 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006315 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006316 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006317 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006318 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006319 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006320 case llvm::Triple::KFreeBSD:
6321 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner6f4bed52010-07-07 16:01:42 +00006322 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006323 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006324 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006325 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006326 case llvm::Triple::Win32: {
6327 switch (Triple.getEnvironment()) {
6328 default:
6329 return new X86_32TargetInfo(Triple);
6330 case llvm::Triple::Cygnus:
6331 return new CygwinX86_32TargetInfo(Triple);
6332 case llvm::Triple::GNU:
6333 return new MinGWX86_32TargetInfo(Triple);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006334 case llvm::Triple::Itanium:
Stephen Hines651f13c2014-04-23 16:59:28 -07006335 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006336 return new MicrosoftX86_32TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006337 }
6338 }
Chris Lattnerf853e732010-04-11 19:29:39 +00006339 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006340 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006341 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006342 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006343 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006344 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006345 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006346 return new X86_32TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006347 }
6348
6349 case llvm::Triple::x86_64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006350 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006351 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006352
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006353 switch (os) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00006354 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006355 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006356 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006357 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner1eac0812010-01-09 05:41:14 +00006358 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006359 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006360 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006361 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006362 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006363 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006364 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006365 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006366 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006367 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006368 case llvm::Triple::KFreeBSD:
6369 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006370 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006371 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006372 case llvm::Triple::Win32: {
6373 switch (Triple.getEnvironment()) {
6374 default:
6375 return new X86_64TargetInfo(Triple);
6376 case llvm::Triple::GNU:
6377 return new MinGWX86_64TargetInfo(Triple);
6378 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006379 return new MicrosoftX86_64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006380 }
6381 }
Eli Bendersky441d9f72012-12-04 18:38:10 +00006382 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006383 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006384 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006385 return new X86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006386 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006387
6388 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006389 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006390 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006391 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006392 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006393 }
6394 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006395 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006396 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006397 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006398 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006399 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006400 }
Chris Lattner4b009652007-07-25 00:24:17 +00006401}
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006402
6403/// CreateTargetInfo - Return the target info object for the specified target
6404/// triple.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006405TargetInfo *
6406TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6407 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregor49a87542012-11-16 04:24:59 +00006408 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006409
6410 // Construct the target
Stephen Hines651f13c2014-04-23 16:59:28 -07006411 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006412 if (!Target) {
6413 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006414 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006415 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006416 Target->TargetOpts = Opts;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006417
Daniel Dunbar33b40752009-12-18 18:42:37 +00006418 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006419 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6420 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006421 return nullptr;
Daniel Dunbar33b40752009-12-18 18:42:37 +00006422 }
6423
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006424 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006425 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6426 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006427 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006428 }
6429
Rafael Espindola5389b842013-08-21 21:59:03 +00006430 // Set the fp math unit.
6431 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6432 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006433 return nullptr;
Rafael Espindola5389b842013-08-21 21:59:03 +00006434 }
6435
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006436 // Compute the default target features, we need the target to handle this
6437 // because features may have dependencies on one another.
6438 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00006439 Target->getDefaultFeatures(Features);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006440
6441 // Apply the user specified deltas.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006442 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6443 I < N; ++I) {
6444 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006445 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006446 bool Enabled = Name[0] == '+';
6447 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006448 }
6449
6450 // Add the features to the compile options.
6451 //
6452 // FIXME: If we are completely confident that we have the right set, we only
6453 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00006454 Opts->Features.clear();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006455 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6456 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00006457 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3d11ced2013-10-16 21:26:26 +00006458 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006459 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006460
Stephen Hines651f13c2014-04-23 16:59:28 -07006461 return Target.release();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006462}