blob: 93435421d72240c55c0c62ec861db95f46ec72b2 [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) {
575 if (Opts.RTTI)
576 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
Michael J. Spencer01e70082010-10-21 05:21:48 +0000590 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000591 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer01e70082010-10-21 05:21:48 +0000592
Francois Pichet62ec1f22011-09-17 17:15:52 +0000593 if (Opts.MicrosoftExt) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000594 Builder.defineMacro("_MSC_EXTENSIONS");
595
Richard Smith80ad52f2013-01-02 11:42:31 +0000596 if (Opts.CPlusPlus11) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000597 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
598 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
599 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
600 }
601 }
602
603 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer01e70082010-10-21 05:21:48 +0000604 }
605
Michael J. Spencer01e70082010-10-21 05:21:48 +0000606public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000607 WindowsTargetInfo(const llvm::Triple &Triple)
608 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer01e70082010-10-21 05:21:48 +0000609};
610
Derek Schuff7da46f92012-10-11 16:55:58 +0000611template <typename Target>
612class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000613protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700614 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
615 MacroBuilder &Builder) const override {
Derek Schuff7da46f92012-10-11 16:55:58 +0000616 if (Opts.POSIXThreads)
617 Builder.defineMacro("_REENTRANT");
618 if (Opts.CPlusPlus)
619 Builder.defineMacro("_GNU_SOURCE");
620
621 DefineStd(Builder, "unix", Opts);
622 Builder.defineMacro("__ELF__");
623 Builder.defineMacro("__native_client__");
624 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000625
626public:
627 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000628 this->UserLabelPrefix = "";
629 this->LongAlign = 32;
630 this->LongWidth = 32;
631 this->PointerAlign = 32;
632 this->PointerWidth = 32;
633 this->IntMaxType = TargetInfo::SignedLongLong;
634 this->UIntMaxType = TargetInfo::UnsignedLongLong;
635 this->Int64Type = TargetInfo::SignedLongLong;
636 this->DoubleAlign = 64;
637 this->LongDoubleWidth = 64;
638 this->LongDoubleAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -0700639 this->LongLongWidth = 64;
640 this->LongLongAlign = 64;
Derek Schuff7da46f92012-10-11 16:55:58 +0000641 this->SizeType = TargetInfo::UnsignedInt;
642 this->PtrDiffType = TargetInfo::SignedInt;
643 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000644 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000645 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines651f13c2014-04-23 16:59:28 -0700646 if (Triple.getArch() == llvm::Triple::arm) {
647 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
648 } else if (Triple.getArch() == llvm::Triple::x86) {
649 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
650 } else if (Triple.getArch() == llvm::Triple::x86_64) {
651 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
652 } else if (Triple.getArch() == llvm::Triple::mipsel) {
653 // Handled on mips' setDescriptionString.
654 } else {
655 assert(Triple.getArch() == llvm::Triple::le32);
656 this->DescriptionString = "e-p:32:32-i64:64";
657 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000658 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700659 typename Target::CallingConvCheckResult checkCallingConvention(
660 CallingConv CC) const override {
Derek Schuff263366f2012-10-16 22:30:41 +0000661 return CC == CC_PnaclCall ? Target::CCCR_OK :
662 Target::checkCallingConvention(CC);
663 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000664};
Mike Stump25cf7602009-09-09 15:08:12 +0000665} // end anonymous namespace.
Edwin Török36565e52009-06-30 17:10:35 +0000666
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000667//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000668// Specific target implementations.
669//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000670
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000671namespace {
672// PPC abstract base class
673class PPCTargetInfo : public TargetInfo {
674 static const Builtin::Info BuiltinInfo[];
675 static const char * const GCCRegNames[];
676 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000677 std::string CPU;
Eric Christopher16543202013-10-16 21:19:26 +0000678
679 // Target cpu features.
680 bool HasVSX;
681
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000682public:
Eric Christopher16543202013-10-16 21:19:26 +0000683 PPCTargetInfo(const llvm::Triple &Triple)
684 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000685 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000686 LongDoubleWidth = LongDoubleAlign = 128;
687 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
688 }
Eli Friedmand9389be2009-06-05 07:05:05 +0000689
Hal Finkel39d5fa12012-07-03 16:51:04 +0000690 /// \brief Flags for architecture specific defines.
691 typedef enum {
692 ArchDefineNone = 0,
693 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
694 ArchDefinePpcgr = 1 << 1,
695 ArchDefinePpcsq = 1 << 2,
696 ArchDefine440 = 1 << 3,
697 ArchDefine603 = 1 << 4,
698 ArchDefine604 = 1 << 5,
699 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000700 ArchDefinePwr5 = 1 << 7,
701 ArchDefinePwr5x = 1 << 8,
702 ArchDefinePwr6 = 1 << 9,
703 ArchDefinePwr6x = 1 << 10,
704 ArchDefinePwr7 = 1 << 11,
705 ArchDefineA2 = 1 << 12,
706 ArchDefineA2q = 1 << 13
Hal Finkel39d5fa12012-07-03 16:51:04 +0000707 } ArchDefineTypes;
708
Bill Schmidt2821e182013-02-01 20:23:10 +0000709 // Note: GCC recognizes the following additional cpus:
710 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
711 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
712 // titan, rs64.
Stephen Hines651f13c2014-04-23 16:59:28 -0700713 bool setCPU(const std::string &Name) override {
Hal Finkel02a84272012-06-11 22:35:19 +0000714 bool CPUKnown = llvm::StringSwitch<bool>(Name)
715 .Case("generic", true)
716 .Case("440", true)
717 .Case("450", true)
718 .Case("601", true)
719 .Case("602", true)
720 .Case("603", true)
721 .Case("603e", true)
722 .Case("603ev", true)
723 .Case("604", true)
724 .Case("604e", true)
725 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000726 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000727 .Case("g3", true)
728 .Case("7400", true)
729 .Case("g4", true)
730 .Case("7450", true)
731 .Case("g4+", true)
732 .Case("750", true)
733 .Case("970", true)
734 .Case("g5", true)
735 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000736 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000737 .Case("e500mc", true)
738 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000739 .Case("power3", true)
740 .Case("pwr3", true)
741 .Case("power4", true)
742 .Case("pwr4", true)
743 .Case("power5", true)
744 .Case("pwr5", true)
745 .Case("power5x", true)
746 .Case("pwr5x", true)
747 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000748 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000749 .Case("power6x", true)
750 .Case("pwr6x", true)
751 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000752 .Case("pwr7", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000753 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000754 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000755 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000756 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000757 .Case("powerpc64le", true)
758 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000759 .Default(false);
760
761 if (CPUKnown)
762 CPU = Name;
763
764 return CPUKnown;
765 }
766
Stephen Hines651f13c2014-04-23 16:59:28 -0700767 void getTargetBuiltins(const Builtin::Info *&Records,
768 unsigned &NumRecords) const override {
Chris Lattner4b009652007-07-25 00:24:17 +0000769 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000770 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000771 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000772
Stephen Hines651f13c2014-04-23 16:59:28 -0700773 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000774
Stephen Hines651f13c2014-04-23 16:59:28 -0700775 void getTargetDefines(const LangOptions &Opts,
776 MacroBuilder &Builder) const override;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000777
Stephen Hines651f13c2014-04-23 16:59:28 -0700778 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt199402b2013-02-01 02:14:03 +0000779
Stephen Hines651f13c2014-04-23 16:59:28 -0700780 bool handleTargetFeatures(std::vector<std::string> &Features,
781 DiagnosticsEngine &Diags) override;
782 bool hasFeature(StringRef Feature) const override;
783
784 void getGCCRegNames(const char * const *&Names,
785 unsigned &NumNames) const override;
786 void getGCCRegAliases(const GCCRegAlias *&Aliases,
787 unsigned &NumAliases) const override;
788 bool validateAsmConstraint(const char *&Name,
789 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +0000790 switch (*Name) {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000791 default: return false;
792 case 'O': // Zero
John Thompson1deeb9f2010-06-24 22:44:13 +0000793 break;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000794 case 'b': // Base register
795 case 'f': // Floating point register
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000796 Info.setAllowsRegister();
John Thompson1deeb9f2010-06-24 22:44:13 +0000797 break;
798 // FIXME: The following are added to allow parsing.
799 // I just took a guess at what the actions should be.
800 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000801 case 'd': // Floating point register (containing 64-bit value)
John Thompson1deeb9f2010-06-24 22:44:13 +0000802 case 'v': // Altivec vector register
803 Info.setAllowsRegister();
804 break;
805 case 'w':
806 switch (Name[1]) {
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000807 case 'd':// VSX vector register to hold vector double data
808 case 'f':// VSX vector register to hold vector float data
809 case 's':// VSX vector register to hold scalar float data
810 case 'a':// Any VSX register
Stephen Hines651f13c2014-04-23 16:59:28 -0700811 case 'c':// An individual CR bit
John Thompson1deeb9f2010-06-24 22:44:13 +0000812 break;
813 default:
814 return false;
815 }
816 Info.setAllowsRegister();
817 Name++; // Skip over 'w'.
818 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000819 case 'h': // `MQ', `CTR', or `LINK' register
820 case 'q': // `MQ' register
821 case 'c': // `CTR' register
822 case 'l': // `LINK' register
823 case 'x': // `CR' register (condition register) number 0
824 case 'y': // `CR' register (condition register)
825 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson1deeb9f2010-06-24 22:44:13 +0000826 Info.setAllowsRegister();
827 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000828 case 'I': // Signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000829 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000830 // (use `L' instead for SImode constants)
831 case 'K': // Unsigned 16-bit constant
832 case 'L': // Signed 16-bit constant shifted left 16 bits
833 case 'M': // Constant larger than 31
834 case 'N': // Exact power of 2
835 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000836 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000837 // register with one instruction per word
John Thompson1deeb9f2010-06-24 22:44:13 +0000838 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000839 // into a register using three instructions
John Thompson1deeb9f2010-06-24 22:44:13 +0000840 break;
841 case 'm': // Memory operand. Note that on PowerPC targets, m can
842 // include addresses that update the base register. It
843 // is therefore only safe to use `m' in an asm statement
844 // if that asm statement accesses the operand exactly once.
845 // The asm statement must also use `%U<opno>' as a
Sebastian Redl097ce222010-08-17 22:42:34 +0000846 // placeholder for the "update" flag in the corresponding
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000847 // load or store instruction. For example:
John Thompson1deeb9f2010-06-24 22:44:13 +0000848 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000849 // is correct but:
John Thompson1deeb9f2010-06-24 22:44:13 +0000850 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
851 // is not. Use es rather than m if you don't want the base
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000852 // register to be updated.
853 case 'e':
John Thompsone0a39472010-06-25 00:02:05 +0000854 if (Name[1] != 's')
855 return false;
Sebastian Redl097ce222010-08-17 22:42:34 +0000856 // es: A "stable" memory operand; that is, one which does not
John Thompson1deeb9f2010-06-24 22:44:13 +0000857 // include any automodification of the base register. Unlike
858 // `m', this constraint can be used in asm statements that
859 // might access the operand several times, or that might not
John Thompsone0a39472010-06-25 00:02:05 +0000860 // access it at all.
John Thompson1deeb9f2010-06-24 22:44:13 +0000861 Info.setAllowsMemory();
John Thompsone0a39472010-06-25 00:02:05 +0000862 Name++; // Skip over 'e'.
John Thompson1deeb9f2010-06-24 22:44:13 +0000863 break;
864 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000865 // usually better to use `m' or `es' in asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000866 case 'Z': // Memory operand that is an indexed or indirect from a
867 // register (it is usually better to use `m' or `es' in
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000868 // asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000869 Info.setAllowsMemory();
870 Info.setAllowsRegister();
871 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000872 case 'R': // AIX TOC entry
John Thompson1deeb9f2010-06-24 22:44:13 +0000873 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000874 // register (`p' is preferable for asm statements)
875 case 'S': // Constant suitable as a 64-bit mask operand
876 case 'T': // Constant suitable as a 32-bit mask operand
877 case 'U': // System V Release 4 small data area reference
John Thompson1deeb9f2010-06-24 22:44:13 +0000878 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000879 // instructions
880 case 'W': // Vector constant that does not require memory
881 case 'j': // Vector constant that is all zeros.
John Thompson1deeb9f2010-06-24 22:44:13 +0000882 break;
883 // End FIXME.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000884 }
John Thompson1deeb9f2010-06-24 22:44:13 +0000885 return true;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000886 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700887 std::string convertConstraint(const char *&Constraint) const override {
888 std::string R;
889 switch (*Constraint) {
890 case 'e':
891 case 'w':
892 // Two-character constraint; add "^" hint for later parsing.
893 R = std::string("^") + std::string(Constraint, 2);
894 Constraint++;
895 break;
896 default:
897 return TargetInfo::convertConstraint(Constraint);
898 }
899 return R;
900 }
901 const char *getClobbers() const override {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000902 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000903 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700904 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000905 if (RegNo == 0) return 3;
906 if (RegNo == 1) return 4;
907 return -1;
908 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000909};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000910
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000911const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000912#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000913#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000914 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +0000915#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000916};
Anton Korobeynikove7772382009-05-03 13:42:53 +0000917
Eric Christopher3d11ced2013-10-16 21:26:26 +0000918 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher16543202013-10-16 21:19:26 +0000919/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +0000920bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher16543202013-10-16 21:19:26 +0000921 DiagnosticsEngine &Diags) {
922 // Remember the maximum enabled sselevel.
923 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
924 // Ignore disabled features.
925 if (Features[i][0] == '-')
926 continue;
927
928 StringRef Feature = StringRef(Features[i]).substr(1);
929
930 if (Feature == "vsx") {
931 HasVSX = true;
932 continue;
933 }
934
935 // TODO: Finish this list and add an assert that we've handled them
936 // all.
937 }
938
939 return true;
940}
Anton Korobeynikove7772382009-05-03 13:42:53 +0000941
Chris Lattnerbef1d722009-03-02 22:27:17 +0000942/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
943/// #defines that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000944void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000945 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000946 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000947 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000948 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000949 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerf8030412010-02-16 18:14:57 +0000950 Builder.defineMacro("__powerpc__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000951 Builder.defineMacro("__POWERPC__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000952 if (PointerWidth == 64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000953 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerf8030412010-02-16 18:14:57 +0000954 Builder.defineMacro("__powerpc64__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000955 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000956 Builder.defineMacro("__PPC64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000957 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000958
Chris Lattnerbef1d722009-03-02 22:27:17 +0000959 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000960 if (getTriple().getArch() == llvm::Triple::ppc64le) {
961 Builder.defineMacro("_LITTLE_ENDIAN");
Stephen Hines651f13c2014-04-23 16:59:28 -0700962 Builder.defineMacro("_CALL_ELF","2");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000963 } else {
964 if (getTriple().getOS() != llvm::Triple::NetBSD &&
965 getTriple().getOS() != llvm::Triple::OpenBSD)
966 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000967 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000968
Chris Lattnerbef1d722009-03-02 22:27:17 +0000969 // Subtarget options.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000970 Builder.defineMacro("__NATURAL_ALIGNMENT__");
971 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000972
Chris Lattnerbef1d722009-03-02 22:27:17 +0000973 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +0000974 if (LongDoubleWidth == 128)
975 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000976
John Thompsoned7bdbc2009-11-19 17:18:50 +0000977 if (Opts.AltiVec) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000978 Builder.defineMacro("__VEC__", "10206");
979 Builder.defineMacro("__ALTIVEC__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000980 }
Hal Finkel02a84272012-06-11 22:35:19 +0000981
982 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000983 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
984 .Case("440", ArchDefineName)
985 .Case("450", ArchDefineName | ArchDefine440)
986 .Case("601", ArchDefineName)
987 .Case("602", ArchDefineName | ArchDefinePpcgr)
988 .Case("603", ArchDefineName | ArchDefinePpcgr)
989 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
990 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
991 .Case("604", ArchDefineName | ArchDefinePpcgr)
992 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
993 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +0000994 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000995 .Case("7400", ArchDefineName | ArchDefinePpcgr)
996 .Case("7450", ArchDefineName | ArchDefinePpcgr)
997 .Case("750", ArchDefineName | ArchDefinePpcgr)
998 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
999 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001000 .Case("a2", ArchDefineA2)
1001 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +00001002 .Case("pwr3", ArchDefinePpcgr)
1003 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1004 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
Hal Finkel39d5fa12012-07-03 16:51:04 +00001005 | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001006 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1007 | ArchDefinePpcgr | ArchDefinePpcsq)
1008 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1009 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1010 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1011 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1012 | ArchDefinePpcsq)
1013 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1014 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1015 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
1016 .Case("power3", ArchDefinePpcgr)
1017 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1018 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1019 | ArchDefinePpcsq)
1020 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1021 | ArchDefinePpcgr | ArchDefinePpcsq)
1022 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1023 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1024 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1025 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1026 | ArchDefinePpcsq)
1027 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1028 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1029 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001030 .Default(ArchDefineNone);
1031
1032 if (defs & ArchDefineName)
1033 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1034 if (defs & ArchDefinePpcgr)
1035 Builder.defineMacro("_ARCH_PPCGR");
1036 if (defs & ArchDefinePpcsq)
1037 Builder.defineMacro("_ARCH_PPCSQ");
1038 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +00001039 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +00001040 if (defs & ArchDefine603)
1041 Builder.defineMacro("_ARCH_603");
1042 if (defs & ArchDefine604)
1043 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +00001044 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001045 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +00001046 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001047 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +00001048 if (defs & ArchDefinePwr5x)
1049 Builder.defineMacro("_ARCH_PWR5X");
1050 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +00001051 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +00001052 if (defs & ArchDefinePwr6x)
1053 Builder.defineMacro("_ARCH_PWR6X");
1054 if (defs & ArchDefinePwr7)
1055 Builder.defineMacro("_ARCH_PWR7");
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001056 if (defs & ArchDefineA2)
1057 Builder.defineMacro("_ARCH_A2");
1058 if (defs & ArchDefineA2q) {
1059 Builder.defineMacro("_ARCH_A2Q");
1060 Builder.defineMacro("_ARCH_QP");
Hal Finkel02a84272012-06-11 22:35:19 +00001061 }
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001062
1063 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1064 Builder.defineMacro("__bg__");
1065 Builder.defineMacro("__THW_BLUEGENE__");
1066 Builder.defineMacro("__bgq__");
1067 Builder.defineMacro("__TOS_BGQ__");
1068 }
Bill Schmidt2821e182013-02-01 20:23:10 +00001069
Eric Christopher16543202013-10-16 21:19:26 +00001070 if (HasVSX)
1071 Builder.defineMacro("__VSX__");
1072
Bill Schmidt2821e182013-02-01 20:23:10 +00001073 // FIXME: The following are not yet generated here by Clang, but are
1074 // generated by GCC:
1075 //
1076 // _SOFT_FLOAT_
1077 // __RECIP_PRECISION__
1078 // __APPLE_ALTIVEC__
Bill Schmidt2821e182013-02-01 20:23:10 +00001079 // __RECIP__
1080 // __RECIPF__
1081 // __RSQRTE__
1082 // __RSQRTEF__
1083 // _SOFT_DOUBLE_
1084 // __NO_LWSYNC__
1085 // __HAVE_BSWAP__
1086 // __LONGDOUBLE128
1087 // __CMODEL_MEDIUM__
1088 // __CMODEL_LARGE__
1089 // _CALL_SYSV
1090 // _CALL_DARWIN
1091 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001092}
1093
1094void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1095 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1096 .Case("7400", true)
1097 .Case("g4", true)
1098 .Case("7450", true)
1099 .Case("g4+", true)
1100 .Case("970", true)
1101 .Case("g5", true)
1102 .Case("pwr6", true)
1103 .Case("pwr7", true)
1104 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001105 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001106 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001107
1108 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001109}
1110
Douglas Gregore727d212012-01-30 06:38:25 +00001111bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1112 return Feature == "powerpc";
1113}
Chris Lattner9fd73612008-04-21 18:56:49 +00001114
Douglas Gregore727d212012-01-30 06:38:25 +00001115
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001116const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattner14d2bb72009-09-16 05:05:27 +00001117 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1118 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1119 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1120 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1121 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1122 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1123 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1124 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001125 "mq", "lr", "ctr", "ap",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001126 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001127 "xer",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001128 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1129 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1130 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1131 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001132 "vrsave", "vscr",
1133 "spe_acc", "spefscr",
1134 "sfp"
1135};
Chris Lattner4b009652007-07-25 00:24:17 +00001136
Anton Korobeynikove7772382009-05-03 13:42:53 +00001137void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001138 unsigned &NumNames) const {
1139 Names = GCCRegNames;
1140 NumNames = llvm::array_lengthof(GCCRegNames);
1141}
Chris Lattner4b009652007-07-25 00:24:17 +00001142
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001143const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1144 // While some of these aliases do map to different registers
1145 // they still share the same register name.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001146 { { "0" }, "r0" },
1147 { { "1"}, "r1" },
1148 { { "2" }, "r2" },
1149 { { "3" }, "r3" },
1150 { { "4" }, "r4" },
1151 { { "5" }, "r5" },
1152 { { "6" }, "r6" },
1153 { { "7" }, "r7" },
1154 { { "8" }, "r8" },
1155 { { "9" }, "r9" },
1156 { { "10" }, "r10" },
1157 { { "11" }, "r11" },
1158 { { "12" }, "r12" },
1159 { { "13" }, "r13" },
1160 { { "14" }, "r14" },
1161 { { "15" }, "r15" },
1162 { { "16" }, "r16" },
1163 { { "17" }, "r17" },
1164 { { "18" }, "r18" },
1165 { { "19" }, "r19" },
1166 { { "20" }, "r20" },
1167 { { "21" }, "r21" },
1168 { { "22" }, "r22" },
1169 { { "23" }, "r23" },
1170 { { "24" }, "r24" },
1171 { { "25" }, "r25" },
1172 { { "26" }, "r26" },
1173 { { "27" }, "r27" },
1174 { { "28" }, "r28" },
1175 { { "29" }, "r29" },
1176 { { "30" }, "r30" },
1177 { { "31" }, "r31" },
1178 { { "fr0" }, "f0" },
1179 { { "fr1" }, "f1" },
1180 { { "fr2" }, "f2" },
1181 { { "fr3" }, "f3" },
1182 { { "fr4" }, "f4" },
1183 { { "fr5" }, "f5" },
1184 { { "fr6" }, "f6" },
1185 { { "fr7" }, "f7" },
1186 { { "fr8" }, "f8" },
1187 { { "fr9" }, "f9" },
Mike Stump369c21c2009-09-17 21:15:00 +00001188 { { "fr10" }, "f10" },
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001189 { { "fr11" }, "f11" },
1190 { { "fr12" }, "f12" },
1191 { { "fr13" }, "f13" },
1192 { { "fr14" }, "f14" },
1193 { { "fr15" }, "f15" },
1194 { { "fr16" }, "f16" },
1195 { { "fr17" }, "f17" },
1196 { { "fr18" }, "f18" },
1197 { { "fr19" }, "f19" },
1198 { { "fr20" }, "f20" },
1199 { { "fr21" }, "f21" },
1200 { { "fr22" }, "f22" },
1201 { { "fr23" }, "f23" },
1202 { { "fr24" }, "f24" },
1203 { { "fr25" }, "f25" },
1204 { { "fr26" }, "f26" },
1205 { { "fr27" }, "f27" },
1206 { { "fr28" }, "f28" },
1207 { { "fr29" }, "f29" },
1208 { { "fr30" }, "f30" },
1209 { { "fr31" }, "f31" },
1210 { { "cc" }, "cr0" },
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001211};
1212
Anton Korobeynikove7772382009-05-03 13:42:53 +00001213void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001214 unsigned &NumAliases) const {
1215 Aliases = GCCRegAliases;
1216 NumAliases = llvm::array_lengthof(GCCRegAliases);
1217}
1218} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001219
1220namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001221class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001222public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001223 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001224 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerf8030412010-02-16 18:14:57 +00001225
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001226 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001227 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001228 case llvm::Triple::FreeBSD:
1229 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001230 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001231 PtrDiffType = SignedInt;
1232 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001233 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001234 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001235 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001236 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001237
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001238 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1239 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001240 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001241 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001242
1243 // PPC32 supports atomics up to 4 bytes.
1244 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001245 }
1246
Stephen Hines651f13c2014-04-23 16:59:28 -07001247 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001248 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001249 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman2b161652008-08-21 00:13:15 +00001250 }
Chris Lattner4b009652007-07-25 00:24:17 +00001251};
1252} // end anonymous namespace.
1253
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001254// Note: ABI differences may eventually require us to have a separate
1255// TargetInfo for little endian.
Chris Lattner4b009652007-07-25 00:24:17 +00001256namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001257class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001258public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001259 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00001260 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman38e31802009-07-01 03:36:11 +00001261 IntMaxType = SignedLong;
1262 UIntMaxType = UnsignedLong;
1263 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001264
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001265 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1266 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001267 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines651f13c2014-04-23 16:59:28 -07001268 DescriptionString = "E-m:e-i64:64-n32:64";
1269 } else {
1270 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1271 DescriptionString = "e-m:e-i64:64-n32:64";
1272 } else {
1273 DescriptionString = "E-m:e-i64:64-n32:64";
1274 }
1275}
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001276
1277 // PPC64 supports atomics up to 8 bytes.
1278 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnere5fde952008-05-09 06:17:04 +00001279 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001280 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001281 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001282 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001283};
1284} // end anonymous namespace.
1285
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001286
1287namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001288class DarwinPPC32TargetInfo :
1289 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001290public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001291 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1292 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001293 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001294 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherf2174002013-10-16 21:19:19 +00001295 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001296 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001297 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001298 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001299 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001300 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001301 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001302 }
1303};
1304
1305class DarwinPPC64TargetInfo :
1306 public DarwinTargetInfo<PPC64TargetInfo> {
1307public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001308 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1309 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001310 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001311 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001312 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001313 }
1314};
1315} // end anonymous namespace.
1316
Chris Lattner4b009652007-07-25 00:24:17 +00001317namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001318 static const unsigned NVPTXAddrSpaceMap[] = {
1319 1, // opencl_global
1320 3, // opencl_local
1321 4, // opencl_constant
1322 1, // cuda_device
1323 4, // cuda_constant
1324 3, // cuda_shared
Justin Holewinski25bedca2011-10-03 17:28:37 +00001325 };
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001326 class NVPTXTargetInfo : public TargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001327 static const char * const GCCRegNames[];
1328 static const Builtin::Info BuiltinInfo[];
1329 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001330 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001331 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +00001332 TLSSupported = false;
1333 LongWidth = LongAlign = 64;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001334 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001335 UseAddrSpaceMapMangling = true;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001336 // Define available target features
Justin Holewinski2c585b92012-05-24 17:43:12 +00001337 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001338 NoAsmVariants = true;
Justin Holewinski285dc652011-04-20 19:34:15 +00001339 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001340 void getTargetDefines(const LangOptions &Opts,
1341 MacroBuilder &Builder) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001342 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001343 Builder.defineMacro("__NVPTX__");
Justin Holewinski285dc652011-04-20 19:34:15 +00001344 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001345 void getTargetBuiltins(const Builtin::Info *&Records,
1346 unsigned &NumRecords) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001347 Records = BuiltinInfo;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001348 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Justin Holewinski285dc652011-04-20 19:34:15 +00001349 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001350 bool hasFeature(StringRef Feature) const override {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001351 return Feature == "ptx" || Feature == "nvptx";
Douglas Gregore727d212012-01-30 06:38:25 +00001352 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001353
1354 void getGCCRegNames(const char * const *&Names,
1355 unsigned &NumNames) const override;
1356 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1357 unsigned &NumAliases) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001358 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001359 Aliases = nullptr;
Justin Holewinski285dc652011-04-20 19:34:15 +00001360 NumAliases = 0;
1361 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001362 bool validateAsmConstraint(const char *&Name,
1363 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001364 switch (*Name) {
1365 default: return false;
1366 case 'c':
1367 case 'h':
1368 case 'r':
1369 case 'l':
1370 case 'f':
1371 case 'd':
1372 Info.setAllowsRegister();
1373 return true;
1374 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001375 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001376 const char *getClobbers() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001377 // FIXME: Is this really right?
1378 return "";
1379 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001380 BuiltinVaListKind getBuiltinVaListKind() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001381 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001382 return TargetInfo::CharPtrBuiltinVaList;
Justin Holewinski285dc652011-04-20 19:34:15 +00001383 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001384 bool setCPU(const std::string &Name) override {
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001385 bool Valid = llvm::StringSwitch<bool>(Name)
1386 .Case("sm_20", true)
1387 .Case("sm_21", true)
1388 .Case("sm_30", true)
1389 .Case("sm_35", true)
1390 .Default(false);
1391
1392 return Valid;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001393 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001394 };
1395
Justin Holewinski2c585b92012-05-24 17:43:12 +00001396 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001397#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +00001398#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001399 ALL_LANGUAGES },
Justin Holewinski2c585b92012-05-24 17:43:12 +00001400#include "clang/Basic/BuiltinsNVPTX.def"
Justin Holewinski285dc652011-04-20 19:34:15 +00001401 };
1402
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001403 const char * const NVPTXTargetInfo::GCCRegNames[] = {
Justin Holewinski285dc652011-04-20 19:34:15 +00001404 "r0"
1405 };
1406
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001407 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
Justin Holewinski285dc652011-04-20 19:34:15 +00001408 unsigned &NumNames) const {
1409 Names = GCCRegNames;
1410 NumNames = llvm::array_lengthof(GCCRegNames);
1411 }
1412
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001413 class NVPTX32TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001414 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001415 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001416 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001417 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07001418 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001419 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001420 };
1421
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001422 class NVPTX64TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001423 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001424 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001425 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001426 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07001427 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001428 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001429 };
1430}
1431
1432namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001433
1434static const unsigned R600AddrSpaceMap[] = {
1435 1, // opencl_global
1436 3, // opencl_local
1437 2, // opencl_constant
1438 1, // cuda_device
1439 2, // cuda_constant
1440 3 // cuda_shared
1441};
1442
Tom Stellardfd075912013-03-04 17:40:53 +00001443static const char *DescriptionStringR600 =
Stephen Hines651f13c2014-04-23 16:59:28 -07001444 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1445 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001446
1447static const char *DescriptionStringR600DoubleOps =
Stephen Hines651f13c2014-04-23 16:59:28 -07001448 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1449 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001450
1451static const char *DescriptionStringSI =
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001452 "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 -07001453 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1454 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001455
Eli Friedman6505a292012-10-12 23:32:00 +00001456class R600TargetInfo : public TargetInfo {
Tom Stellardfd075912013-03-04 17:40:53 +00001457 /// \brief The GPU profiles supported by the R600 target.
1458 enum GPUKind {
1459 GK_NONE,
1460 GK_R600,
1461 GK_R600_DOUBLE_OPS,
1462 GK_R700,
1463 GK_R700_DOUBLE_OPS,
1464 GK_EVERGREEN,
1465 GK_EVERGREEN_DOUBLE_OPS,
1466 GK_NORTHERN_ISLANDS,
1467 GK_CAYMAN,
Tom Stellard42317042013-10-29 16:38:29 +00001468 GK_SOUTHERN_ISLANDS,
1469 GK_SEA_ISLANDS
Tom Stellardfd075912013-03-04 17:40:53 +00001470 } GPU;
1471
Eli Friedman6505a292012-10-12 23:32:00 +00001472public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001473 R600TargetInfo(const llvm::Triple &Triple)
1474 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardfd075912013-03-04 17:40:53 +00001475 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001476 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001477 UseAddrSpaceMapMangling = true;
Eli Friedman6505a292012-10-12 23:32:00 +00001478 }
1479
Stephen Hines651f13c2014-04-23 16:59:28 -07001480 const char * getClobbers() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001481 return "";
1482 }
1483
Stephen Hines651f13c2014-04-23 16:59:28 -07001484 void getGCCRegNames(const char * const *&Names,
1485 unsigned &numNames) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001486 Names = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001487 numNames = 0;
1488 }
1489
Stephen Hines651f13c2014-04-23 16:59:28 -07001490 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1491 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001492 Aliases = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001493 NumAliases = 0;
1494 }
1495
Stephen Hines651f13c2014-04-23 16:59:28 -07001496 bool validateAsmConstraint(const char *&Name,
1497 TargetInfo::ConstraintInfo &info) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001498 return true;
1499 }
1500
Stephen Hines651f13c2014-04-23 16:59:28 -07001501 void getTargetBuiltins(const Builtin::Info *&Records,
1502 unsigned &NumRecords) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001503 Records = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001504 NumRecords = 0;
1505 }
1506
1507
Stephen Hines651f13c2014-04-23 16:59:28 -07001508 void getTargetDefines(const LangOptions &Opts,
1509 MacroBuilder &Builder) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001510 Builder.defineMacro("__R600__");
1511 }
1512
Stephen Hines651f13c2014-04-23 16:59:28 -07001513 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001514 return TargetInfo::CharPtrBuiltinVaList;
1515 }
1516
Stephen Hines651f13c2014-04-23 16:59:28 -07001517 bool setCPU(const std::string &Name) override {
Tom Stellardfd075912013-03-04 17:40:53 +00001518 GPU = llvm::StringSwitch<GPUKind>(Name)
1519 .Case("r600" , GK_R600)
1520 .Case("rv610", GK_R600)
1521 .Case("rv620", GK_R600)
1522 .Case("rv630", GK_R600)
1523 .Case("rv635", GK_R600)
1524 .Case("rs780", GK_R600)
1525 .Case("rs880", GK_R600)
1526 .Case("rv670", GK_R600_DOUBLE_OPS)
1527 .Case("rv710", GK_R700)
1528 .Case("rv730", GK_R700)
1529 .Case("rv740", GK_R700_DOUBLE_OPS)
1530 .Case("rv770", GK_R700_DOUBLE_OPS)
1531 .Case("palm", GK_EVERGREEN)
1532 .Case("cedar", GK_EVERGREEN)
1533 .Case("sumo", GK_EVERGREEN)
1534 .Case("sumo2", GK_EVERGREEN)
1535 .Case("redwood", GK_EVERGREEN)
1536 .Case("juniper", GK_EVERGREEN)
1537 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1538 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1539 .Case("barts", GK_NORTHERN_ISLANDS)
1540 .Case("turks", GK_NORTHERN_ISLANDS)
1541 .Case("caicos", GK_NORTHERN_ISLANDS)
1542 .Case("cayman", GK_CAYMAN)
1543 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001544 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001545 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1546 .Case("verde", GK_SOUTHERN_ISLANDS)
1547 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard42317042013-10-29 16:38:29 +00001548 .Case("bonaire", GK_SEA_ISLANDS)
1549 .Case("kabini", GK_SEA_ISLANDS)
1550 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard0de6bc82013-11-14 23:45:53 +00001551 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001552 .Default(GK_NONE);
1553
1554 if (GPU == GK_NONE) {
1555 return false;
1556 }
1557
1558 // Set the correct data layout
1559 switch (GPU) {
1560 case GK_NONE:
1561 case GK_R600:
1562 case GK_R700:
1563 case GK_EVERGREEN:
1564 case GK_NORTHERN_ISLANDS:
1565 DescriptionString = DescriptionStringR600;
1566 break;
1567 case GK_R600_DOUBLE_OPS:
1568 case GK_R700_DOUBLE_OPS:
1569 case GK_EVERGREEN_DOUBLE_OPS:
1570 case GK_CAYMAN:
1571 DescriptionString = DescriptionStringR600DoubleOps;
1572 break;
1573 case GK_SOUTHERN_ISLANDS:
Tom Stellard42317042013-10-29 16:38:29 +00001574 case GK_SEA_ISLANDS:
Tom Stellardfd075912013-03-04 17:40:53 +00001575 DescriptionString = DescriptionStringSI;
1576 break;
1577 }
1578
1579 return true;
1580 }
Eli Friedman6505a292012-10-12 23:32:00 +00001581};
1582
1583} // end anonymous namespace
1584
1585namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001586// Namespace for x86 abstract base class
1587const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001588#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001589#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001590 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +00001591#include "clang/Basic/BuiltinsX86.def"
Eli Friedman872996c2008-08-20 02:34:37 +00001592};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001593
Nuno Lopesad1010d2009-12-23 17:49:57 +00001594static const char* const GCCRegNames[] = {
Eli Friedman872996c2008-08-20 02:34:37 +00001595 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1596 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001597 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman872996c2008-08-20 02:34:37 +00001598 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1599 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1600 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001601 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001602 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1603 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman872996c2008-08-20 02:34:37 +00001604};
1605
Eric Christophercfd323d2011-06-21 00:05:20 +00001606const TargetInfo::AddlRegName AddlRegNames[] = {
1607 { { "al", "ah", "eax", "rax" }, 0 },
1608 { { "bl", "bh", "ebx", "rbx" }, 3 },
1609 { { "cl", "ch", "ecx", "rcx" }, 2 },
1610 { { "dl", "dh", "edx", "rdx" }, 1 },
1611 { { "esi", "rsi" }, 4 },
1612 { { "edi", "rdi" }, 5 },
1613 { { "esp", "rsp" }, 7 },
1614 { { "ebp", "rbp" }, 6 },
Eli Friedman872996c2008-08-20 02:34:37 +00001615};
1616
1617// X86 target abstract base class; x86-32 and x86-64 are very close, so
1618// most of the implementation can be shared.
1619class X86TargetInfo : public TargetInfo {
Chris Lattner715fe4c2009-03-02 22:40:39 +00001620 enum X86SSEEnum {
Craig Topperb7a95d22013-08-21 03:59:22 +00001621 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner715fe4c2009-03-02 22:40:39 +00001622 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001623 enum MMX3DNowEnum {
1624 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1625 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001626 enum XOPEnum {
1627 NoXOP,
1628 SSE4A,
1629 FMA4,
1630 XOP
1631 } XOPLevel;
Anders Carlssone5e222f2010-01-27 03:47:49 +00001632
Eric Christopher6c4e7872010-04-02 23:50:19 +00001633 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001634 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001635 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001636 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001637 bool HasBMI;
1638 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001639 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001640 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001641 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001642 bool HasRDSEED;
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001643 bool HasTBM;
Craig Topper2ae95072012-06-03 21:46:30 +00001644 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001645 bool HasF16C;
Craig Topperbca2c4f2013-08-21 05:29:10 +00001646 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuirb83f5a72013-09-19 13:22:04 +00001647 bool HasSHA;
Nick Lewyckyaf945462013-10-05 20:14:27 +00001648 bool HasCX16;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001649
Chandler Carruth499d9722011-09-28 08:55:34 +00001650 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1651 ///
1652 /// Each enumeration represents a particular CPU supported by Clang. These
1653 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1654 enum CPUKind {
1655 CK_Generic,
1656
1657 /// \name i386
1658 /// i386-generation processors.
1659 //@{
1660 CK_i386,
1661 //@}
1662
1663 /// \name i486
1664 /// i486-generation processors.
1665 //@{
1666 CK_i486,
1667 CK_WinChipC6,
1668 CK_WinChip2,
1669 CK_C3,
1670 //@}
1671
1672 /// \name i586
1673 /// i586-generation processors, P5 microarchitecture based.
1674 //@{
1675 CK_i586,
1676 CK_Pentium,
1677 CK_PentiumMMX,
1678 //@}
1679
1680 /// \name i686
1681 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1682 //@{
1683 CK_i686,
1684 CK_PentiumPro,
1685 CK_Pentium2,
1686 CK_Pentium3,
1687 CK_Pentium3M,
1688 CK_PentiumM,
1689 CK_C3_2,
1690
1691 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1692 /// Clang however has some logic to suport this.
1693 // FIXME: Warn, deprecate, and potentially remove this.
1694 CK_Yonah,
1695 //@}
1696
1697 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001698 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001699 //@{
1700 CK_Pentium4,
1701 CK_Pentium4M,
1702 CK_Prescott,
1703 CK_Nocona,
1704 //@}
1705
1706 /// \name Core
1707 /// Core microarchitecture based processors.
1708 //@{
1709 CK_Core2,
1710
1711 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1712 /// codename which GCC no longer accepts as an option to -march, but Clang
1713 /// has some logic for recognizing it.
1714 // FIXME: Warn, deprecate, and potentially remove this.
1715 CK_Penryn,
1716 //@}
1717
1718 /// \name Atom
1719 /// Atom processors
1720 //@{
1721 CK_Atom,
Preston Gurdc57ea682013-09-13 19:27:17 +00001722 CK_Silvermont,
Chandler Carruth499d9722011-09-28 08:55:34 +00001723 //@}
1724
1725 /// \name Nehalem
1726 /// Nehalem microarchitecture based processors.
1727 //@{
1728 CK_Corei7,
1729 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001730 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001731 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001732 //@}
1733
Craig Topper10c2c682013-08-20 07:09:39 +00001734 /// \name Knights Landing
1735 /// Knights Landing processor.
1736 CK_KNL,
1737
Chandler Carruth499d9722011-09-28 08:55:34 +00001738 /// \name K6
1739 /// K6 architecture processors.
1740 //@{
1741 CK_K6,
1742 CK_K6_2,
1743 CK_K6_3,
1744 //@}
1745
1746 /// \name K7
1747 /// K7 architecture processors.
1748 //@{
1749 CK_Athlon,
1750 CK_AthlonThunderbird,
1751 CK_Athlon4,
1752 CK_AthlonXP,
1753 CK_AthlonMP,
1754 //@}
1755
1756 /// \name K8
1757 /// K8 architecture processors.
1758 //@{
1759 CK_Athlon64,
1760 CK_Athlon64SSE3,
1761 CK_AthlonFX,
1762 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001763 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001764 CK_Opteron,
1765 CK_OpteronSSE3,
Roman Divackyf051cde2011-10-30 07:48:46 +00001766 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001767 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001768
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001769 /// \name Bobcat
1770 /// Bobcat architecture processors.
1771 //@{
1772 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00001773 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001774 //@}
1775
1776 /// \name Bulldozer
1777 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001778 //@{
1779 CK_BDVER1,
1780 CK_BDVER2,
Benjamin Kramera2420962013-11-04 10:29:51 +00001781 CK_BDVER3,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001782 CK_BDVER4,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001783 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001784
Chandler Carruth499d9722011-09-28 08:55:34 +00001785 /// This specification is deprecated and will be removed in the future.
1786 /// Users should prefer \see CK_K8.
1787 // FIXME: Warn on this when the CPU is set to it.
1788 CK_x86_64,
1789 //@}
1790
1791 /// \name Geode
1792 /// Geode processors.
1793 //@{
1794 CK_Geode
1795 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001796 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001797
Rafael Espindola5389b842013-08-21 21:59:03 +00001798 enum FPMathKind {
1799 FP_Default,
1800 FP_SSE,
1801 FP_387
1802 } FPMath;
1803
Eli Friedman872996c2008-08-20 02:34:37 +00001804public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001805 X86TargetInfo(const llvm::Triple &Triple)
1806 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001807 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1808 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001809 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1810 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewyckyaf945462013-10-05 20:14:27 +00001811 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1812 FPMath(FP_Default) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001813 BigEndian = false;
Eli Friedman872996c2008-08-20 02:34:37 +00001814 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +00001815 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001816 unsigned getFloatEvalMethod() const override {
Benjamin Kramerb4066692011-12-28 15:47:06 +00001817 // X87 evaluates with 80 bits "long double" precision.
1818 return SSELevel == NoSSE ? 2 : 0;
1819 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001820 void getTargetBuiltins(const Builtin::Info *&Records,
1821 unsigned &NumRecords) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001822 Records = BuiltinInfo;
1823 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +00001824 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001825 void getGCCRegNames(const char * const *&Names,
1826 unsigned &NumNames) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001827 Names = GCCRegNames;
1828 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001829 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001830 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1831 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001832 Aliases = nullptr;
Eric Christophercfd323d2011-06-21 00:05:20 +00001833 NumAliases = 0;
1834 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001835 void getGCCAddlRegNames(const AddlRegName *&Names,
1836 unsigned &NumNames) const override {
Eric Christophercfd323d2011-06-21 00:05:20 +00001837 Names = AddlRegNames;
1838 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00001839 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001840 bool validateAsmConstraint(const char *&Name,
1841 TargetInfo::ConstraintInfo &info) const override;
1842 std::string convertConstraint(const char *&Constraint) const override;
1843 const char *getClobbers() const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001844 return "~{dirflag},~{fpsr},~{flags}";
1845 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001846 void getTargetDefines(const LangOptions &Opts,
1847 MacroBuilder &Builder) const override;
Craig Topper319d81f2013-09-17 04:12:55 +00001848 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1849 bool Enabled);
1850 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1851 bool Enabled);
1852 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1853 bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07001854 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1855 StringRef Name, bool Enabled) const override {
Craig Topper85bfef62013-09-17 04:51:29 +00001856 setFeatureEnabledImpl(Features, Name, Enabled);
1857 }
1858 // This exists purely to cut down on the number of virtual calls in
1859 // getDefaultFeatures which calls this repeatedly.
1860 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1861 StringRef Name, bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07001862 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1863 bool hasFeature(StringRef Feature) const override;
1864 bool handleTargetFeatures(std::vector<std::string> &Features,
1865 DiagnosticsEngine &Diags) override;
1866 const char* getABI() const override {
Derek Schuffbabaf312012-10-11 15:52:22 +00001867 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001868 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001869 else if (getTriple().getArch() == llvm::Triple::x86 &&
1870 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001871 return "no-mmx";
1872 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001873 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001874 bool setCPU(const std::string &Name) override {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001875 CPU = llvm::StringSwitch<CPUKind>(Name)
1876 .Case("i386", CK_i386)
1877 .Case("i486", CK_i486)
1878 .Case("winchip-c6", CK_WinChipC6)
1879 .Case("winchip2", CK_WinChip2)
1880 .Case("c3", CK_C3)
1881 .Case("i586", CK_i586)
1882 .Case("pentium", CK_Pentium)
1883 .Case("pentium-mmx", CK_PentiumMMX)
1884 .Case("i686", CK_i686)
1885 .Case("pentiumpro", CK_PentiumPro)
1886 .Case("pentium2", CK_Pentium2)
1887 .Case("pentium3", CK_Pentium3)
1888 .Case("pentium3m", CK_Pentium3M)
1889 .Case("pentium-m", CK_PentiumM)
1890 .Case("c3-2", CK_C3_2)
1891 .Case("yonah", CK_Yonah)
1892 .Case("pentium4", CK_Pentium4)
1893 .Case("pentium4m", CK_Pentium4M)
1894 .Case("prescott", CK_Prescott)
1895 .Case("nocona", CK_Nocona)
1896 .Case("core2", CK_Core2)
1897 .Case("penryn", CK_Penryn)
1898 .Case("atom", CK_Atom)
Preston Gurdc57ea682013-09-13 19:27:17 +00001899 .Case("slm", CK_Silvermont)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001900 .Case("corei7", CK_Corei7)
1901 .Case("corei7-avx", CK_Corei7AVX)
1902 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001903 .Case("core-avx2", CK_CoreAVX2)
Craig Topper10c2c682013-08-20 07:09:39 +00001904 .Case("knl", CK_KNL)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001905 .Case("k6", CK_K6)
1906 .Case("k6-2", CK_K6_2)
1907 .Case("k6-3", CK_K6_3)
1908 .Case("athlon", CK_Athlon)
1909 .Case("athlon-tbird", CK_AthlonThunderbird)
1910 .Case("athlon-4", CK_Athlon4)
1911 .Case("athlon-xp", CK_AthlonXP)
1912 .Case("athlon-mp", CK_AthlonMP)
1913 .Case("athlon64", CK_Athlon64)
1914 .Case("athlon64-sse3", CK_Athlon64SSE3)
1915 .Case("athlon-fx", CK_AthlonFX)
1916 .Case("k8", CK_K8)
1917 .Case("k8-sse3", CK_K8SSE3)
1918 .Case("opteron", CK_Opteron)
1919 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divackyf051cde2011-10-30 07:48:46 +00001920 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001921 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00001922 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001923 .Case("bdver1", CK_BDVER1)
1924 .Case("bdver2", CK_BDVER2)
Benjamin Kramera2420962013-11-04 10:29:51 +00001925 .Case("bdver3", CK_BDVER3)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001926 .Case("bdver4", CK_BDVER4)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001927 .Case("x86-64", CK_x86_64)
1928 .Case("geode", CK_Geode)
1929 .Default(CK_Generic);
1930
Chandler Carruth26a39142011-09-28 09:45:08 +00001931 // Perform any per-CPU checks necessary to determine if this CPU is
1932 // acceptable.
1933 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1934 // invalid without explaining *why*.
1935 switch (CPU) {
1936 case CK_Generic:
1937 // No processor selected!
1938 return false;
1939
1940 case CK_i386:
1941 case CK_i486:
1942 case CK_WinChipC6:
1943 case CK_WinChip2:
1944 case CK_C3:
1945 case CK_i586:
1946 case CK_Pentium:
1947 case CK_PentiumMMX:
1948 case CK_i686:
1949 case CK_PentiumPro:
1950 case CK_Pentium2:
1951 case CK_Pentium3:
1952 case CK_Pentium3M:
1953 case CK_PentiumM:
1954 case CK_Yonah:
1955 case CK_C3_2:
1956 case CK_Pentium4:
1957 case CK_Pentium4M:
1958 case CK_Prescott:
1959 case CK_K6:
1960 case CK_K6_2:
1961 case CK_K6_3:
1962 case CK_Athlon:
1963 case CK_AthlonThunderbird:
1964 case CK_Athlon4:
1965 case CK_AthlonXP:
1966 case CK_AthlonMP:
1967 case CK_Geode:
1968 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001969 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001970 return false;
1971
1972 // Fallthrough
1973 case CK_Nocona:
1974 case CK_Core2:
1975 case CK_Penryn:
1976 case CK_Atom:
Preston Gurdc57ea682013-09-13 19:27:17 +00001977 case CK_Silvermont:
Chandler Carruth26a39142011-09-28 09:45:08 +00001978 case CK_Corei7:
1979 case CK_Corei7AVX:
1980 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001981 case CK_CoreAVX2:
Craig Topper10c2c682013-08-20 07:09:39 +00001982 case CK_KNL:
Chandler Carruth26a39142011-09-28 09:45:08 +00001983 case CK_Athlon64:
1984 case CK_Athlon64SSE3:
1985 case CK_AthlonFX:
1986 case CK_K8:
1987 case CK_K8SSE3:
1988 case CK_Opteron:
1989 case CK_OpteronSSE3:
Roman Divackyf051cde2011-10-30 07:48:46 +00001990 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001991 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00001992 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001993 case CK_BDVER1:
1994 case CK_BDVER2:
Benjamin Kramera2420962013-11-04 10:29:51 +00001995 case CK_BDVER3:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001996 case CK_BDVER4:
Chandler Carruth26a39142011-09-28 09:45:08 +00001997 case CK_x86_64:
1998 return true;
1999 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002000 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002001 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002002
Stephen Hines651f13c2014-04-23 16:59:28 -07002003 bool setFPMath(StringRef Name) override;
Rafael Espindola5389b842013-08-21 21:59:03 +00002004
Stephen Hines651f13c2014-04-23 16:59:28 -07002005 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00002006 // We accept all non-ARM calling conventions
2007 return (CC == CC_X86ThisCall ||
2008 CC == CC_X86FastCall ||
2009 CC == CC_X86StdCall ||
2010 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002011 CC == CC_X86Pascal ||
2012 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002013 }
2014
Stephen Hines651f13c2014-04-23 16:59:28 -07002015 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00002016 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002017 }
Chris Lattner4b009652007-07-25 00:24:17 +00002018};
Chris Lattner7d6220c2009-03-02 22:20:04 +00002019
Rafael Espindola5389b842013-08-21 21:59:03 +00002020bool X86TargetInfo::setFPMath(StringRef Name) {
2021 if (Name == "387") {
2022 FPMath = FP_387;
2023 return true;
2024 }
2025 if (Name == "sse") {
2026 FPMath = FP_SSE;
2027 return true;
2028 }
2029 return false;
2030}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002031
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002032void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar07181d72009-05-06 03:16:41 +00002033 // FIXME: This *really* should not be here.
2034
2035 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002036 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper85bfef62013-09-17 04:51:29 +00002037 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar07181d72009-05-06 03:16:41 +00002038
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002039 switch (CPU) {
2040 case CK_Generic:
2041 case CK_i386:
2042 case CK_i486:
2043 case CK_i586:
2044 case CK_Pentium:
2045 case CK_i686:
2046 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002047 break;
2048 case CK_PentiumMMX:
2049 case CK_Pentium2:
Craig Topper85bfef62013-09-17 04:51:29 +00002050 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002051 break;
2052 case CK_Pentium3:
2053 case CK_Pentium3M:
Craig Topper85bfef62013-09-17 04:51:29 +00002054 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002055 break;
2056 case CK_PentiumM:
2057 case CK_Pentium4:
2058 case CK_Pentium4M:
2059 case CK_x86_64:
Craig Topper85bfef62013-09-17 04:51:29 +00002060 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002061 break;
2062 case CK_Yonah:
2063 case CK_Prescott:
2064 case CK_Nocona:
Craig Topper85bfef62013-09-17 04:51:29 +00002065 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002066 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002067 break;
2068 case CK_Core2:
Craig Topper85bfef62013-09-17 04:51:29 +00002069 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002070 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002071 break;
2072 case CK_Penryn:
Craig Topper85bfef62013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002074 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002075 break;
2076 case CK_Atom:
Craig Topper85bfef62013-09-17 04:51:29 +00002077 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002078 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002079 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002080 case CK_Silvermont:
Craig Topper85bfef62013-09-17 04:51:29 +00002081 setFeatureEnabledImpl(Features, "sse4.2", true);
2082 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002083 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002084 setFeatureEnabledImpl(Features, "pclmul", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002085 break;
2086 case CK_Corei7:
Craig Topper85bfef62013-09-17 04:51:29 +00002087 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002088 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002089 break;
2090 case CK_Corei7AVX:
Craig Topper85bfef62013-09-17 04:51:29 +00002091 setFeatureEnabledImpl(Features, "avx", true);
2092 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002093 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002094 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002095 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002096 case CK_CoreAVXi:
Craig Topper85bfef62013-09-17 04:51:29 +00002097 setFeatureEnabledImpl(Features, "avx", true);
2098 setFeatureEnabledImpl(Features, "aes", true);
2099 setFeatureEnabledImpl(Features, "pclmul", true);
2100 setFeatureEnabledImpl(Features, "rdrnd", true);
2101 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002102 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002103 case CK_CoreAVX2:
Craig Topper85bfef62013-09-17 04:51:29 +00002104 setFeatureEnabledImpl(Features, "avx2", true);
2105 setFeatureEnabledImpl(Features, "aes", true);
2106 setFeatureEnabledImpl(Features, "pclmul", true);
2107 setFeatureEnabledImpl(Features, "lzcnt", true);
2108 setFeatureEnabledImpl(Features, "rdrnd", true);
2109 setFeatureEnabledImpl(Features, "f16c", true);
2110 setFeatureEnabledImpl(Features, "bmi", true);
2111 setFeatureEnabledImpl(Features, "bmi2", true);
2112 setFeatureEnabledImpl(Features, "rtm", true);
2113 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002114 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002115 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002116 case CK_KNL:
Craig Topper85bfef62013-09-17 04:51:29 +00002117 setFeatureEnabledImpl(Features, "avx512f", true);
2118 setFeatureEnabledImpl(Features, "avx512cd", true);
2119 setFeatureEnabledImpl(Features, "avx512er", true);
2120 setFeatureEnabledImpl(Features, "avx512pf", true);
2121 setFeatureEnabledImpl(Features, "aes", true);
2122 setFeatureEnabledImpl(Features, "pclmul", true);
2123 setFeatureEnabledImpl(Features, "lzcnt", true);
2124 setFeatureEnabledImpl(Features, "rdrnd", true);
2125 setFeatureEnabledImpl(Features, "f16c", true);
2126 setFeatureEnabledImpl(Features, "bmi", true);
2127 setFeatureEnabledImpl(Features, "bmi2", true);
2128 setFeatureEnabledImpl(Features, "rtm", true);
2129 setFeatureEnabledImpl(Features, "fma", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002130 break;
2131 case CK_K6:
2132 case CK_WinChipC6:
Craig Topper85bfef62013-09-17 04:51:29 +00002133 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002134 break;
2135 case CK_K6_2:
2136 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002137 case CK_WinChip2:
2138 case CK_C3:
Craig Topper85bfef62013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002140 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002141 case CK_Athlon:
2142 case CK_AthlonThunderbird:
2143 case CK_Geode:
Craig Topper85bfef62013-09-17 04:51:29 +00002144 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00002145 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002146 case CK_Athlon4:
2147 case CK_AthlonXP:
2148 case CK_AthlonMP:
Craig Topper85bfef62013-09-17 04:51:29 +00002149 setFeatureEnabledImpl(Features, "sse", true);
2150 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002151 break;
2152 case CK_K8:
2153 case CK_Opteron:
2154 case CK_Athlon64:
2155 case CK_AthlonFX:
Craig Topper85bfef62013-09-17 04:51:29 +00002156 setFeatureEnabledImpl(Features, "sse2", true);
2157 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002158 break;
2159 case CK_K8SSE3:
2160 case CK_OpteronSSE3:
2161 case CK_Athlon64SSE3:
Craig Topper85bfef62013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "sse3", true);
2163 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divacky9979cfe2011-10-30 13:47:56 +00002164 break;
Roman Divackyf051cde2011-10-30 07:48:46 +00002165 case CK_AMDFAM10:
Craig Topper85bfef62013-09-17 04:51:29 +00002166 setFeatureEnabledImpl(Features, "sse3", true);
2167 setFeatureEnabledImpl(Features, "sse4a", true);
2168 setFeatureEnabledImpl(Features, "3dnowa", true);
2169 setFeatureEnabledImpl(Features, "lzcnt", true);
2170 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002171 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002172 case CK_BTVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "ssse3", true);
2174 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002175 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002176 setFeatureEnabledImpl(Features, "lzcnt", true);
2177 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002178 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002179 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002180 case CK_BTVER2:
Craig Topper85bfef62013-09-17 04:51:29 +00002181 setFeatureEnabledImpl(Features, "avx", true);
2182 setFeatureEnabledImpl(Features, "sse4a", true);
2183 setFeatureEnabledImpl(Features, "lzcnt", true);
2184 setFeatureEnabledImpl(Features, "aes", true);
2185 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002186 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002187 setFeatureEnabledImpl(Features, "bmi", true);
2188 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002189 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer63063f52013-05-03 10:47:15 +00002190 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002191 case CK_BDVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002192 setFeatureEnabledImpl(Features, "xop", true);
2193 setFeatureEnabledImpl(Features, "lzcnt", true);
2194 setFeatureEnabledImpl(Features, "aes", true);
2195 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002196 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002197 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002198 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002199 case CK_BDVER4:
2200 setFeatureEnabledImpl(Features, "avx2", true);
2201 setFeatureEnabledImpl(Features, "bmi2", true);
2202 // FALLTHROUGH
Eli Friedmanfaf35382012-11-17 01:43:10 +00002203 case CK_BDVER2:
Benjamin Kramera2420962013-11-04 10:29:51 +00002204 case CK_BDVER3:
Craig Topper85bfef62013-09-17 04:51:29 +00002205 setFeatureEnabledImpl(Features, "xop", 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, "fma", true);
2212 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002213 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002214 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002215 break;
2216 case CK_C3_2:
Craig Topper85bfef62013-09-17 04:51:29 +00002217 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002218 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002219 }
Daniel Dunbar07181d72009-05-06 03:16:41 +00002220}
2221
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002222void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002223 X86SSEEnum Level, bool Enabled) {
Daniel Dunbar0838f962009-05-06 21:07:50 +00002224 if (Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002225 switch (Level) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002226 case AVX512F:
2227 Features["avx512f"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002228 case AVX2:
2229 Features["avx2"] = true;
2230 case AVX:
2231 Features["avx"] = true;
2232 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002233 Features["sse4.2"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002234 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002235 Features["sse4.1"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002236 case SSSE3:
2237 Features["ssse3"] = true;
2238 case SSE3:
2239 Features["sse3"] = true;
2240 case SSE2:
2241 Features["sse2"] = true;
2242 case SSE1:
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002243 Features["sse"] = true;
2244 case NoSSE:
2245 break;
2246 }
2247 return;
Daniel Dunbar0838f962009-05-06 21:07:50 +00002248 }
2249
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002250 switch (Level) {
2251 case NoSSE:
2252 case SSE1:
2253 Features["sse"] = false;
2254 case SSE2:
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002255 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2256 Features["sha"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002257 case SSE3:
2258 Features["sse3"] = false;
2259 setXOPLevel(Features, NoXOP, false);
2260 case SSSE3:
2261 Features["ssse3"] = false;
2262 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002263 Features["sse4.1"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002264 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002265 Features["sse4.2"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002266 case AVX:
Craig Topper84f007b2013-09-16 04:54:13 +00002267 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola29f26de2013-08-21 13:28:02 +00002268 setXOPLevel(Features, FMA4, false);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002269 case AVX2:
2270 Features["avx2"] = false;
Craig Topperb7a95d22013-08-21 03:59:22 +00002271 case AVX512F:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002272 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2273 Features["avx512pf"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002274 }
Daniel Dunbar0838f962009-05-06 21:07:50 +00002275}
2276
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002277void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002278 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002279 if (Enabled) {
2280 switch (Level) {
2281 case AMD3DNowAthlon:
2282 Features["3dnowa"] = true;
2283 case AMD3DNow:
2284 Features["3dnow"] = true;
2285 case MMX:
2286 Features["mmx"] = true;
2287 case NoMMX3DNow:
2288 break;
2289 }
2290 return;
2291 }
2292
2293 switch (Level) {
2294 case NoMMX3DNow:
2295 case MMX:
2296 Features["mmx"] = false;
2297 case AMD3DNow:
2298 Features["3dnow"] = false;
2299 case AMD3DNowAthlon:
2300 Features["3dnowa"] = false;
2301 }
2302}
2303
2304void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper319d81f2013-09-17 04:12:55 +00002305 bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002306 if (Enabled) {
2307 switch (Level) {
2308 case XOP:
2309 Features["xop"] = true;
2310 case FMA4:
2311 Features["fma4"] = true;
2312 setSSELevel(Features, AVX, true);
2313 case SSE4A:
2314 Features["sse4a"] = true;
2315 setSSELevel(Features, SSE3, true);
2316 case NoXOP:
2317 break;
2318 }
2319 return;
2320 }
2321
2322 switch (Level) {
2323 case NoXOP:
2324 case SSE4A:
2325 Features["sse4a"] = false;
2326 case FMA4:
2327 Features["fma4"] = false;
2328 case XOP:
2329 Features["xop"] = false;
2330 }
2331}
2332
Craig Topper85bfef62013-09-17 04:51:29 +00002333void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2334 StringRef Name, bool Enabled) {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002335 // FIXME: This *really* should not be here. We need some way of translating
2336 // options into llvm subtarget features.
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002337 if (Name == "sse4")
2338 Name = "sse4.2";
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002339
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002340 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002341
Craig Topperb22352e2013-09-19 01:13:07 +00002342 if (Name == "mmx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002343 setMMXLevel(Features, MMX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002344 } else if (Name == "sse") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002345 setSSELevel(Features, SSE1, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002346 } else if (Name == "sse2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002347 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002348 } else if (Name == "sse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002349 setSSELevel(Features, SSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002350 } else if (Name == "ssse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002351 setSSELevel(Features, SSSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002352 } else if (Name == "sse4.2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002353 setSSELevel(Features, SSE42, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002354 } else if (Name == "sse4.1") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002355 setSSELevel(Features, SSE41, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002356 } else if (Name == "3dnow") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002357 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002358 } else if (Name == "3dnowa") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002359 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002360 } else if (Name == "aes") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002361 if (Enabled)
2362 setSSELevel(Features, SSE2, Enabled);
2363 } else if (Name == "pclmul") {
2364 if (Enabled)
2365 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002366 } else if (Name == "avx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002367 setSSELevel(Features, AVX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002368 } else if (Name == "avx2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002369 setSSELevel(Features, AVX2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002370 } else if (Name == "avx512f") {
Craig Topperb7a95d22013-08-21 03:59:22 +00002371 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002372 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topperbca2c4f2013-08-21 05:29:10 +00002373 if (Enabled)
2374 setSSELevel(Features, AVX512F, Enabled);
2375 } else if (Name == "fma") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002376 if (Enabled)
2377 setSSELevel(Features, AVX, Enabled);
2378 } else if (Name == "fma4") {
2379 setXOPLevel(Features, FMA4, Enabled);
2380 } else if (Name == "xop") {
2381 setXOPLevel(Features, XOP, Enabled);
2382 } else if (Name == "sse4a") {
2383 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper84f007b2013-09-16 04:54:13 +00002384 } else if (Name == "f16c") {
2385 if (Enabled)
2386 setSSELevel(Features, AVX, Enabled);
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002387 } else if (Name == "sha") {
2388 if (Enabled)
2389 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002390 }
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002391}
2392
Eric Christopher3d11ced2013-10-16 21:26:26 +00002393/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar07181d72009-05-06 03:16:41 +00002394/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +00002395bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00002396 DiagnosticsEngine &Diags) {
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002397 // Remember the maximum enabled sselevel.
2398 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2399 // Ignore disabled features.
2400 if (Features[i][0] == '-')
2401 continue;
2402
Benjamin Kramer713575a2012-03-05 15:10:44 +00002403 StringRef Feature = StringRef(Features[i]).substr(1);
2404
2405 if (Feature == "aes") {
Eric Christopher6c4e7872010-04-02 23:50:19 +00002406 HasAES = true;
2407 continue;
2408 }
2409
Craig Topper3c0bc152012-05-31 05:18:48 +00002410 if (Feature == "pclmul") {
2411 HasPCLMUL = true;
2412 continue;
2413 }
2414
Benjamin Kramer713575a2012-03-05 15:10:44 +00002415 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002416 HasLZCNT = true;
2417 continue;
2418 }
2419
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002420 if (Feature == "rdrnd") {
Benjamin Kramer84f30802012-07-07 09:39:18 +00002421 HasRDRND = true;
2422 continue;
2423 }
2424
Benjamin Kramer713575a2012-03-05 15:10:44 +00002425 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002426 HasBMI = true;
2427 continue;
2428 }
2429
Benjamin Kramer713575a2012-03-05 15:10:44 +00002430 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002431 HasBMI2 = true;
2432 continue;
2433 }
2434
Benjamin Kramer713575a2012-03-05 15:10:44 +00002435 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002436 HasPOPCNT = true;
2437 continue;
2438 }
2439
Michael Liao463eb892012-11-10 05:17:46 +00002440 if (Feature == "rtm") {
2441 HasRTM = true;
2442 continue;
2443 }
2444
Michael Liao72339a02013-03-26 17:52:08 +00002445 if (Feature == "prfchw") {
2446 HasPRFCHW = true;
2447 continue;
2448 }
2449
Michael Liao1bfc28c2013-03-29 05:17:55 +00002450 if (Feature == "rdseed") {
2451 HasRDSEED = true;
2452 continue;
2453 }
2454
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002455 if (Feature == "tbm") {
2456 HasTBM = true;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002457 continue;
2458 }
2459
Craig Topper2ae95072012-06-03 21:46:30 +00002460 if (Feature == "fma") {
2461 HasFMA = true;
2462 continue;
2463 }
2464
Manman Ren146e5a42012-10-11 00:59:55 +00002465 if (Feature == "f16c") {
2466 HasF16C = true;
2467 continue;
2468 }
2469
Craig Topperbca2c4f2013-08-21 05:29:10 +00002470 if (Feature == "avx512cd") {
2471 HasAVX512CD = true;
2472 continue;
2473 }
2474
2475 if (Feature == "avx512er") {
2476 HasAVX512ER = true;
2477 continue;
2478 }
2479
2480 if (Feature == "avx512pf") {
2481 HasAVX512PF = true;
2482 continue;
2483 }
2484
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002485 if (Feature == "sha") {
2486 HasSHA = true;
2487 continue;
2488 }
2489
Nick Lewyckyaf945462013-10-05 20:14:27 +00002490 if (Feature == "cx16") {
2491 HasCX16 = true;
2492 continue;
2493 }
2494
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002495 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002496 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002497 .Case("avx512f", AVX512F)
Craig Topper05fe4b52012-01-09 09:19:09 +00002498 .Case("avx2", AVX2)
2499 .Case("avx", AVX)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002500 .Case("sse4.2", SSE42)
2501 .Case("sse4.1", SSE41)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002502 .Case("ssse3", SSSE3)
Nuno Lopes3a16d782010-03-12 10:20:09 +00002503 .Case("sse3", SSE3)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002504 .Case("sse2", SSE2)
2505 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002506 .Default(NoSSE);
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002507 SSELevel = std::max(SSELevel, Level);
Michael J. Spencerd5513a32010-10-21 03:16:25 +00002508
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002509 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002510 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone5e222f2010-01-27 03:47:49 +00002511 .Case("3dnowa", AMD3DNowAthlon)
2512 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002513 .Case("mmx", MMX)
2514 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002515 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002516
2517 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2518 .Case("xop", XOP)
2519 .Case("fma4", FMA4)
2520 .Case("sse4a", SSE4A)
2521 .Default(NoXOP);
2522 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002523 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002524
Craig Topper89a5e792013-09-10 06:55:47 +00002525 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2526 // Can't do this earlier because we need to be able to explicitly enable
2527 // popcnt and still disable sse4.2.
2528 if (!HasPOPCNT && SSELevel >= SSE42 &&
2529 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2530 HasPOPCNT = true;
2531 Features.push_back("+popcnt");
2532 }
2533
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002534 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2535 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2536 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2537 HasPRFCHW = true;
2538 Features.push_back("+prfchw");
2539 }
2540
Rafael Espindola5389b842013-08-21 21:59:03 +00002541 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2542 // matches the selected sse level.
2543 if (FPMath == FP_SSE && SSELevel < SSE1) {
2544 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2545 return false;
2546 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2547 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2548 return false;
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002549 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002550
2551 // Don't tell the backend if we're turning off mmx; it will end up disabling
2552 // SSE, which we don't want.
Craig Topper56bed972013-09-11 06:48:53 +00002553 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2554 // then enable MMX.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002555 std::vector<std::string>::iterator it;
2556 it = std::find(Features.begin(), Features.end(), "-mmx");
2557 if (it != Features.end())
2558 Features.erase(it);
Craig Topper56bed972013-09-11 06:48:53 +00002559 else if (SSELevel > NoSSE)
2560 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindola5389b842013-08-21 21:59:03 +00002561 return true;
Chris Lattner7d6220c2009-03-02 22:20:04 +00002562}
Chris Lattnerbef1d722009-03-02 22:27:17 +00002563
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002564/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2565/// definitions for this particular subtarget.
Chris Lattner79682402009-03-20 15:52:06 +00002566void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002567 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00002568 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002569 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002570 Builder.defineMacro("__amd64__");
2571 Builder.defineMacro("__amd64");
2572 Builder.defineMacro("__x86_64");
2573 Builder.defineMacro("__x86_64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +00002574 } else {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002575 DefineStd(Builder, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +00002576 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00002577
Chris Lattnerc0f59212009-03-02 22:27:17 +00002578 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002579 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2580 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002581 switch (CPU) {
2582 case CK_Generic:
2583 break;
2584 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002585 // The rest are coming from the i386 define above.
2586 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002587 break;
2588 case CK_i486:
2589 case CK_WinChipC6:
2590 case CK_WinChip2:
2591 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002592 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002593 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002594 case CK_PentiumMMX:
2595 Builder.defineMacro("__pentium_mmx__");
2596 Builder.defineMacro("__tune_pentium_mmx__");
2597 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002598 case CK_i586:
2599 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002600 defineCPUMacros(Builder, "i586");
2601 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002602 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002603 case CK_Pentium3:
2604 case CK_Pentium3M:
2605 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002606 Builder.defineMacro("__tune_pentium3__");
2607 // Fallthrough
2608 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002609 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002610 Builder.defineMacro("__tune_pentium2__");
2611 // Fallthrough
2612 case CK_PentiumPro:
2613 Builder.defineMacro("__tune_i686__");
2614 Builder.defineMacro("__tune_pentiumpro__");
2615 // Fallthrough
2616 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002617 Builder.defineMacro("__i686");
2618 Builder.defineMacro("__i686__");
2619 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2620 Builder.defineMacro("__pentiumpro");
2621 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002622 break;
2623 case CK_Pentium4:
2624 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002625 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002626 break;
2627 case CK_Yonah:
2628 case CK_Prescott:
2629 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002630 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002631 break;
2632 case CK_Core2:
2633 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002634 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002635 break;
2636 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002637 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002638 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002639 case CK_Silvermont:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00002640 defineCPUMacros(Builder, "slm");
2641 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002642 case CK_Corei7:
2643 case CK_Corei7AVX:
2644 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002645 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002646 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002647 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002648 case CK_KNL:
2649 defineCPUMacros(Builder, "knl");
2650 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002651 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002652 Builder.defineMacro("__k6_2__");
2653 Builder.defineMacro("__tune_k6_2__");
2654 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002655 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002656 if (CPU != CK_K6_2) { // In case of fallthrough
2657 // FIXME: GCC may be enabling these in cases where some other k6
2658 // architecture is specified but -m3dnow is explicitly provided. The
2659 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002660 Builder.defineMacro("__k6_3__");
2661 Builder.defineMacro("__tune_k6_3__");
2662 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002663 // Fallthrough
2664 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002665 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002666 break;
2667 case CK_Athlon:
2668 case CK_AthlonThunderbird:
2669 case CK_Athlon4:
2670 case CK_AthlonXP:
2671 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002672 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002673 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002674 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002675 Builder.defineMacro("__tune_athlon_sse__");
2676 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002677 break;
2678 case CK_K8:
2679 case CK_K8SSE3:
2680 case CK_x86_64:
2681 case CK_Opteron:
2682 case CK_OpteronSSE3:
2683 case CK_Athlon64:
2684 case CK_Athlon64SSE3:
2685 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002686 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002687 break;
Roman Divackyf051cde2011-10-30 07:48:46 +00002688 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002689 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002690 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002691 case CK_BTVER1:
2692 defineCPUMacros(Builder, "btver1");
Roman Divackyf051cde2011-10-30 07:48:46 +00002693 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002694 case CK_BTVER2:
2695 defineCPUMacros(Builder, "btver2");
2696 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002697 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002698 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002699 break;
2700 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002701 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002702 break;
Benjamin Kramera2420962013-11-04 10:29:51 +00002703 case CK_BDVER3:
2704 defineCPUMacros(Builder, "bdver3");
2705 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002706 case CK_BDVER4:
2707 defineCPUMacros(Builder, "bdver4");
2708 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002709 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002710 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002711 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002712 }
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002713
Chris Lattnerbef1d722009-03-02 22:27:17 +00002714 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002715 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002716
Chris Lattner25ac1c12009-04-19 17:32:33 +00002717 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2718 // functions in glibc header files that use FP Stack inline asm which the
2719 // backend can't deal with (PR879).
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002720 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikove7772382009-05-03 13:42:53 +00002721
Chandler Carruth88c75b02011-09-28 09:54:07 +00002722 if (HasAES)
2723 Builder.defineMacro("__AES__");
2724
Craig Topper3c0bc152012-05-31 05:18:48 +00002725 if (HasPCLMUL)
2726 Builder.defineMacro("__PCLMUL__");
2727
Craig Topper31ceea02011-12-25 05:06:45 +00002728 if (HasLZCNT)
2729 Builder.defineMacro("__LZCNT__");
2730
Benjamin Kramer84f30802012-07-07 09:39:18 +00002731 if (HasRDRND)
2732 Builder.defineMacro("__RDRND__");
2733
Craig Topper31ceea02011-12-25 05:06:45 +00002734 if (HasBMI)
2735 Builder.defineMacro("__BMI__");
2736
2737 if (HasBMI2)
2738 Builder.defineMacro("__BMI2__");
2739
Craig Toppere14e08b2011-12-29 16:10:46 +00002740 if (HasPOPCNT)
2741 Builder.defineMacro("__POPCNT__");
2742
Michael Liao463eb892012-11-10 05:17:46 +00002743 if (HasRTM)
2744 Builder.defineMacro("__RTM__");
2745
Michael Liao72339a02013-03-26 17:52:08 +00002746 if (HasPRFCHW)
2747 Builder.defineMacro("__PRFCHW__");
2748
Michael Liao1bfc28c2013-03-29 05:17:55 +00002749 if (HasRDSEED)
2750 Builder.defineMacro("__RDSEED__");
2751
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002752 if (HasTBM)
2753 Builder.defineMacro("__TBM__");
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002754
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002755 switch (XOPLevel) {
2756 case XOP:
2757 Builder.defineMacro("__XOP__");
2758 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00002759 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002760 case SSE4A:
2761 Builder.defineMacro("__SSE4A__");
2762 case NoXOP:
2763 break;
2764 }
Chandler Carruth88c75b02011-09-28 09:54:07 +00002765
Craig Topper2ae95072012-06-03 21:46:30 +00002766 if (HasFMA)
2767 Builder.defineMacro("__FMA__");
2768
Manman Ren146e5a42012-10-11 00:59:55 +00002769 if (HasF16C)
2770 Builder.defineMacro("__F16C__");
2771
Craig Topperbca2c4f2013-08-21 05:29:10 +00002772 if (HasAVX512CD)
2773 Builder.defineMacro("__AVX512CD__");
2774 if (HasAVX512ER)
2775 Builder.defineMacro("__AVX512ER__");
2776 if (HasAVX512PF)
2777 Builder.defineMacro("__AVX512PF__");
2778
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002779 if (HasSHA)
2780 Builder.defineMacro("__SHA__");
2781
Nick Lewyckyaf945462013-10-05 20:14:27 +00002782 if (HasCX16)
2783 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2784
Chris Lattner715fe4c2009-03-02 22:40:39 +00002785 // Each case falls through to the previous one here.
2786 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002787 case AVX512F:
Craig Topper42f98732013-08-20 07:39:54 +00002788 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00002789 case AVX2:
2790 Builder.defineMacro("__AVX2__");
2791 case AVX:
2792 Builder.defineMacro("__AVX__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002793 case SSE42:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002794 Builder.defineMacro("__SSE4_2__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002795 case SSE41:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002796 Builder.defineMacro("__SSE4_1__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002797 case SSSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002798 Builder.defineMacro("__SSSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002799 case SSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002800 Builder.defineMacro("__SSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002801 case SSE2:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002802 Builder.defineMacro("__SSE2__");
2803 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner715fe4c2009-03-02 22:40:39 +00002804 case SSE1:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002805 Builder.defineMacro("__SSE__");
2806 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002807 case NoSSE:
Chris Lattner715fe4c2009-03-02 22:40:39 +00002808 break;
2809 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00002810
Derek Schuffbabaf312012-10-11 15:52:22 +00002811 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer01e70082010-10-21 05:21:48 +00002812 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002813 case AVX512F:
Craig Topper05fe4b52012-01-09 09:19:09 +00002814 case AVX2:
2815 case AVX:
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00002816 case SSE42:
2817 case SSE41:
2818 case SSSE3:
2819 case SSE3:
Michael J. Spencer01e70082010-10-21 05:21:48 +00002820 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002821 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002822 break;
2823 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002824 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002825 break;
2826 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002827 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002828 }
2829 }
2830
Anders Carlssone5e222f2010-01-27 03:47:49 +00002831 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002832 switch (MMX3DNowLevel) {
Anders Carlssone5e222f2010-01-27 03:47:49 +00002833 case AMD3DNowAthlon:
2834 Builder.defineMacro("__3dNOW_A__");
2835 case AMD3DNow:
2836 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002837 case MMX:
2838 Builder.defineMacro("__MMX__");
2839 case NoMMX3DNow:
Anders Carlssone5e222f2010-01-27 03:47:49 +00002840 break;
2841 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00002842
2843 if (CPU >= CK_i486) {
2844 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2845 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2846 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2847 }
2848 if (CPU >= CK_i586)
2849 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerbef1d722009-03-02 22:27:17 +00002850}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002851
Douglas Gregore727d212012-01-30 06:38:25 +00002852bool X86TargetInfo::hasFeature(StringRef Feature) const {
2853 return llvm::StringSwitch<bool>(Feature)
2854 .Case("aes", HasAES)
2855 .Case("avx", SSELevel >= AVX)
2856 .Case("avx2", SSELevel >= AVX2)
Craig Topperb7a95d22013-08-21 03:59:22 +00002857 .Case("avx512f", SSELevel >= AVX512F)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002858 .Case("avx512cd", HasAVX512CD)
2859 .Case("avx512er", HasAVX512ER)
2860 .Case("avx512pf", HasAVX512PF)
Douglas Gregore727d212012-01-30 06:38:25 +00002861 .Case("bmi", HasBMI)
2862 .Case("bmi2", HasBMI2)
Nick Lewyckyaf945462013-10-05 20:14:27 +00002863 .Case("cx16", HasCX16)
2864 .Case("f16c", HasF16C)
Craig Topper2ae95072012-06-03 21:46:30 +00002865 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002866 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002867 .Case("tbm", HasTBM)
Douglas Gregore727d212012-01-30 06:38:25 +00002868 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002869 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002870 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2871 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2872 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002873 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002874 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002875 .Case("rtm", HasRTM)
Michael Liao72339a02013-03-26 17:52:08 +00002876 .Case("prfchw", HasPRFCHW)
Michael Liao1bfc28c2013-03-29 05:17:55 +00002877 .Case("rdseed", HasRDSEED)
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002878 .Case("sha", HasSHA)
Douglas Gregore727d212012-01-30 06:38:25 +00002879 .Case("sse", SSELevel >= SSE1)
2880 .Case("sse2", SSELevel >= SSE2)
2881 .Case("sse3", SSELevel >= SSE3)
2882 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002883 .Case("sse4.1", SSELevel >= SSE41)
2884 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002885 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregore727d212012-01-30 06:38:25 +00002886 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002887 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2888 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002889 .Case("xop", XOPLevel >= XOP)
Douglas Gregore727d212012-01-30 06:38:25 +00002890 .Default(false);
2891}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002892
Eli Friedman872996c2008-08-20 02:34:37 +00002893bool
Anders Carlsson36834a72009-02-28 17:11:49 +00002894X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00002895 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +00002896 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +00002897 default: return false;
Dale Johanneseneba819a2010-08-24 22:33:12 +00002898 case 'Y': // first letter of a pair:
2899 switch (*(Name+1)) {
2900 default: return false;
2901 case '0': // First SSE register.
2902 case 't': // Any SSE register, when SSE2 is enabled.
2903 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2904 case 'm': // any MMX register, when inter-unit moves enabled.
2905 break; // falls through to setAllowsRegister.
2906 }
Eli Friedman872996c2008-08-20 02:34:37 +00002907 case 'a': // eax.
2908 case 'b': // ebx.
2909 case 'c': // ecx.
2910 case 'd': // edx.
2911 case 'S': // esi.
2912 case 'D': // edi.
2913 case 'A': // edx:eax.
Dale Johanneseneba819a2010-08-24 22:33:12 +00002914 case 'f': // any x87 floating point stack register.
Eli Friedman872996c2008-08-20 02:34:37 +00002915 case 't': // top of floating point stack.
2916 case 'u': // second from top of floating point stack.
2917 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +00002918 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +00002919 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +00002920 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johanneseneba819a2010-08-24 22:33:12 +00002921 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2922 case 'l': // "Index" registers: any general register that can be used as an
2923 // index in a base+index memory access.
2924 Info.setAllowsRegister();
2925 return true;
2926 case 'C': // SSE floating point constant.
2927 case 'G': // x87 floating point constant.
Anton Korobeynikove7772382009-05-03 13:42:53 +00002928 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00002929 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +00002930 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00002931 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +00002932 return true;
2933 }
2934}
2935
Dale Johannesen3a161e52010-10-29 23:12:32 +00002936
Eli Friedman872996c2008-08-20 02:34:37 +00002937std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002938X86TargetInfo::convertConstraint(const char *&Constraint) const {
2939 switch (*Constraint) {
Eli Friedman872996c2008-08-20 02:34:37 +00002940 case 'a': return std::string("{ax}");
2941 case 'b': return std::string("{bx}");
2942 case 'c': return std::string("{cx}");
2943 case 'd': return std::string("{dx}");
2944 case 'S': return std::string("{si}");
2945 case 'D': return std::string("{di}");
Dale Johannesena49254e2010-10-22 21:07:10 +00002946 case 'p': // address
2947 return std::string("im");
Eli Friedman872996c2008-08-20 02:34:37 +00002948 case 't': // top of floating point stack.
2949 return std::string("{st}");
2950 case 'u': // second from top of floating point stack.
2951 return std::string("{st(1)}"); // second from top of floating point stack.
2952 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002953 return std::string(1, *Constraint);
Eli Friedman872996c2008-08-20 02:34:37 +00002954 }
2955}
Eli Friedman872996c2008-08-20 02:34:37 +00002956} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +00002957
2958namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00002959// X86-32 generic target
2960class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00002961public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002962 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00002963 DoubleAlign = LongLongAlign = 32;
2964 LongDoubleWidth = 96;
2965 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002966 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07002967 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman04ede302009-03-29 20:31:09 +00002968 SizeType = UnsignedInt;
2969 PtrDiffType = SignedInt;
2970 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00002971 RegParmMax = 3;
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00002972
2973 // Use fpret for all types.
2974 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2975 (1 << TargetInfo::Double) |
2976 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002977
2978 // x86-32 has atomics up to 8 bytes
2979 // FIXME: Check that we actually have cmpxchg8b before setting
2980 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2981 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman872996c2008-08-20 02:34:37 +00002982 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002983 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00002984 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman872996c2008-08-20 02:34:37 +00002985 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00002986
Stephen Hines651f13c2014-04-23 16:59:28 -07002987 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00002988 if (RegNo == 0) return 0;
2989 if (RegNo == 1) return 2;
2990 return -1;
2991 }
Stephen Hines651f13c2014-04-23 16:59:28 -07002992 bool validateInputSize(StringRef Constraint,
2993 unsigned Size) const override {
Bill Wendling68fd6082012-11-12 06:42:51 +00002994 switch (Constraint[0]) {
2995 default: break;
2996 case 'a':
2997 case 'b':
2998 case 'c':
2999 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00003000 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00003001 }
3002
3003 return true;
3004 }
Eli Friedman872996c2008-08-20 02:34:37 +00003005};
3006} // end anonymous namespace
3007
3008namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003009class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3010public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003011 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3012 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003013
Stephen Hines651f13c2014-04-23 16:59:28 -07003014 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger8daa7fe2013-11-11 14:00:37 +00003015 unsigned Major, Minor, Micro;
3016 getTriple().getOSVersion(Major, Minor, Micro);
3017 // New NetBSD uses the default rounding mode.
3018 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3019 return X86_32TargetInfo::getFloatEvalMethod();
3020 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003021 return 1;
3022 }
3023};
3024} // end anonymous namespace
3025
3026namespace {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003027class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3028public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003029 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3030 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003031 SizeType = UnsignedLong;
3032 IntPtrType = SignedLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003033 PtrDiffType = SignedLong;
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003034 }
3035};
3036} // end anonymous namespace
3037
3038namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003039class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3040public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003041 BitrigI386TargetInfo(const llvm::Triple &Triple)
3042 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00003043 SizeType = UnsignedLong;
3044 IntPtrType = SignedLong;
3045 PtrDiffType = SignedLong;
3046 }
3047};
3048} // end anonymous namespace
3049
3050namespace {
Edwin Török36565e52009-06-30 17:10:35 +00003051class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman872996c2008-08-20 02:34:37 +00003052public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003053 DarwinI386TargetInfo(const llvm::Triple &Triple)
3054 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003055 LongDoubleWidth = 128;
3056 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003057 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003058 MaxVectorAlign = 256;
Eli Friedman04ede302009-03-29 20:31:09 +00003059 SizeType = UnsignedLong;
3060 IntPtrType = SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003061 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbar9451c542010-05-27 00:35:16 +00003062 HasAlignMac68kSupport = true;
Edwin Török2d98f9f2009-06-30 17:00:25 +00003063 }
3064
Eli Friedman872996c2008-08-20 02:34:37 +00003065};
Daniel Dunbar64c77a12009-06-29 20:52:51 +00003066} // end anonymous namespace
3067
3068namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +00003069// x86-32 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003070class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman23cb7912008-08-21 01:40:19 +00003071public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003072 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3073 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattnera8a69e12009-06-24 17:12:15 +00003074 WCharType = UnsignedShort;
Eli Friedmanb28055e2009-06-08 21:16:17 +00003075 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003076 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedman23cb7912008-08-21 01:40:19 +00003077 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003078 void getTargetDefines(const LangOptions &Opts,
3079 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003080 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Eli Friedman23cb7912008-08-21 01:40:19 +00003081 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003082};
3083} // end anonymous namespace
Eli Friedman6b6ca942009-06-08 06:11:14 +00003084
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003085namespace {
3086
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003087// x86-32 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003088class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003089public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003090 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003091 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003092 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003093 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003094 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003095 void getTargetDefines(const LangOptions &Opts,
3096 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003097 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003098 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003099 // The value of the following reflects processor type.
3100 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3101 // We lost the original triple, so we use the default.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003102 Builder.defineMacro("_M_IX86", "600");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003103 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003104};
3105} // end anonymous namespace
3106
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003107static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3108 Builder.defineMacro("__MSVCRT__");
3109 Builder.defineMacro("__MINGW32__");
3110
3111 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3112 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3113 // macro anyway for pre-processor compatibility.
3114 if (Opts.MicrosoftExt)
3115 Builder.defineMacro("__declspec", "__declspec");
3116 else
3117 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3118
3119 if (!Opts.MicrosoftExt) {
3120 // Provide macros for all the calling convention keywords. Provide both
3121 // single and double underscore prefixed variants. These are available on
3122 // x64 as well as x86, even though they have no effect.
3123 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3124 for (const char *CC : CCs) {
3125 std::string GCCSpelling = "__attribute__((__";
3126 GCCSpelling += CC;
3127 GCCSpelling += "__))";
3128 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3129 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3130 }
3131 }
3132}
3133
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003134namespace {
3135// x86-32 MinGW target
3136class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3137public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003138 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3139 : WindowsX86_32TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003140 void getTargetDefines(const LangOptions &Opts,
3141 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003142 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003143 DefineStd(Builder, "WIN32", Opts);
3144 DefineStd(Builder, "WINNT", Opts);
3145 Builder.defineMacro("_X86_");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003146 addMinGWDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003147 }
3148};
3149} // end anonymous namespace
3150
3151namespace {
3152// x86-32 Cygwin target
3153class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3154public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003155 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3156 : X86_32TargetInfo(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003157 TLSSupported = false;
3158 WCharType = UnsignedShort;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003159 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003160 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003161 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003162 void getTargetDefines(const LangOptions &Opts,
3163 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003164 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003165 Builder.defineMacro("_X86_");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003166 Builder.defineMacro("__CYGWIN__");
3167 Builder.defineMacro("__CYGWIN32__");
3168 DefineStd(Builder, "unix", Opts);
Douglas Gregor9b22a172010-04-21 05:52:38 +00003169 if (Opts.CPlusPlus)
3170 Builder.defineMacro("_GNU_SOURCE");
Eli Friedman6b6ca942009-06-08 06:11:14 +00003171 }
Eli Friedman23cb7912008-08-21 01:40:19 +00003172};
3173} // end anonymous namespace
3174
3175namespace {
Chris Lattnerf853e732010-04-11 19:29:39 +00003176// x86-32 Haiku target
3177class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3178public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003179 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerf853e732010-04-11 19:29:39 +00003180 SizeType = UnsignedLong;
Chris Lattner5b8b18a2010-04-22 17:48:00 +00003181 IntPtrType = SignedLong;
3182 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003183 ProcessIDType = SignedLong;
Rafael Espindolaa7bdfdd2010-11-09 16:41:02 +00003184 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003185 this->TLSSupported = false;
Eli Friedman08f845b2010-08-22 01:00:03 +00003186 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003187 void getTargetDefines(const LangOptions &Opts,
3188 MacroBuilder &Builder) const override {
Chris Lattnerf853e732010-04-11 19:29:39 +00003189 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3190 Builder.defineMacro("__INTEL__");
3191 Builder.defineMacro("__HAIKU__");
3192 }
3193};
3194} // end anonymous namespace
3195
Douglas Gregordca52262011-07-01 22:41:14 +00003196// RTEMS Target
3197template<typename Target>
3198class RTEMSTargetInfo : public OSTargetInfo<Target> {
3199protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07003200 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3201 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003202 // RTEMS defines; list based off of gcc output
3203
Douglas Gregordca52262011-07-01 22:41:14 +00003204 Builder.defineMacro("__rtems__");
3205 Builder.defineMacro("__ELF__");
3206 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003207
Douglas Gregordca52262011-07-01 22:41:14 +00003208public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003209 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3210 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00003211
Benjamin Kramer9df08232013-06-29 16:37:14 +00003212 switch (Triple.getArch()) {
3213 default:
3214 case llvm::Triple::x86:
3215 // this->MCountName = ".mcount";
3216 break;
3217 case llvm::Triple::mips:
3218 case llvm::Triple::mipsel:
3219 case llvm::Triple::ppc:
3220 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003221 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003222 // this->MCountName = "_mcount";
3223 break;
3224 case llvm::Triple::arm:
3225 // this->MCountName = "__mcount";
3226 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003227 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003228 }
Douglas Gregordca52262011-07-01 22:41:14 +00003229};
3230
3231namespace {
3232// x86-32 RTEMS target
3233class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3234public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003235 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003236 SizeType = UnsignedLong;
3237 IntPtrType = SignedLong;
3238 PtrDiffType = SignedLong;
3239 this->UserLabelPrefix = "";
3240 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003241 void getTargetDefines(const LangOptions &Opts,
3242 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003243 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3244 Builder.defineMacro("__INTEL__");
3245 Builder.defineMacro("__rtems__");
3246 }
3247};
3248} // end anonymous namespace
3249
Chris Lattnerf853e732010-04-11 19:29:39 +00003250namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00003251// x86-64 generic target
3252class X86_64TargetInfo : public X86TargetInfo {
3253public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003254 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00003255 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003256 LongDoubleWidth = 128;
3257 LongDoubleAlign = 128;
Rafael Espindolabfa7c002010-06-04 23:15:27 +00003258 LargeArrayMinWidth = 128;
3259 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003260 SuitableAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00003261 IntMaxType = SignedLong;
3262 UIntMaxType = UnsignedLong;
Eli Friedman38e31802009-07-01 03:36:11 +00003263 Int64Type = SignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003264 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00003265
Stephen Hines651f13c2014-04-23 16:59:28 -07003266 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003267
3268 // Use fpret only for long double.
3269 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003270
Anders Carlsson321b7ac2011-10-31 16:27:11 +00003271 // Use fp2ret for _Complex long double.
3272 ComplexLongDoubleUsesFP2Ret = true;
3273
Eli Friedman2be46072011-10-14 20:59:01 +00003274 // x86-64 has atomics up to 16 bytes.
3275 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3276 // on CPUs with cmpxchg16b
3277 MaxAtomicPromoteWidth = 128;
3278 MaxAtomicInlineWidth = 64;
Chris Lattner4b009652007-07-25 00:24:17 +00003279 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003280 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003281 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson7dd1c952007-11-24 23:38:12 +00003282 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00003283
Stephen Hines651f13c2014-04-23 16:59:28 -07003284 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003285 if (RegNo == 0) return 0;
3286 if (RegNo == 1) return 1;
3287 return -1;
3288 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003289
Stephen Hines651f13c2014-04-23 16:59:28 -07003290 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003291 return (CC == CC_C ||
3292 CC == CC_IntelOclBicc ||
3293 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003294 }
3295
Stephen Hines651f13c2014-04-23 16:59:28 -07003296 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00003297 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003298 }
3299
Eli Friedman872996c2008-08-20 02:34:37 +00003300};
3301} // end anonymous namespace
3302
3303namespace {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003304// x86-64 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003305class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003306public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003307 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3308 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003309 WCharType = UnsignedShort;
Mike Stump4da7a162009-10-08 23:00:00 +00003310 LongWidth = LongAlign = 32;
Michael J. Spencer3d796932010-10-18 07:10:59 +00003311 DoubleAlign = LongLongAlign = 64;
Nate Begeman472bd992010-07-21 02:02:56 +00003312 IntMaxType = SignedLongLong;
3313 UIntMaxType = UnsignedLongLong;
3314 Int64Type = SignedLongLong;
Cameron Esfahani32083822010-09-15 00:28:12 +00003315 SizeType = UnsignedLongLong;
3316 PtrDiffType = SignedLongLong;
3317 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003318 this->UserLabelPrefix = "";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003319 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003320 void getTargetDefines(const LangOptions &Opts,
3321 MacroBuilder &Builder) const override {
Michael J. Spencer01e70082010-10-21 05:21:48 +00003322 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003323 Builder.defineMacro("_WIN64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003324 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003325 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003326 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003327 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003328 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003329 return (CC == CC_C ||
3330 CC == CC_IntelOclBicc ||
3331 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3332 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003333};
3334} // end anonymous namespace
3335
3336namespace {
3337// x86-64 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003338class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003339public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003340 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003341 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003342 LongDoubleWidth = LongDoubleAlign = 64;
3343 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003344 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003345 void getTargetDefines(const LangOptions &Opts,
3346 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003347 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003348 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003349 Builder.defineMacro("_M_X64");
Michael J. Spencer01e70082010-10-21 05:21:48 +00003350 Builder.defineMacro("_M_AMD64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003351 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003352};
3353} // end anonymous namespace
3354
3355namespace {
3356// x86-64 MinGW target
3357class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3358public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003359 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3360 : WindowsX86_64TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003361 void getTargetDefines(const LangOptions &Opts,
3362 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003363 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003364 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003365 Builder.defineMacro("__MINGW64__");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003366 addMinGWDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003367 }
3368};
3369} // end anonymous namespace
3370
3371namespace {
Eli Friedman38e31802009-07-01 03:36:11 +00003372class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3373public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003374 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3375 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman38e31802009-07-01 03:36:11 +00003376 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003377 MaxVectorAlign = 256;
Stephen Hines651f13c2014-04-23 16:59:28 -07003378 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3379 llvm::Triple T = llvm::Triple(Triple);
3380 if (T.getOS() == llvm::Triple::IOS)
3381 UseSignedCharForObjCBool = false;
3382 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman38e31802009-07-01 03:36:11 +00003383 }
3384};
3385} // end anonymous namespace
3386
3387namespace {
Eli Friedman96ada022009-07-05 22:31:18 +00003388class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3389public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003390 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3391 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman96ada022009-07-05 22:31:18 +00003392 IntMaxType = SignedLongLong;
3393 UIntMaxType = UnsignedLongLong;
3394 Int64Type = SignedLongLong;
3395 }
3396};
3397} // end anonymous namespace
3398
3399namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003400class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3401public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003402 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3403 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3404 IntMaxType = SignedLongLong;
3405 UIntMaxType = UnsignedLongLong;
3406 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003407 }
3408};
Tim Northoverc264e162013-01-31 12:13:10 +00003409}
3410
Eli Friedman42f74f22012-08-08 23:57:20 +00003411
3412namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00003413class ARMTargetInfo : public TargetInfo {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003414 // Possible FPU choices.
3415 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003416 VFP2FPU = (1 << 0),
3417 VFP3FPU = (1 << 1),
3418 VFP4FPU = (1 << 2),
Bernard Ogdenf779e652013-10-24 18:32:51 +00003419 NeonFPU = (1 << 3),
3420 FPARMV8 = (1 << 4)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003421 };
3422
Silviu Baranga1db2e272013-10-21 10:54:53 +00003423 // Possible HWDiv features.
3424 enum HWDivMode {
3425 HWDivThumb = (1 << 0),
3426 HWDivARM = (1 << 1)
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003427 };
3428
3429 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenf779e652013-10-24 18:32:51 +00003430 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003431 }
3432
3433 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3434 static const char * const GCCRegNames[];
Daniel Dunbar40b774e2009-09-17 07:03:19 +00003435
Daniel Dunbar33b40752009-12-18 18:42:37 +00003436 std::string ABI, CPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003437
Rafael Espindola5389b842013-08-21 21:59:03 +00003438 enum {
3439 FP_Default,
3440 FP_VFP,
3441 FP_Neon
3442 } FPMath;
3443
Bernard Ogdenf779e652013-10-24 18:32:51 +00003444 unsigned FPU : 5;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003445
Logan Chieneae5a8202012-10-10 06:56:20 +00003446 unsigned IsAAPCS : 1;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003447 unsigned IsThumb : 1;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003448 unsigned HWDiv : 2;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003449
3450 // Initialized via features.
3451 unsigned SoftFloat : 1;
3452 unsigned SoftFloatABI : 1;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003453
Bernard Ogden909f35a2013-10-29 09:47:51 +00003454 unsigned CRC : 1;
Stephen Hines651f13c2014-04-23 16:59:28 -07003455 unsigned Crypto : 1;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003456
Chris Lattnerb4527522010-03-03 19:03:45 +00003457 static const Builtin::Info BuiltinInfo[];
3458
Rafael Espindola620c0af2013-05-13 20:09:47 +00003459 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003460 if (T.isOSWindows())
3461 return true;
3462
Rafael Espindola620c0af2013-05-13 20:09:47 +00003463 // On linux, binaries targeting old cpus call functions in libgcc to
3464 // perform atomic operations. The implementation in libgcc then calls into
3465 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3466 // is that if we assume the kernel is at least as recent as the hardware,
3467 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani57b1da12013-09-14 01:09:11 +00003468 if (!T.isOSLinux() &&
Rafael Espindolae1e03422013-06-17 20:00:15 +00003469 T.getOS() != llvm::Triple::FreeBSD &&
Bill Wendling5fc00702013-12-03 05:11:19 +00003470 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindolae1e03422013-06-17 20:00:15 +00003471 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten04491632013-06-15 09:40:14 +00003472 return false;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003473 StringRef ArchName = T.getArchName();
Stephen Hines651f13c2014-04-23 16:59:28 -07003474 if (T.getArch() == llvm::Triple::arm ||
3475 T.getArch() == llvm::Triple::armeb) {
3476 StringRef VersionStr;
3477 if (ArchName.startswith("armv"))
3478 VersionStr = ArchName.substr(4);
3479 else if (ArchName.startswith("armebv"))
3480 VersionStr = ArchName.substr(6);
3481 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003482 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003483 unsigned Version;
3484 if (VersionStr.getAsInteger(10, Version))
3485 return false;
3486 return Version >= 6;
3487 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003488 assert(T.getArch() == llvm::Triple::thumb ||
3489 T.getArch() == llvm::Triple::thumbeb);
3490 StringRef VersionStr;
3491 if (ArchName.startswith("thumbv"))
3492 VersionStr = ArchName.substr(6);
3493 else if (ArchName.startswith("thumbebv"))
3494 VersionStr = ArchName.substr(8);
3495 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003496 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003497 unsigned Version;
3498 if (VersionStr.getAsInteger(10, Version))
3499 return false;
3500 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003501 }
3502
Stephen Hines651f13c2014-04-23 16:59:28 -07003503 void setABIAAPCS() {
3504 IsAAPCS = true;
3505
3506 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3507 const llvm::Triple &T = getTriple();
3508
3509 // size_t is unsigned long on Darwin and NetBSD.
3510 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003511 SizeType = UnsignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003512 else
3513 SizeType = UnsignedInt;
3514
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003515 switch (T.getOS()) {
3516 case llvm::Triple::NetBSD:
Bill Wendling604470b2013-12-01 04:22:48 +00003517 WCharType = SignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003518 break;
3519 case llvm::Triple::Win32:
3520 WCharType = UnsignedShort;
3521 break;
3522 case llvm::Triple::Linux:
3523 default:
Bill Wendling604470b2013-12-01 04:22:48 +00003524 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3525 WCharType = UnsignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003526 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07003527 }
3528
3529 UseBitFieldTypeAlignment = true;
3530
3531 ZeroLengthBitfieldBoundary = 0;
3532
3533 if (IsThumb) {
3534 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3535 // so set preferred for small types to 32.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003536 if (T.isOSBinFormatMachO()) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003537 DescriptionString = BigEndian ?
3538 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3539 "v128:64:128-a:0:32-n32-S64" :
3540 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3541 "v128:64:128-a:0:32-n32-S64";
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003542 } else if (T.isOSWindows()) {
3543 // FIXME: this is invalid for WindowsCE
3544 assert(!BigEndian && "Windows on ARM does not support big endian");
3545 DescriptionString = "e"
3546 "-m:e"
3547 "-p:32:32"
3548 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3549 "-v128:64:128"
3550 "-a:0:32"
3551 "-n32"
3552 "-S64";
3553 } else {
Stephen Hines651f13c2014-04-23 16:59:28 -07003554 DescriptionString = BigEndian ?
3555 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3556 "v128:64:128-a:0:32-n32-S64" :
3557 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3558 "v128:64:128-a:0:32-n32-S64";
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003559 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003560 } else {
3561 if (T.isOSBinFormatMachO())
3562 DescriptionString = BigEndian ?
3563 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3564 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3565 else
3566 DescriptionString = BigEndian ?
3567 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3568 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
3569 }
3570
3571 // FIXME: Enumerated types are variable width in straight AAPCS.
3572 }
3573
3574 void setABIAPCS() {
3575 const llvm::Triple &T = getTriple();
3576
3577 IsAAPCS = false;
3578
3579 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3580
3581 // size_t is unsigned int on FreeBSD.
3582 if (T.getOS() == llvm::Triple::FreeBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003583 SizeType = UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07003584 else
3585 SizeType = UnsignedLong;
3586
3587 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3588 WCharType = SignedInt;
3589
3590 // Do not respect the alignment of bit-field types when laying out
3591 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3592 UseBitFieldTypeAlignment = false;
3593
3594 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3595 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3596 /// gcc.
3597 ZeroLengthBitfieldBoundary = 32;
3598
3599 if (IsThumb) {
3600 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3601 // so set preferred for small types to 32.
3602 if (T.isOSBinFormatMachO())
3603 DescriptionString = BigEndian ?
3604 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3605 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3606 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3607 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3608 else
3609 DescriptionString = BigEndian ?
3610 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3611 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3612 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3613 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3614 } else {
3615 if (T.isOSBinFormatMachO())
3616 DescriptionString = BigEndian ?
3617 "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3618 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3619 else
3620 DescriptionString = BigEndian ?
3621 "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3622 "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3623 }
3624
3625 // FIXME: Override "preferred align" for double and long long.
3626 }
3627
3628public:
3629 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
3630 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3631 IsAAPCS(true) {
3632 BigEndian = IsBigEndian;
3633
3634 switch (getTriple().getOS()) {
3635 case llvm::Triple::NetBSD:
3636 PtrDiffType = SignedLong;
3637 break;
3638 default:
Bill Wendling85ad3892013-12-02 19:19:57 +00003639 PtrDiffType = SignedInt;
Bill Wendling604470b2013-12-01 04:22:48 +00003640 break;
3641 }
Daniel Dunbarf0156562009-09-17 16:21:10 +00003642
Chris Lattnere20b8122010-04-23 16:29:58 +00003643 // {} in inline assembly are neon specifiers, not assembly variant
3644 // specifiers.
3645 NoAsmVariants = true;
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003646
Daniel Dunbar33b40752009-12-18 18:42:37 +00003647 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0a542ca2009-12-18 19:57:13 +00003648 IsThumb = getTriple().getArchName().startswith("thumb");
Stephen Hines651f13c2014-04-23 16:59:28 -07003649
3650 setABI("aapcs-linux");
John McCall68086b92010-08-21 22:46:04 +00003651
3652 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003653 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003654
3655 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003656 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003657 if (shouldUseInlineAtomic(getTriple()))
3658 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003659
3660 // Do force alignment of members that follow zero length bitfields. If
3661 // the alignment of the zero-length bitfield is greater than the member
3662 // that follows it, `bar', `bar' will be aligned as the type of the
3663 // zero length bitfield.
3664 UseZeroLengthBitfieldAlignment = true;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003665 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003666 const char *getABI() const override { return ABI.c_str(); }
3667 bool setABI(const std::string &Name) override {
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003668 ABI = Name;
3669
Daniel Dunbarb9531632009-09-14 00:02:24 +00003670 // The defaults (above) are for AAPCS, check if we need to change them.
3671 //
3672 // FIXME: We need support for -meabi... we could just mangle it into the
3673 // name.
3674 if (Name == "apcs-gnu") {
Stephen Hines651f13c2014-04-23 16:59:28 -07003675 setABIAPCS();
3676 return true;
3677 }
3678 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3679 setABIAAPCS();
3680 return true;
3681 }
3682 return false;
Daniel Dunbarb9531632009-09-14 00:02:24 +00003683 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00003684
Stephen Hines651f13c2014-04-23 16:59:28 -07003685 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
3686 if (IsAAPCS)
3687 Features["aapcs"] = true;
3688 else
3689 Features["apcs"] = true;
3690
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003691 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003692 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3693 Features["vfp2"] = true;
Renato Golin1302f9f2013-09-13 17:02:45 +00003694 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3695 CPU == "cortex-a9-mp") {
3696 Features["vfp3"] = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003697 Features["neon"] = true;
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003698 }
3699 else if (CPU == "cortex-a5") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003700 Features["vfp4"] = true;
3701 Features["neon"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003702 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3703 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3704 CPU == "krait") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003705 Features["vfp4"] = true;
3706 Features["neon"] = true;
3707 Features["hwdiv"] = true;
3708 Features["hwdiv-arm"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003709 } else if (CPU == "cyclone") {
3710 Features["v8fp"] = true;
3711 Features["neon"] = true;
3712 Features["hwdiv"] = true;
3713 Features["hwdiv-arm"] = true;
Bernard Ogdenf779e652013-10-24 18:32:51 +00003714 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3715 Features["fp-armv8"] = true;
3716 Features["neon"] = true;
3717 Features["hwdiv"] = true;
3718 Features["hwdiv-arm"] = true;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003719 Features["crc"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003720 Features["crypto"] = true;
3721 } else if (CPU == "cortex-r5" ||
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003722 // Enable the hwdiv extension for all v8a AArch32 cores by
3723 // default.
3724 ArchName == "armv8a" || ArchName == "armv8" ||
Stephen Hines651f13c2014-04-23 16:59:28 -07003725 ArchName == "armebv8a" || ArchName == "armebv8" ||
3726 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3727 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003728 Features["hwdiv"] = true;
3729 Features["hwdiv-arm"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003730 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3731 Features["hwdiv"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003732 }
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003733 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003734
Stephen Hines651f13c2014-04-23 16:59:28 -07003735 bool handleTargetFeatures(std::vector<std::string> &Features,
3736 DiagnosticsEngine &Diags) override {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003737 FPU = 0;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003738 CRC = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07003739 Crypto = 0;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003740 SoftFloat = SoftFloatABI = false;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003741 HWDiv = 0;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003742 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3743 if (Features[i] == "+soft-float")
3744 SoftFloat = true;
3745 else if (Features[i] == "+soft-float-abi")
3746 SoftFloatABI = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003747 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003748 FPU |= VFP2FPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003749 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003750 FPU |= VFP3FPU;
3751 else if (Features[i] == "+vfp4")
3752 FPU |= VFP4FPU;
Bernard Ogdenf779e652013-10-24 18:32:51 +00003753 else if (Features[i] == "+fp-armv8")
3754 FPU |= FPARMV8;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003755 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003756 FPU |= NeonFPU;
Stephen Hines64f85312011-10-21 14:54:52 -07003757 else if (Features[i] == "+long64")
3758 LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
Silviu Baranga1db2e272013-10-21 10:54:53 +00003759 else if (Features[i] == "+hwdiv")
3760 HWDiv |= HWDivThumb;
3761 else if (Features[i] == "+hwdiv-arm")
3762 HWDiv |= HWDivARM;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003763 else if (Features[i] == "+crc")
3764 CRC = 1;
Stephen Hines651f13c2014-04-23 16:59:28 -07003765 else if (Features[i] == "+crypto")
3766 Crypto = 1;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003767 }
3768
Rafael Espindola5389b842013-08-21 21:59:03 +00003769 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3770 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3771 return false;
3772 }
3773
3774 if (FPMath == FP_Neon)
3775 Features.push_back("+neonfp");
3776 else if (FPMath == FP_VFP)
3777 Features.push_back("-neonfp");
3778
Daniel Dunbar48075d82009-12-19 04:15:38 +00003779 // Remove front-end specific options which the backend handles differently.
3780 std::vector<std::string>::iterator it;
3781 it = std::find(Features.begin(), Features.end(), "+soft-float");
3782 if (it != Features.end())
3783 Features.erase(it);
3784 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3785 if (it != Features.end())
3786 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00003787 return true;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003788 }
3789
Stephen Hines651f13c2014-04-23 16:59:28 -07003790 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00003791 return llvm::StringSwitch<bool>(Feature)
3792 .Case("arm", true)
3793 .Case("softfloat", SoftFloat)
3794 .Case("thumb", IsThumb)
Amara Emerson2440fb12013-09-16 18:07:35 +00003795 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Baranga1db2e272013-10-21 10:54:53 +00003796 .Case("hwdiv", HWDiv & HWDivThumb)
3797 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregore727d212012-01-30 06:38:25 +00003798 .Default(false);
3799 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003800 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003801 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbar33b40752009-12-18 18:42:37 +00003802 return llvm::StringSwitch<const char*>(Name)
3803 .Cases("arm8", "arm810", "4")
3804 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3805 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3806 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3807 .Case("ep9312", "4T")
3808 .Cases("arm10tdmi", "arm1020t", "5T")
3809 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3810 .Case("arm926ej-s", "5TEJ")
3811 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3812 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003813 .Case("arm1136j-s", "6J")
Daniel Dunbar33b40752009-12-18 18:42:37 +00003814 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003815 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbar33b40752009-12-18 18:42:37 +00003816 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Stephen Hines651f13c2014-04-23 16:59:28 -07003817 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
3818 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin5df40452013-09-13 17:02:54 +00003819 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003820 .Case("swift", "7S")
Stephen Hines651f13c2014-04-23 16:59:28 -07003821 .Case("cyclone", "8A")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003822 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003823 .Case("cortex-m0", "6M")
Bernard Ogdenc4272492013-10-24 18:32:36 +00003824 .Cases("cortex-a53", "cortex-a57", "8A")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003825 .Default(nullptr);
Daniel Dunbar33b40752009-12-18 18:42:37 +00003826 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003827 static const char *getCPUProfile(StringRef Name) {
3828 return llvm::StringSwitch<const char*>(Name)
Renato Golin5df40452013-09-13 17:02:54 +00003829 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Stephen Hines651f13c2014-04-23 16:59:28 -07003830 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogdenc4272492013-10-24 18:32:36 +00003831 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003832 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin5df40452013-09-13 17:02:54 +00003833 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003834 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003835 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003836 bool setCPU(const std::string &Name) override {
Daniel Dunbar33b40752009-12-18 18:42:37 +00003837 if (!getCPUDefineSuffix(Name))
3838 return false;
3839
3840 CPU = Name;
3841 return true;
3842 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003843 bool setFPMath(StringRef Name) override;
3844 void getTargetDefines(const LangOptions &Opts,
3845 MacroBuilder &Builder) const override {
Chris Lattnerbef1d722009-03-02 22:27:17 +00003846 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003847 Builder.defineMacro("__arm");
3848 Builder.defineMacro("__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00003849
Chris Lattnerbef1d722009-03-02 22:27:17 +00003850 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003851 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbar33b40752009-12-18 18:42:37 +00003852
Chris Lattner5f9e2722011-07-23 10:55:15 +00003853 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden51f997d2013-10-24 18:32:44 +00003854 unsigned int CPUArchVer;
3855 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3856 llvm_unreachable("Invalid char for architecture version number");
3857 }
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003858 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003859 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3860 StringRef CPUProfile = getCPUProfile(CPU);
3861 if (!CPUProfile.empty())
3862 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Stephen Hines651f13c2014-04-23 16:59:28 -07003863
Mike Stumpf90a29f2009-04-08 02:07:04 +00003864 // Subtarget options.
Daniel Dunbarf0156562009-09-17 16:21:10 +00003865
Daniel Dunbar33b40752009-12-18 18:42:37 +00003866 // FIXME: It's more complicated than this and we don't really support
3867 // interworking.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003868 // Windows on ARM does not "support" interworking
3869 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003870 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00003871
David Tweedb16abb12012-10-25 13:33:01 +00003872 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northover9b796302013-11-11 19:11:22 +00003873 // Embedded targets on Darwin follow AAPCS, but not EABI.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003874 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
3875 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbar849289e2012-10-22 18:51:13 +00003876 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003877 Builder.defineMacro("__ARM_PCS", "1");
3878
David Tweedb16abb12012-10-25 13:33:01 +00003879 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003880 Builder.defineMacro("__ARM_PCS_VFP", "1");
3881 }
Daniel Dunbar33b40752009-12-18 18:42:37 +00003882
Daniel Dunbar48075d82009-12-19 04:15:38 +00003883 if (SoftFloat)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003884 Builder.defineMacro("__SOFTFP__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00003885
3886 if (CPU == "xscale")
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003887 Builder.defineMacro("__XSCALE__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00003888
3889 if (IsThumb) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003890 Builder.defineMacro("__THUMBEL__");
3891 Builder.defineMacro("__thumb__");
Stephen Hines651f13c2014-04-23 16:59:28 -07003892 // We check both CPUArchVer and ArchName because when only triple is
3893 // specified, the default CPU is arm1136j-s.
3894 StringRef ArchName = getTriple().getArchName();
3895 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
3896 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003897 Builder.defineMacro("__thumb2__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00003898 }
Silviu Baranga1db2e272013-10-21 10:54:53 +00003899 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3900 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbarf0156562009-09-17 16:21:10 +00003901
3902 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003903 Builder.defineMacro("__APCS_32__");
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003904
Bob Wilsoncfaab002012-09-29 23:52:52 +00003905 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003906 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003907 if (FPU & VFP2FPU)
3908 Builder.defineMacro("__ARM_VFPV2__");
3909 if (FPU & VFP3FPU)
3910 Builder.defineMacro("__ARM_VFPV3__");
3911 if (FPU & VFP4FPU)
3912 Builder.defineMacro("__ARM_VFPV4__");
3913 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003914
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003915 // This only gets set when Neon instructions are actually available, unlike
3916 // the VFP define, hence the soft float and arch check. This is subtly
3917 // different from gcc, we follow the intent which was that it should be set
3918 // when Neon instructions are actually available.
Stephen Hines651f13c2014-04-23 16:59:28 -07003919 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
3920 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003921 Builder.defineMacro("__ARM_NEON__");
Stephen Hines651f13c2014-04-23 16:59:28 -07003922 }
3923
3924 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
3925 Opts.ShortWChar ? "2" : "4");
3926
3927 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
3928 Opts.ShortEnums ? "1" : "4");
Joey Gouly520ec1e2013-09-18 10:07:09 +00003929
Bernard Ogden909f35a2013-10-29 09:47:51 +00003930 if (CRC)
Joey Gouly520ec1e2013-09-18 10:07:09 +00003931 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao8712ded2013-09-30 22:51:32 +00003932
Stephen Hines651f13c2014-04-23 16:59:28 -07003933 if (Crypto)
3934 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
3935
Bernard Ogden51f997d2013-10-24 18:32:44 +00003936 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao8712ded2013-09-30 22:51:32 +00003937 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3938 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3939 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3940 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3941 }
Chris Lattner9fd73612008-04-21 18:56:49 +00003942 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003943 void getTargetBuiltins(const Builtin::Info *&Records,
3944 unsigned &NumRecords) const override {
Chris Lattnerb4527522010-03-03 19:03:45 +00003945 Records = BuiltinInfo;
3946 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner9fd73612008-04-21 18:56:49 +00003947 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003948 bool isCLZForZeroUndef() const override { return false; }
3949 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chieneae5a8202012-10-10 06:56:20 +00003950 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner9fd73612008-04-21 18:56:49 +00003951 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003952 void getGCCRegNames(const char * const *&Names,
3953 unsigned &NumNames) const override;
3954 void getGCCRegAliases(const GCCRegAlias *&Aliases,
3955 unsigned &NumAliases) const override;
3956 bool validateAsmConstraint(const char *&Name,
3957 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +00003958 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003959 default: break;
Nate Begeman222823a2008-04-22 05:03:19 +00003960 case 'l': // r0-r7
3961 case 'h': // r8-r15
3962 case 'w': // VFP Floating point register single precision
3963 case 'P': // VFP Floating point register double precision
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00003964 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00003965 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003966 case 'Q': // A memory address that is a single base register.
3967 Info.setAllowsMemory();
3968 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003969 case 'U': // a memory reference...
3970 switch (Name[1]) {
3971 case 'q': // ...ARMV4 ldrsb
3972 case 'v': // ...VFP load/store (reg+constant offset)
3973 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003974 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003975 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003976 case 'n': // valid address for Neon doubleword vector load/store
3977 case 'm': // valid address for Neon element and structure load/store
3978 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003979 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003980 Info.setAllowsMemory();
3981 Name++;
3982 return true;
3983 }
Nate Begeman222823a2008-04-22 05:03:19 +00003984 }
Chris Lattner9fd73612008-04-21 18:56:49 +00003985 return false;
3986 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003987 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings002333f2011-06-07 23:45:05 +00003988 std::string R;
3989 switch (*Constraint) {
3990 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003991 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003992 Constraint++;
3993 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003994 case 'p': // 'p' should be translated to 'r' by default.
3995 R = std::string("r");
3996 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003997 default:
3998 return std::string(1, *Constraint);
3999 }
4000 return R;
4001 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004002 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4003 unsigned Size) const override {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004004 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00004005 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004006
Bill Wendling50d46ca2012-10-25 23:28:48 +00004007 // Strip off constraint modifiers.
4008 while (Constraint[0] == '=' ||
4009 Constraint[0] == '+' ||
4010 Constraint[0] == '&')
4011 Constraint = Constraint.substr(1);
4012
4013 switch (Constraint[0]) {
4014 default: break;
4015 case 'r': {
4016 switch (Modifier) {
4017 default:
Bill Wendlingdd6669d2013-12-09 02:58:56 +00004018 return (isInOut || isOutput || Size <= 64);
Bill Wendling50d46ca2012-10-25 23:28:48 +00004019 case 'q':
4020 // A register of size 32 cannot fit a vector type.
4021 return false;
4022 }
4023 }
4024 }
4025
4026 return true;
4027 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004028 const char *getClobbers() const override {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004029 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00004030 return "";
4031 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00004032
Stephen Hines651f13c2014-04-23 16:59:28 -07004033 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00004034 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4035 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004036
Stephen Hines651f13c2014-04-23 16:59:28 -07004037 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00004038 if (RegNo == 0) return 0;
4039 if (RegNo == 1) return 1;
4040 return -1;
4041 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004042};
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004043
Rafael Espindola5389b842013-08-21 21:59:03 +00004044bool ARMTargetInfo::setFPMath(StringRef Name) {
4045 if (Name == "neon") {
4046 FPMath = FP_Neon;
4047 return true;
4048 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4049 Name == "vfp4") {
4050 FPMath = FP_VFP;
4051 return true;
4052 }
4053 return false;
4054}
4055
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004056const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004057 // Integer registers
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004058 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004059 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4060
4061 // Float registers
4062 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4063 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4064 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004065 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004066
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004067 // Double registers
4068 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4069 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesen0d79b042010-10-28 01:05:37 +00004070 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4071 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004072
4073 // Quad registers
Dale Johannesen0d79b042010-10-28 01:05:37 +00004074 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4075 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004076};
4077
4078void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004079 unsigned &NumNames) const {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004080 Names = GCCRegNames;
4081 NumNames = llvm::array_lengthof(GCCRegNames);
4082}
4083
4084const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004085 { { "a1" }, "r0" },
4086 { { "a2" }, "r1" },
4087 { { "a3" }, "r2" },
4088 { { "a4" }, "r3" },
4089 { { "v1" }, "r4" },
4090 { { "v2" }, "r5" },
4091 { { "v3" }, "r6" },
4092 { { "v4" }, "r7" },
4093 { { "v5" }, "r8" },
4094 { { "v6", "rfp" }, "r9" },
4095 { { "sl" }, "r10" },
4096 { { "fp" }, "r11" },
4097 { { "ip" }, "r12" },
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004098 { { "r13" }, "sp" },
4099 { { "r14" }, "lr" },
4100 { { "r15" }, "pc" },
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004101 // The S, D and Q registers overlap, but aren't really aliases; we
4102 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004103};
4104
4105void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4106 unsigned &NumAliases) const {
4107 Aliases = GCCRegAliases;
4108 NumAliases = llvm::array_lengthof(GCCRegAliases);
4109}
Chris Lattnerb4527522010-03-03 19:03:45 +00004110
4111const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00004112#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00004113#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00004114 ALL_LANGUAGES },
Stephen Hines651f13c2014-04-23 16:59:28 -07004115#include "clang/Basic/BuiltinsNEON.def"
4116
4117#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4118#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4119 ALL_LANGUAGES },
Chris Lattnerb4527522010-03-03 19:03:45 +00004120#include "clang/Basic/BuiltinsARM.def"
4121};
Stephen Hines651f13c2014-04-23 16:59:28 -07004122
4123class ARMleTargetInfo : public ARMTargetInfo {
4124public:
4125 ARMleTargetInfo(const llvm::Triple &Triple)
4126 : ARMTargetInfo(Triple, false) { }
4127 virtual void getTargetDefines(const LangOptions &Opts,
4128 MacroBuilder &Builder) const {
4129 Builder.defineMacro("__ARMEL__");
4130 ARMTargetInfo::getTargetDefines(Opts, Builder);
4131 }
4132};
4133
4134class ARMbeTargetInfo : public ARMTargetInfo {
4135public:
4136 ARMbeTargetInfo(const llvm::Triple &Triple)
4137 : ARMTargetInfo(Triple, true) { }
4138 virtual void getTargetDefines(const LangOptions &Opts,
4139 MacroBuilder &Builder) const {
4140 Builder.defineMacro("__ARMEB__");
4141 Builder.defineMacro("__ARM_BIG_ENDIAN");
4142 ARMTargetInfo::getTargetDefines(Opts, Builder);
4143 }
4144};
Chris Lattner9fd73612008-04-21 18:56:49 +00004145} // end anonymous namespace.
4146
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004147namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004148class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4149 const llvm::Triple Triple;
4150public:
4151 WindowsARMTargetInfo(const llvm::Triple &Triple)
4152 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4153 TLSSupported = false;
4154 WCharType = UnsignedShort;
4155 SizeType = UnsignedInt;
4156 UserLabelPrefix = "";
4157 }
4158 void getVisualStudioDefines(const LangOptions &Opts,
4159 MacroBuilder &Builder) const {
4160 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4161
4162 // FIXME: this is invalid for WindowsCE
4163 Builder.defineMacro("_M_ARM_NT", "1");
4164 Builder.defineMacro("_M_ARMT", "_M_ARM");
4165 Builder.defineMacro("_M_THUMB", "_M_ARM");
4166
4167 assert((Triple.getArch() == llvm::Triple::arm ||
4168 Triple.getArch() == llvm::Triple::thumb) &&
4169 "invalid architecture for Windows ARM target info");
4170 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4171 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4172
4173 // TODO map the complete set of values
4174 // 31: VFPv3 40: VFPv4
4175 Builder.defineMacro("_M_ARM_FP", "31");
4176 }
4177};
4178
4179// Windows ARM + Itanium C++ ABI Target
4180class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4181public:
4182 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4183 : WindowsARMTargetInfo(Triple) {
4184 TheCXXABI.set(TargetCXXABI::GenericARM);
4185 }
4186
4187 void getTargetDefines(const LangOptions &Opts,
4188 MacroBuilder &Builder) const override {
4189 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4190
4191 if (Opts.MSVCCompat)
4192 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4193 }
4194};
4195
4196// Windows ARM, MS (C++) ABI
4197class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4198public:
4199 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4200 : WindowsARMTargetInfo(Triple) {
4201 TheCXXABI.set(TargetCXXABI::Microsoft);
4202 }
4203
4204 void getTargetDefines(const LangOptions &Opts,
4205 MacroBuilder &Builder) const override {
4206 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4207 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4208 }
4209};
4210}
4211
4212
4213namespace {
Mike Stump25cf7602009-09-09 15:08:12 +00004214class DarwinARMTargetInfo :
Stephen Hines651f13c2014-04-23 16:59:28 -07004215 public DarwinTargetInfo<ARMleTargetInfo> {
Edwin Török36565e52009-06-30 17:10:35 +00004216protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07004217 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4218 MacroBuilder &Builder) const override {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004219 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedman8f575172009-04-19 21:38:35 +00004220 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004221
Edwin Török36565e52009-06-30 17:10:35 +00004222public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004223 DarwinARMTargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004224 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar01045582010-05-27 07:00:26 +00004225 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004226 // iOS always has 64-bit atomic instructions.
Stephen Hines651f13c2014-04-23 16:59:28 -07004227 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman2be46072011-10-14 20:59:01 +00004228 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004229
4230 // Darwin on iOS uses a variant of the ARM C++ ABI.
4231 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar01045582010-05-27 07:00:26 +00004232 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004233};
4234} // end anonymous namespace.
4235
Tony Linthicum96319392011-12-12 21:14:55 +00004236
4237namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004238class AArch64TargetInfo : public TargetInfo {
4239 virtual void setDescriptionString() = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07004240 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4241 static const char *const GCCRegNames[];
4242
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004243 enum FPUModeEnum {
4244 FPUMode,
4245 NeonMode
4246 };
4247
4248 unsigned FPU;
4249 unsigned CRC;
4250 unsigned Crypto;
4251
Stephen Hines651f13c2014-04-23 16:59:28 -07004252 static const Builtin::Info BuiltinInfo[];
4253
4254 std::string ABI;
4255
4256public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004257 AArch64TargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004258 : TargetInfo(Triple), ABI("aapcs") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004259
4260 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4261 WCharType = SignedInt;
4262
4263 // NetBSD apparently prefers consistency across ARM targets to consistency
4264 // across 64-bit targets.
4265 Int64Type = SignedLongLong;
4266 IntMaxType = SignedLongLong;
4267 UIntMaxType = UnsignedLongLong;
4268 } else {
4269 WCharType = UnsignedInt;
4270 Int64Type = SignedLong;
4271 IntMaxType = SignedLong;
4272 UIntMaxType = UnsignedLong;
4273 }
4274
Stephen Hines651f13c2014-04-23 16:59:28 -07004275 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07004276 MaxVectorAlign = 128;
4277 RegParmMax = 8;
4278 MaxAtomicInlineWidth = 128;
4279 MaxAtomicPromoteWidth = 128;
4280
4281 LongDoubleWidth = LongDoubleAlign = 128;
4282 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4283
Stephen Hines651f13c2014-04-23 16:59:28 -07004284 // {} in inline assembly are neon specifiers, not assembly variant
4285 // specifiers.
4286 NoAsmVariants = true;
4287
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004288 // AArch64 targets default to using the ARM C++ ABI.
Stephen Hines651f13c2014-04-23 16:59:28 -07004289 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4290 }
4291
4292 virtual const char *getABI() const { return ABI.c_str(); }
4293 virtual bool setABI(const std::string &Name) {
4294 if (Name != "aapcs" && Name != "darwinpcs")
4295 return false;
4296
4297 ABI = Name;
4298 return true;
4299 }
4300
4301 virtual bool setCPU(const std::string &Name) {
4302 bool CPUKnown = llvm::StringSwitch<bool>(Name)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004303 .Case("generic", true)
4304 .Cases("cortex-a53", "cortex-a57", true)
Stephen Hines651f13c2014-04-23 16:59:28 -07004305 .Case("cyclone", true)
4306 .Default(false);
4307 return CPUKnown;
4308 }
4309
4310 virtual void getTargetDefines(const LangOptions &Opts,
4311 MacroBuilder &Builder) const {
4312 // Target identification.
Stephen Hines651f13c2014-04-23 16:59:28 -07004313 Builder.defineMacro("__aarch64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004314
4315 // Target properties.
4316 Builder.defineMacro("_LP64");
4317 Builder.defineMacro("__LP64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004318
4319 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4320 Builder.defineMacro("__ARM_ACLE", "200");
4321 Builder.defineMacro("__ARM_ARCH", "8");
4322 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4323
4324 Builder.defineMacro("__ARM_64BIT_STATE");
4325 Builder.defineMacro("__ARM_PCS_AAPCS64");
4326 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4327
4328 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4329 Builder.defineMacro("__ARM_FEATURE_CLZ");
4330 Builder.defineMacro("__ARM_FEATURE_FMA");
4331 Builder.defineMacro("__ARM_FEATURE_DIV");
4332
4333 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4334
4335 // 0xe implies support for half, single and double precision operations.
4336 Builder.defineMacro("__ARM_FP", "0xe");
4337
4338 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4339 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4340 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4341
4342 if (Opts.FastMath || Opts.FiniteMathOnly)
4343 Builder.defineMacro("__ARM_FP_FAST");
4344
4345 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4346 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4347
4348 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4349
4350 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4351 Opts.ShortEnums ? "1" : "4");
4352
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004353 if (FPU == NeonMode) {
4354 Builder.defineMacro("__ARM_NEON");
4355 // 64-bit NEON supports half, single and double precision operations.
4356 Builder.defineMacro("__ARM_NEON_FP", "0xe");
4357 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004358
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004359 if (CRC)
4360 Builder.defineMacro("__ARM_FEATURE_CRC32");
Stephen Hines651f13c2014-04-23 16:59:28 -07004361
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004362 if (Crypto)
4363 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Stephen Hines651f13c2014-04-23 16:59:28 -07004364 }
4365
4366 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4367 unsigned &NumRecords) const {
4368 Records = BuiltinInfo;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004369 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Stephen Hines651f13c2014-04-23 16:59:28 -07004370 }
4371
4372 virtual bool hasFeature(StringRef Feature) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004373 return Feature == "aarch64" ||
4374 Feature == "arm64" ||
4375 (Feature == "neon" && FPU == NeonMode);
4376 }
4377
4378 bool handleTargetFeatures(std::vector<std::string> &Features,
4379 DiagnosticsEngine &Diags) override {
4380 FPU = FPUMode;
4381 CRC = 0;
4382 Crypto = 0;
4383 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4384 if (Features[i] == "+neon")
4385 FPU = NeonMode;
4386 if (Features[i] == "+crc")
4387 CRC = 1;
4388 if (Features[i] == "+crypto")
4389 Crypto = 1;
4390 }
4391
4392 setDescriptionString();
4393
4394 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004395 }
4396
4397 virtual bool isCLZForZeroUndef() const { return false; }
4398
4399 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4400 return TargetInfo::AArch64ABIBuiltinVaList;
4401 }
4402
4403 virtual void getGCCRegNames(const char *const *&Names,
4404 unsigned &NumNames) const;
4405 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4406 unsigned &NumAliases) const;
4407
4408 virtual bool validateAsmConstraint(const char *&Name,
4409 TargetInfo::ConstraintInfo &Info) const {
4410 switch (*Name) {
4411 default:
4412 return false;
4413 case 'w': // Floating point and SIMD registers (V0-V31)
4414 Info.setAllowsRegister();
4415 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004416 case 'I': // Constant that can be used with an ADD instruction
4417 case 'J': // Constant that can be used with a SUB instruction
4418 case 'K': // Constant that can be used with a 32-bit logical instruction
4419 case 'L': // Constant that can be used with a 64-bit logical instruction
4420 case 'M': // Constant that can be used as a 32-bit MOV immediate
4421 case 'N': // Constant that can be used as a 64-bit MOV immediate
4422 case 'Y': // Floating point constant zero
4423 case 'Z': // Integer constant zero
4424 return true;
4425 case 'Q': // A memory reference with base register and no offset
4426 Info.setAllowsMemory();
4427 return true;
4428 case 'S': // A symbolic address
4429 Info.setAllowsRegister();
4430 return true;
4431 case 'U':
4432 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4433 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4434 // Usa: An absolute symbolic address
4435 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4436 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Stephen Hines651f13c2014-04-23 16:59:28 -07004437 case 'z': // Zero register, wzr or xzr
4438 Info.setAllowsRegister();
4439 return true;
4440 case 'x': // Floating point and SIMD registers (V0-V15)
4441 Info.setAllowsRegister();
4442 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004443 }
4444 return false;
4445 }
4446
Stephen Hines651f13c2014-04-23 16:59:28 -07004447 virtual const char *getClobbers() const { return ""; }
4448
4449 int getEHDataRegisterNumber(unsigned RegNo) const {
4450 if (RegNo == 0)
4451 return 0;
4452 if (RegNo == 1)
4453 return 1;
4454 return -1;
4455 }
4456};
4457
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004458const char *const AArch64TargetInfo::GCCRegNames[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004459 // 32-bit Integer registers
4460 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4461 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4462 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4463
4464 // 64-bit Integer registers
4465 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4466 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4467 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4468
4469 // 32-bit floating point regsisters
4470 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4471 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4472 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4473
4474 // 64-bit floating point regsisters
4475 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4476 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4477 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4478
4479 // Vector registers
4480 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4481 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4482 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4483};
4484
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004485void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Stephen Hines651f13c2014-04-23 16:59:28 -07004486 unsigned &NumNames) const {
4487 Names = GCCRegNames;
4488 NumNames = llvm::array_lengthof(GCCRegNames);
4489}
4490
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004491const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004492 { { "w31" }, "wsp" },
4493 { { "x29" }, "fp" },
4494 { { "x30" }, "lr" },
4495 { { "x31" }, "sp" },
4496 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4497 // don't want to substitute one of these for a different-sized one.
4498};
4499
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004500void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Stephen Hines651f13c2014-04-23 16:59:28 -07004501 unsigned &NumAliases) const {
4502 Aliases = GCCRegAliases;
4503 NumAliases = llvm::array_lengthof(GCCRegAliases);
4504}
4505
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004506const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004507#define BUILTIN(ID, TYPE, ATTRS) \
4508 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4509#include "clang/Basic/BuiltinsNEON.def"
4510
4511#define BUILTIN(ID, TYPE, ATTRS) \
4512 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004513#include "clang/Basic/BuiltinsAArch64.def"
4514};
4515
4516class AArch64leTargetInfo : public AArch64TargetInfo {
4517 void setDescriptionString() override {
4518 if (getTriple().isOSBinFormatMachO())
4519 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4520 else
4521 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4522 }
4523
4524public:
4525 AArch64leTargetInfo(const llvm::Triple &Triple)
4526 : AArch64TargetInfo(Triple) {
4527 BigEndian = false;
4528 }
4529 void getTargetDefines(const LangOptions &Opts,
4530 MacroBuilder &Builder) const override {
4531 Builder.defineMacro("__AARCH64EL__");
4532 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4533 }
4534};
4535
4536class AArch64beTargetInfo : public AArch64TargetInfo {
4537 void setDescriptionString() override {
4538 assert(!getTriple().isOSBinFormatMachO());
4539 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4540 }
4541
4542public:
4543 AArch64beTargetInfo(const llvm::Triple &Triple)
4544 : AArch64TargetInfo(Triple) { }
4545 void getTargetDefines(const LangOptions &Opts,
4546 MacroBuilder &Builder) const override {
4547 Builder.defineMacro("__AARCH64EB__");
4548 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4549 Builder.defineMacro("__ARM_BIG_ENDIAN");
4550 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4551 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004552};
4553} // end anonymous namespace.
4554
4555namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004556class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
4557protected:
4558 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4559 MacroBuilder &Builder) const override {
4560 Builder.defineMacro("__AARCH64_SIMD__");
4561 Builder.defineMacro("__ARM64_ARCH_8__");
4562 Builder.defineMacro("__ARM_NEON__");
4563 Builder.defineMacro("__LITTLE_ENDIAN__");
4564 Builder.defineMacro("__REGISTER_PREFIX__", "");
4565 Builder.defineMacro("__arm64", "1");
4566 Builder.defineMacro("__arm64__", "1");
4567
4568 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4569 }
4570
Stephen Hines651f13c2014-04-23 16:59:28 -07004571public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004572 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4573 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004574 Int64Type = SignedLongLong;
4575 WCharType = SignedInt;
4576 UseSignedCharForObjCBool = false;
4577
4578 LongDoubleWidth = LongDoubleAlign = 64;
4579 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4580
4581 TheCXXABI.set(TargetCXXABI::iOS64);
4582 }
4583
4584 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4585 return TargetInfo::CharPtrBuiltinVaList;
4586 }
4587};
4588} // end anonymous namespace
4589
4590namespace {
Tony Linthicum96319392011-12-12 21:14:55 +00004591// Hexagon abstract base class
4592class HexagonTargetInfo : public TargetInfo {
4593 static const Builtin::Info BuiltinInfo[];
4594 static const char * const GCCRegNames[];
4595 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4596 std::string CPU;
4597public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004598 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004599 BigEndian = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07004600 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum96319392011-12-12 21:14:55 +00004601
4602 // {} in inline assembly are packet specifiers, not assembly variant
4603 // specifiers.
4604 NoAsmVariants = true;
4605 }
4606
Stephen Hines651f13c2014-04-23 16:59:28 -07004607 void getTargetBuiltins(const Builtin::Info *&Records,
4608 unsigned &NumRecords) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004609 Records = BuiltinInfo;
4610 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4611 }
4612
Stephen Hines651f13c2014-04-23 16:59:28 -07004613 bool validateAsmConstraint(const char *&Name,
4614 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004615 return true;
4616 }
4617
Stephen Hines651f13c2014-04-23 16:59:28 -07004618 void getTargetDefines(const LangOptions &Opts,
4619 MacroBuilder &Builder) const override;
Tony Linthicum96319392011-12-12 21:14:55 +00004620
Stephen Hines651f13c2014-04-23 16:59:28 -07004621 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00004622 return Feature == "hexagon";
4623 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004624
4625 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00004626 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00004627 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004628 void getGCCRegNames(const char * const *&Names,
4629 unsigned &NumNames) const override;
4630 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4631 unsigned &NumAliases) const override;
4632 const char *getClobbers() const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004633 return "";
4634 }
Sebastian Pop43115d42012-01-13 20:37:10 +00004635
4636 static const char *getHexagonCPUSuffix(StringRef Name) {
4637 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00004638 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00004639 .Case("hexagonv5", "5")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004640 .Default(nullptr);
Sebastian Pop43115d42012-01-13 20:37:10 +00004641 }
4642
Stephen Hines651f13c2014-04-23 16:59:28 -07004643 bool setCPU(const std::string &Name) override {
Sebastian Pop43115d42012-01-13 20:37:10 +00004644 if (!getHexagonCPUSuffix(Name))
4645 return false;
4646
Tony Linthicum96319392011-12-12 21:14:55 +00004647 CPU = Name;
4648 return true;
4649 }
4650};
4651
4652void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4653 MacroBuilder &Builder) const {
4654 Builder.defineMacro("qdsp6");
4655 Builder.defineMacro("__qdsp6", "1");
4656 Builder.defineMacro("__qdsp6__", "1");
4657
4658 Builder.defineMacro("hexagon");
4659 Builder.defineMacro("__hexagon", "1");
4660 Builder.defineMacro("__hexagon__", "1");
4661
4662 if(CPU == "hexagonv1") {
4663 Builder.defineMacro("__HEXAGON_V1__");
4664 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4665 if(Opts.HexagonQdsp6Compat) {
4666 Builder.defineMacro("__QDSP6_V1__");
4667 Builder.defineMacro("__QDSP6_ARCH__", "1");
4668 }
4669 }
4670 else if(CPU == "hexagonv2") {
4671 Builder.defineMacro("__HEXAGON_V2__");
4672 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4673 if(Opts.HexagonQdsp6Compat) {
4674 Builder.defineMacro("__QDSP6_V2__");
4675 Builder.defineMacro("__QDSP6_ARCH__", "2");
4676 }
4677 }
4678 else if(CPU == "hexagonv3") {
4679 Builder.defineMacro("__HEXAGON_V3__");
4680 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4681 if(Opts.HexagonQdsp6Compat) {
4682 Builder.defineMacro("__QDSP6_V3__");
4683 Builder.defineMacro("__QDSP6_ARCH__", "3");
4684 }
4685 }
4686 else if(CPU == "hexagonv4") {
4687 Builder.defineMacro("__HEXAGON_V4__");
4688 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4689 if(Opts.HexagonQdsp6Compat) {
4690 Builder.defineMacro("__QDSP6_V4__");
4691 Builder.defineMacro("__QDSP6_ARCH__", "4");
4692 }
4693 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004694 else if(CPU == "hexagonv5") {
4695 Builder.defineMacro("__HEXAGON_V5__");
4696 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4697 if(Opts.HexagonQdsp6Compat) {
4698 Builder.defineMacro("__QDSP6_V5__");
4699 Builder.defineMacro("__QDSP6_ARCH__", "5");
4700 }
4701 }
Tony Linthicum96319392011-12-12 21:14:55 +00004702}
4703
4704const char * const HexagonTargetInfo::GCCRegNames[] = {
4705 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4706 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4707 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4708 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4709 "p0", "p1", "p2", "p3",
4710 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4711};
4712
4713void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4714 unsigned &NumNames) const {
4715 Names = GCCRegNames;
4716 NumNames = llvm::array_lengthof(GCCRegNames);
4717}
4718
4719
4720const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4721 { { "sp" }, "r29" },
4722 { { "fp" }, "r30" },
4723 { { "lr" }, "r31" },
4724 };
4725
4726void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4727 unsigned &NumAliases) const {
4728 Aliases = GCCRegAliases;
4729 NumAliases = llvm::array_lengthof(GCCRegAliases);
4730}
4731
4732
4733const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4734#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4735#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4736 ALL_LANGUAGES },
4737#include "clang/Basic/BuiltinsHexagon.def"
4738};
4739}
4740
4741
Chris Lattner4b009652007-07-25 00:24:17 +00004742namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004743// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4744class SparcTargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004745 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4746 static const char * const GCCRegNames[];
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004747 bool SoftFloat;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004748public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004749 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004750
Stephen Hines651f13c2014-04-23 16:59:28 -07004751 bool handleTargetFeatures(std::vector<std::string> &Features,
4752 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004753 SoftFloat = false;
4754 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4755 if (Features[i] == "+soft-float")
4756 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00004757 return true;
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004758 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004759 void getTargetDefines(const LangOptions &Opts,
4760 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004761 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004762 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00004763
4764 if (SoftFloat)
4765 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004766 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004767
4768 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00004769 return llvm::StringSwitch<bool>(Feature)
4770 .Case("softfloat", SoftFloat)
4771 .Case("sparc", true)
4772 .Default(false);
4773 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004774
4775 void getTargetBuiltins(const Builtin::Info *&Records,
4776 unsigned &NumRecords) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00004777 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004778 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004779 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00004780 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004781 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004782 void getGCCRegNames(const char * const *&Names,
4783 unsigned &NumNames) const override;
4784 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4785 unsigned &NumAliases) const override;
4786 bool validateAsmConstraint(const char *&Name,
4787 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00004788 // FIXME: Implement!
4789 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004790 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004791 const char *getClobbers() const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00004792 // FIXME: Implement!
4793 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004794 }
4795};
4796
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004797const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004798 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4799 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4800 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4801 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4802};
4803
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004804void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4805 unsigned &NumNames) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004806 Names = GCCRegNames;
4807 NumNames = llvm::array_lengthof(GCCRegNames);
4808}
4809
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004810const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikove7772382009-05-03 13:42:53 +00004811 { { "g0" }, "r0" },
4812 { { "g1" }, "r1" },
4813 { { "g2" }, "r2" },
4814 { { "g3" }, "r3" },
4815 { { "g4" }, "r4" },
4816 { { "g5" }, "r5" },
4817 { { "g6" }, "r6" },
4818 { { "g7" }, "r7" },
4819 { { "o0" }, "r8" },
4820 { { "o1" }, "r9" },
4821 { { "o2" }, "r10" },
4822 { { "o3" }, "r11" },
4823 { { "o4" }, "r12" },
4824 { { "o5" }, "r13" },
4825 { { "o6", "sp" }, "r14" },
4826 { { "o7" }, "r15" },
4827 { { "l0" }, "r16" },
4828 { { "l1" }, "r17" },
4829 { { "l2" }, "r18" },
4830 { { "l3" }, "r19" },
4831 { { "l4" }, "r20" },
4832 { { "l5" }, "r21" },
4833 { { "l6" }, "r22" },
4834 { { "l7" }, "r23" },
4835 { { "i0" }, "r24" },
4836 { { "i1" }, "r25" },
4837 { { "i2" }, "r26" },
4838 { { "i3" }, "r27" },
4839 { { "i4" }, "r28" },
4840 { { "i5" }, "r29" },
4841 { { "i6", "fp" }, "r30" },
4842 { { "i7" }, "r31" },
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004843};
4844
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004845void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4846 unsigned &NumAliases) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00004847 Aliases = GCCRegAliases;
4848 NumAliases = llvm::array_lengthof(GCCRegAliases);
4849}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004850
4851// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4852class SparcV8TargetInfo : public SparcTargetInfo {
4853public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004854 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004855 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004856 }
4857
Stephen Hines651f13c2014-04-23 16:59:28 -07004858 void getTargetDefines(const LangOptions &Opts,
4859 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004860 SparcTargetInfo::getTargetDefines(Opts, Builder);
4861 Builder.defineMacro("__sparcv8");
4862 }
4863};
4864
4865// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4866class SparcV9TargetInfo : public SparcTargetInfo {
4867public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004868 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004869 // FIXME: Support Sparc quad-precision long double?
Stephen Hines651f13c2014-04-23 16:59:28 -07004870 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00004871 // This is an LP64 platform.
4872 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00004873
4874 // OpenBSD uses long long for int64_t and intmax_t.
4875 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4876 IntMaxType = SignedLongLong;
4877 UIntMaxType = UnsignedLongLong;
4878 } else {
4879 IntMaxType = SignedLong;
4880 UIntMaxType = UnsignedLong;
4881 }
4882 Int64Type = IntMaxType;
Stephen Hines651f13c2014-04-23 16:59:28 -07004883
4884 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4885 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4886 LongDoubleWidth = 128;
4887 LongDoubleAlign = 128;
4888 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4889 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004890 }
4891
Stephen Hines651f13c2014-04-23 16:59:28 -07004892 void getTargetDefines(const LangOptions &Opts,
4893 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004894 SparcTargetInfo::getTargetDefines(Opts, Builder);
4895 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00004896 Builder.defineMacro("__arch64__");
4897 // Solaris and its derivative AuroraUX don't need these variants, but the
4898 // BSDs do.
4899 if (getTriple().getOS() != llvm::Triple::Solaris &&
4900 getTriple().getOS() != llvm::Triple::AuroraUX) {
4901 Builder.defineMacro("__sparc64__");
4902 Builder.defineMacro("__sparc_v9__");
4903 Builder.defineMacro("__sparcv9__");
4904 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004905 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004906
4907 bool setCPU(const std::string &Name) override {
4908 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4909 .Case("v9", true)
4910 .Case("ultrasparc", true)
4911 .Case("ultrasparc3", true)
4912 .Case("niagara", true)
4913 .Case("niagara2", true)
4914 .Case("niagara3", true)
4915 .Case("niagara4", true)
4916 .Default(false);
4917
4918 // No need to store the CPU yet. There aren't any CPU-specific
4919 // macros to define.
4920 return CPUKnown;
4921 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004922};
4923
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00004924} // end anonymous namespace.
4925
Eli Friedmanff158dd2008-08-20 07:28:14 +00004926namespace {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00004927class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4928public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004929 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4930 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00004931 SizeType = UnsignedInt;
4932 PtrDiffType = SignedInt;
4933 }
4934};
Edwin Török36565e52009-06-30 17:10:35 +00004935class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanff158dd2008-08-20 07:28:14 +00004936public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004937 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4938 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedman7cca0982008-11-02 02:43:55 +00004939 SizeType = UnsignedInt;
4940 PtrDiffType = SignedInt;
Eli Friedmanff158dd2008-08-20 07:28:14 +00004941 }
4942};
4943} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00004944
Chris Lattner85970f32008-05-08 05:58:21 +00004945namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004946class SystemZTargetInfo : public TargetInfo {
4947 static const char *const GCCRegNames[];
Ulrich Weigandb8409212013-05-06 16:26:41 +00004948
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004949public:
4950 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
4951 TLSSupported = true;
4952 IntWidth = IntAlign = 32;
4953 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4954 PointerWidth = PointerAlign = 64;
4955 LongDoubleWidth = 128;
4956 LongDoubleAlign = 64;
4957 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4958 MinGlobalAlign = 16;
4959 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
4960 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4961 }
4962 void getTargetDefines(const LangOptions &Opts,
4963 MacroBuilder &Builder) const override {
4964 Builder.defineMacro("__s390__");
4965 Builder.defineMacro("__s390x__");
4966 Builder.defineMacro("__zarch__");
4967 Builder.defineMacro("__LONG_DOUBLE_128__");
4968 }
4969 void getTargetBuiltins(const Builtin::Info *&Records,
4970 unsigned &NumRecords) const override {
4971 // FIXME: Implement.
4972 Records = nullptr;
4973 NumRecords = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00004974 }
4975
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004976 void getGCCRegNames(const char *const *&Names,
4977 unsigned &NumNames) const override;
4978 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4979 unsigned &NumAliases) const override {
4980 // No aliases.
4981 Aliases = nullptr;
4982 NumAliases = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00004983 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004984 bool validateAsmConstraint(const char *&Name,
4985 TargetInfo::ConstraintInfo &info) const override;
4986 const char *getClobbers() const override {
4987 // FIXME: Is this really right?
4988 return "";
4989 }
4990 BuiltinVaListKind getBuiltinVaListKind() const override {
4991 return TargetInfo::SystemZBuiltinVaList;
4992 }
4993 bool setCPU(const std::string &Name) override {
4994 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4995 .Case("z10", true)
4996 .Case("z196", true)
4997 .Case("zEC12", true)
4998 .Default(false);
4999
5000 // No need to store the CPU yet. There aren't any CPU-specific
5001 // macros to define.
5002 return CPUKnown;
5003 }
5004};
5005
5006const char *const SystemZTargetInfo::GCCRegNames[] = {
5007 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5008 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5009 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5010 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5011};
5012
5013void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5014 unsigned &NumNames) const {
5015 Names = GCCRegNames;
5016 NumNames = llvm::array_lengthof(GCCRegNames);
5017}
5018
5019bool SystemZTargetInfo::
5020validateAsmConstraint(const char *&Name,
5021 TargetInfo::ConstraintInfo &Info) const {
5022 switch (*Name) {
5023 default:
5024 return false;
5025
5026 case 'a': // Address register
5027 case 'd': // Data register (equivalent to 'r')
5028 case 'f': // Floating-point register
5029 Info.setAllowsRegister();
5030 return true;
5031
5032 case 'I': // Unsigned 8-bit constant
5033 case 'J': // Unsigned 12-bit constant
5034 case 'K': // Signed 16-bit constant
5035 case 'L': // Signed 20-bit displacement (on all targets we support)
5036 case 'M': // 0x7fffffff
5037 return true;
5038
5039 case 'Q': // Memory with base and unsigned 12-bit displacement
5040 case 'R': // Likewise, plus an index
5041 case 'S': // Memory with base and signed 20-bit displacement
5042 case 'T': // Likewise, plus an index
5043 Info.setAllowsMemory();
5044 return true;
5045 }
5046}
Ulrich Weigandb8409212013-05-06 16:26:41 +00005047}
5048
5049namespace {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005050 class MSP430TargetInfo : public TargetInfo {
5051 static const char * const GCCRegNames[];
5052 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005053 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005054 BigEndian = false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005055 TLSSupported = false;
Anton Korobeynikov2a6630a2010-01-30 12:55:11 +00005056 IntWidth = 16; IntAlign = 16;
5057 LongWidth = 32; LongLongWidth = 64;
5058 LongAlign = LongLongAlign = 16;
5059 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005060 SuitableAlign = 16;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005061 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005062 IntMaxType = SignedLongLong;
5063 UIntMaxType = UnsignedLongLong;
5064 IntPtrType = SignedInt;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005065 PtrDiffType = SignedInt;
Edward O'Callaghan14a70a32009-11-21 00:49:54 +00005066 SigAtomicType = SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07005067 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
5068 }
5069 void getTargetDefines(const LangOptions &Opts,
5070 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005071 Builder.defineMacro("MSP430");
5072 Builder.defineMacro("__MSP430__");
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005073 // FIXME: defines for different 'flavours' of MCU
5074 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005075 void getTargetBuiltins(const Builtin::Info *&Records,
5076 unsigned &NumRecords) const override {
5077 // FIXME: Implement.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005078 Records = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005079 NumRecords = 0;
5080 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005081 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005082 return Feature == "msp430";
5083 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005084 void getGCCRegNames(const char * const *&Names,
5085 unsigned &NumNames) const override;
5086 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5087 unsigned &NumAliases) const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005088 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005089 Aliases = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005090 NumAliases = 0;
5091 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005092 bool validateAsmConstraint(const char *&Name,
5093 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov174219b2009-10-15 23:17:13 +00005094 // No target constraints for now.
5095 return false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005096 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005097 const char *getClobbers() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005098 // FIXME: Is this really right?
5099 return "";
5100 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005101 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005102 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00005103 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005104 }
5105 };
5106
5107 const char * const MSP430TargetInfo::GCCRegNames[] = {
5108 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5109 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5110 };
5111
5112 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5113 unsigned &NumNames) const {
5114 Names = GCCRegNames;
5115 NumNames = llvm::array_lengthof(GCCRegNames);
5116 }
5117}
5118
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00005119namespace {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005120
Mike Stump25cf7602009-09-09 15:08:12 +00005121 // LLVM and Clang cannot be used directly to output native binaries for
5122 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005123 // type and alignment information.
Mike Stump25cf7602009-09-09 15:08:12 +00005124 //
5125 // TCE uses the llvm bitcode as input and uses it for generating customized
5126 // target processor and program binary. TCE co-design environment is
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005127 // publicly available in http://tce.cs.tut.fi
5128
Eli Friedman209f5bb2011-10-07 19:51:42 +00005129 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5130 3, // opencl_global
5131 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00005132 5, // opencl_constant
5133 0, // cuda_device
5134 0, // cuda_constant
5135 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00005136 };
5137
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005138 class TCETargetInfo : public TargetInfo{
5139 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005140 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005141 TLSSupported = false;
5142 IntWidth = 32;
5143 LongWidth = LongLongWidth = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005144 PointerWidth = 32;
5145 IntAlign = 32;
5146 LongAlign = LongLongAlign = 32;
5147 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005148 SuitableAlign = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005149 SizeType = UnsignedInt;
5150 IntMaxType = SignedLong;
5151 UIntMaxType = UnsignedLong;
5152 IntPtrType = SignedInt;
5153 PtrDiffType = SignedInt;
5154 FloatWidth = 32;
5155 FloatAlign = 32;
5156 DoubleWidth = 32;
5157 DoubleAlign = 32;
5158 LongDoubleWidth = 32;
5159 LongDoubleAlign = 32;
5160 FloatFormat = &llvm::APFloat::IEEEsingle;
5161 DoubleFormat = &llvm::APFloat::IEEEsingle;
5162 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Stephen Hines651f13c2014-04-23 16:59:28 -07005163 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5164 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00005165 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005166 UseAddrSpaceMapMangling = true;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005167 }
5168
Stephen Hines651f13c2014-04-23 16:59:28 -07005169 void getTargetDefines(const LangOptions &Opts,
5170 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005171 DefineStd(Builder, "tce", Opts);
5172 Builder.defineMacro("__TCE__");
5173 Builder.defineMacro("__TCE_V1__");
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005174 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005175 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005176 return Feature == "tce";
5177 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005178
5179 void getTargetBuiltins(const Builtin::Info *&Records,
5180 unsigned &NumRecords) const override {}
5181 const char *getClobbers() const override {
Daniel Dunbar2e967de2009-08-24 09:54:37 +00005182 return "";
5183 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005184 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005185 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005186 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005187 void getGCCRegNames(const char * const *&Names,
5188 unsigned &NumNames) const override {}
5189 bool validateAsmConstraint(const char *&Name,
5190 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005191 return true;
5192 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005193 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5194 unsigned &NumAliases) const override {}
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005195 };
5196}
5197
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005198namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005199class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005200 virtual void setDescriptionString() = 0;
5201
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005202 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005203 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005204 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005205 bool IsMicromips;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005206 bool IsNan2008;
Simon Atanasyand96e3152013-04-14 14:07:30 +00005207 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005208 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00005209 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005210 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005211 enum DspRevEnum {
5212 NoDSP, DSP1, DSP2
5213 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00005214 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005215
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005216protected:
Akira Hatanaka550ed202013-10-29 19:00:35 +00005217 bool HasFP64;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005218 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005219
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005220public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005221 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5222 const std::string &CPUStr)
5223 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005224 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005225 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005226
Stephen Hines651f13c2014-04-23 16:59:28 -07005227 const char *getABI() const override { return ABI.c_str(); }
5228 bool setABI(const std::string &Name) override = 0;
5229 bool setCPU(const std::string &Name) override {
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005230 CPU = Name;
5231 return true;
5232 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005233 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5234 // The backend enables certain ABI's by default according to the
5235 // architecture.
5236 // Disable both possible defaults so that we don't end up with multiple
5237 // ABI's selected and trigger an assertion.
5238 Features["o32"] = false;
5239 Features["n64"] = false;
5240
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005241 Features[ABI] = true;
5242 Features[CPU] = true;
5243 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005244
Stephen Hines651f13c2014-04-23 16:59:28 -07005245 void getTargetDefines(const LangOptions &Opts,
5246 MacroBuilder &Builder) const override {
5247 Builder.defineMacro("__mips__");
Simon Atanasyand4935a02012-08-29 19:14:58 +00005248 Builder.defineMacro("_mips");
Stephen Hines651f13c2014-04-23 16:59:28 -07005249 if (Opts.GNUMode)
5250 Builder.defineMacro("mips");
5251
Simon Atanasyand4935a02012-08-29 19:14:58 +00005252 Builder.defineMacro("__REGISTER_PREFIX__", "");
5253
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005254 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005255 case HardFloat:
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005256 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005257 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005258 case SoftFloat:
5259 Builder.defineMacro("__mips_soft_float", Twine(1));
5260 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00005261 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005262
Simon Atanasyand96e3152013-04-14 14:07:30 +00005263 if (IsSingleFloat)
5264 Builder.defineMacro("__mips_single_float", Twine(1));
5265
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005266 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5267 Builder.defineMacro("_MIPS_FPSET",
5268 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5269
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005270 if (IsMips16)
5271 Builder.defineMacro("__mips16", Twine(1));
5272
Simon Atanasyan321ae792013-04-14 14:07:51 +00005273 if (IsMicromips)
5274 Builder.defineMacro("__mips_micromips", Twine(1));
5275
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005276 if (IsNan2008)
5277 Builder.defineMacro("__mips_nan2008", Twine(1));
5278
Simon Atanasyana1b62272012-07-05 20:16:22 +00005279 switch (DspRev) {
5280 default:
5281 break;
5282 case DSP1:
5283 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5284 Builder.defineMacro("__mips_dsp", Twine(1));
5285 break;
5286 case DSP2:
5287 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5288 Builder.defineMacro("__mips_dspr2", Twine(1));
5289 Builder.defineMacro("__mips_dsp", Twine(1));
5290 break;
5291 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005292
Jack Carterc613b672013-08-12 17:20:29 +00005293 if (HasMSA)
5294 Builder.defineMacro("__mips_msa", Twine(1));
5295
Simon Atanasyan90913892012-04-05 19:28:31 +00005296 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5297 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5298 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00005299
5300 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5301 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005302 }
5303
Stephen Hines651f13c2014-04-23 16:59:28 -07005304 void getTargetBuiltins(const Builtin::Info *&Records,
5305 unsigned &NumRecords) const override {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005306 Records = BuiltinInfo;
5307 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005308 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005309 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka550ed202013-10-29 19:00:35 +00005310 return llvm::StringSwitch<bool>(Feature)
5311 .Case("mips", true)
5312 .Case("fp64", HasFP64)
5313 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00005314 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005315 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005316 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005317 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005318 void getGCCRegNames(const char * const *&Names,
5319 unsigned &NumNames) const override {
Daniel Sanders838f9332013-11-12 12:56:01 +00005320 static const char *const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00005321 // CPU register names
5322 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005323 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5324 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5325 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005326 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5327 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005328 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5329 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5330 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5331 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005332 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005333 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders838f9332013-11-12 12:56:01 +00005334 "$fcc5","$fcc6","$fcc7",
5335 // MSA register names
5336 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5337 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5338 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5339 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5340 // MSA control register names
5341 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5342 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005343 };
5344 Names = GCCRegNames;
5345 NumNames = llvm::array_lengthof(GCCRegNames);
5346 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005347 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5348 unsigned &NumAliases) const override = 0;
5349 bool validateAsmConstraint(const char *&Name,
5350 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005351 switch (*Name) {
5352 default:
Douglas Gregora95cba92011-11-02 20:52:01 +00005353 return false;
5354
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005355 case 'r': // CPU registers.
5356 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5357 case 'y': // Equivalent to "r", backwards compatibility only.
5358 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00005359 case 'c': // $25 for indirect jumps
5360 case 'l': // lo register
5361 case 'x': // hilo register pair
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005362 Info.setAllowsRegister();
5363 return true;
Jack Carter97102302013-03-05 19:10:54 +00005364 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00005365 Info.setAllowsMemory();
5366 return true;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005367 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005368 }
5369
Stephen Hines651f13c2014-04-23 16:59:28 -07005370 const char *getClobbers() const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005371 // FIXME: Implement!
5372 return "";
5373 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005374
Stephen Hines651f13c2014-04-23 16:59:28 -07005375 bool handleTargetFeatures(std::vector<std::string> &Features,
5376 DiagnosticsEngine &Diags) override {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005377 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005378 IsMicromips = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005379 IsNan2008 = false;
Simon Atanasyand96e3152013-04-14 14:07:30 +00005380 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005381 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005382 DspRev = NoDSP;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005383 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005384
5385 for (std::vector<std::string>::iterator it = Features.begin(),
5386 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005387 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00005388 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005389 else if (*it == "+soft-float")
5390 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005391 else if (*it == "+mips16")
5392 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005393 else if (*it == "+micromips")
5394 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005395 else if (*it == "+dsp")
5396 DspRev = std::max(DspRev, DSP1);
5397 else if (*it == "+dspr2")
5398 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00005399 else if (*it == "+msa")
5400 HasMSA = true;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005401 else if (*it == "+fp64")
5402 HasFP64 = true;
5403 else if (*it == "-fp64")
5404 HasFP64 = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005405 else if (*it == "+nan2008")
5406 IsNan2008 = true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005407 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005408
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005409 // Remove front-end specific options.
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005410 std::vector<std::string>::iterator it =
5411 std::find(Features.begin(), Features.end(), "+soft-float");
5412 if (it != Features.end())
5413 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00005414
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005415 setDescriptionString();
5416
Rafael Espindola5389b842013-08-21 21:59:03 +00005417 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005418 }
Logan Chiena8f7a972013-02-23 04:24:36 +00005419
Stephen Hines651f13c2014-04-23 16:59:28 -07005420 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00005421 if (RegNo == 0) return 4;
5422 if (RegNo == 1) return 5;
5423 return -1;
5424 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005425};
5426
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005427const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5428#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5429#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5430 ALL_LANGUAGES },
5431#include "clang/Basic/BuiltinsMips.def"
5432};
5433
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005434class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005435public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005436 Mips32TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07005437 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005438 SizeType = UnsignedInt;
5439 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005440 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005441 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005442 bool setABI(const std::string &Name) override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005443 if ((Name == "o32") || (Name == "eabi")) {
5444 ABI = Name;
5445 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00005446 } else if (Name == "32") {
5447 ABI = "o32";
5448 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005449 } else
5450 return false;
5451 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005452 void getTargetDefines(const LangOptions &Opts,
5453 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005454 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Douglas Gregorb7bcfe82011-11-09 15:17:16 +00005455
Stephen Hines651f13c2014-04-23 16:59:28 -07005456 Builder.defineMacro("__mips", "32");
5457
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005458 if (ABI == "o32") {
5459 Builder.defineMacro("__mips_o32");
5460 Builder.defineMacro("_ABIO32", "1");
5461 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5462 }
5463 else if (ABI == "eabi")
5464 Builder.defineMacro("__mips_eabi");
5465 else
David Blaikieb219cfc2011-09-23 05:06:16 +00005466 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005467 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005468 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5469 unsigned &NumAliases) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005470 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5471 { { "at" }, "$1" },
5472 { { "v0" }, "$2" },
5473 { { "v1" }, "$3" },
5474 { { "a0" }, "$4" },
5475 { { "a1" }, "$5" },
5476 { { "a2" }, "$6" },
5477 { { "a3" }, "$7" },
5478 { { "t0" }, "$8" },
5479 { { "t1" }, "$9" },
5480 { { "t2" }, "$10" },
5481 { { "t3" }, "$11" },
5482 { { "t4" }, "$12" },
5483 { { "t5" }, "$13" },
5484 { { "t6" }, "$14" },
5485 { { "t7" }, "$15" },
5486 { { "s0" }, "$16" },
5487 { { "s1" }, "$17" },
5488 { { "s2" }, "$18" },
5489 { { "s3" }, "$19" },
5490 { { "s4" }, "$20" },
5491 { { "s5" }, "$21" },
5492 { { "s6" }, "$22" },
5493 { { "s7" }, "$23" },
5494 { { "t8" }, "$24" },
5495 { { "t9" }, "$25" },
5496 { { "k0" }, "$26" },
5497 { { "k1" }, "$27" },
5498 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005499 { { "sp","$sp" }, "$29" },
5500 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005501 { { "ra" }, "$31" }
5502 };
5503 Aliases = GCCRegAliases;
5504 NumAliases = llvm::array_lengthof(GCCRegAliases);
5505 }
5506};
5507
5508class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005509 void setDescriptionString() override {
5510 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005511 }
5512
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005513public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005514 Mips32EBTargetInfo(const llvm::Triple &Triple)
5515 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005516 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005517 void getTargetDefines(const LangOptions &Opts,
5518 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005519 DefineStd(Builder, "MIPSEB", Opts);
5520 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005521 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005522 }
5523};
5524
5525class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005526 void setDescriptionString() override {
5527 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005528 }
5529
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005530public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005531 Mips32ELTargetInfo(const llvm::Triple &Triple)
5532 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005533 BigEndian = false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005534 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005535 void getTargetDefines(const LangOptions &Opts,
5536 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005537 DefineStd(Builder, "MIPSEL", Opts);
5538 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005539 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005540 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005541};
5542
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005543class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005544public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005545 Mips64TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07005546 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanaka12507592011-10-22 00:07:27 +00005547 LongDoubleWidth = LongDoubleAlign = 128;
5548 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00005549 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5550 LongDoubleWidth = LongDoubleAlign = 64;
5551 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5552 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005553 setN64ABITypes();
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005554 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005555 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanaka12507592011-10-22 00:07:27 +00005556 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005557
5558 void setN64ABITypes() {
5559 LongWidth = LongAlign = 64;
5560 PointerWidth = PointerAlign = 64;
5561 SizeType = UnsignedLong;
5562 PtrDiffType = SignedLong;
5563 }
5564
5565 void setN32ABITypes() {
5566 LongWidth = LongAlign = 32;
5567 PointerWidth = PointerAlign = 32;
5568 SizeType = UnsignedInt;
5569 PtrDiffType = SignedInt;
5570 }
5571
Stephen Hines651f13c2014-04-23 16:59:28 -07005572 bool setABI(const std::string &Name) override {
Akira Hatanaka12507592011-10-22 00:07:27 +00005573 if (Name == "n32") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005574 setN32ABITypes();
Simon Atanasyane9616a42013-02-27 14:55:49 +00005575 ABI = Name;
5576 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005577 } else if (Name == "n64" || Name == "64") {
5578 setN64ABITypes();
Simon Atanasyane9616a42013-02-27 14:55:49 +00005579 ABI = "n64";
5580 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005581 }
5582 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005583 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005584
Stephen Hines651f13c2014-04-23 16:59:28 -07005585 void getTargetDefines(const LangOptions &Opts,
5586 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005587 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005588
Stephen Hines651f13c2014-04-23 16:59:28 -07005589 Builder.defineMacro("__mips", "64");
Simon Atanasyan600a5132012-08-29 20:50:11 +00005590 Builder.defineMacro("__mips64");
5591 Builder.defineMacro("__mips64__");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005592
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005593 if (ABI == "n32") {
5594 Builder.defineMacro("__mips_n32");
5595 Builder.defineMacro("_ABIN32", "2");
5596 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5597 }
5598 else if (ABI == "n64") {
5599 Builder.defineMacro("__mips_n64");
5600 Builder.defineMacro("_ABI64", "3");
5601 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5602 }
5603 else
5604 llvm_unreachable("Invalid ABI for Mips64.");
5605 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005606 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5607 unsigned &NumAliases) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005608 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5609 { { "at" }, "$1" },
5610 { { "v0" }, "$2" },
5611 { { "v1" }, "$3" },
5612 { { "a0" }, "$4" },
5613 { { "a1" }, "$5" },
5614 { { "a2" }, "$6" },
5615 { { "a3" }, "$7" },
5616 { { "a4" }, "$8" },
5617 { { "a5" }, "$9" },
5618 { { "a6" }, "$10" },
5619 { { "a7" }, "$11" },
5620 { { "t0" }, "$12" },
5621 { { "t1" }, "$13" },
5622 { { "t2" }, "$14" },
5623 { { "t3" }, "$15" },
5624 { { "s0" }, "$16" },
5625 { { "s1" }, "$17" },
5626 { { "s2" }, "$18" },
5627 { { "s3" }, "$19" },
5628 { { "s4" }, "$20" },
5629 { { "s5" }, "$21" },
5630 { { "s6" }, "$22" },
5631 { { "s7" }, "$23" },
5632 { { "t8" }, "$24" },
5633 { { "t9" }, "$25" },
5634 { { "k0" }, "$26" },
5635 { { "k1" }, "$27" },
5636 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005637 { { "sp","$sp" }, "$29" },
5638 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005639 { { "ra" }, "$31" }
5640 };
5641 Aliases = GCCRegAliases;
5642 NumAliases = llvm::array_lengthof(GCCRegAliases);
5643 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005644
5645 bool hasInt128Type() const override { return true; }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005646};
5647
5648class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005649 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005650 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07005651 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 +00005652 else
Stephen Hines651f13c2014-04-23 16:59:28 -07005653 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005654
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005655 }
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005656
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005657public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005658 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005659 : Mips64TargetInfoBase(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07005660 void getTargetDefines(const LangOptions &Opts,
5661 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005662 DefineStd(Builder, "MIPSEB", Opts);
5663 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005664 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005665 }
5666};
5667
5668class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005669 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005670 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07005671 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 +00005672 else
Stephen Hines651f13c2014-04-23 16:59:28 -07005673 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005674 }
5675public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005676 Mips64ELTargetInfo(const llvm::Triple &Triple)
5677 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005678 // Default ABI is n64.
5679 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005680 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005681 void getTargetDefines(const LangOptions &Opts,
5682 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005683 DefineStd(Builder, "MIPSEL", Opts);
5684 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005685 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005686 }
5687};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005688} // end anonymous namespace.
5689
Ivan Krasinef05abd2011-08-24 20:22:22 +00005690namespace {
5691class PNaClTargetInfo : public TargetInfo {
5692public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005693 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005694 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005695 this->UserLabelPrefix = "";
5696 this->LongAlign = 32;
5697 this->LongWidth = 32;
5698 this->PointerAlign = 32;
5699 this->PointerWidth = 32;
5700 this->IntMaxType = TargetInfo::SignedLongLong;
5701 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5702 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005703 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005704 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005705 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005706 this->SizeType = TargetInfo::UnsignedInt;
5707 this->PtrDiffType = TargetInfo::SignedInt;
5708 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00005709 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00005710 }
5711
Stephen Hines651f13c2014-04-23 16:59:28 -07005712 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005713 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005714 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005715 Builder.defineMacro("__le32__");
5716 Builder.defineMacro("__pnacl__");
5717 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005718 void getTargetDefines(const LangOptions &Opts,
5719 MacroBuilder &Builder) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005720 getArchDefines(Opts, Builder);
5721 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005722 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005723 return Feature == "pnacl";
5724 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005725 void getTargetBuiltins(const Builtin::Info *&Records,
5726 unsigned &NumRecords) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005727 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005728 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005729 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005730 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005731 void getGCCRegNames(const char * const *&Names,
5732 unsigned &NumNames) const override;
5733 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5734 unsigned &NumAliases) const override;
5735 bool validateAsmConstraint(const char *&Name,
5736 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005737 return false;
5738 }
5739
Stephen Hines651f13c2014-04-23 16:59:28 -07005740 const char *getClobbers() const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005741 return "";
5742 }
5743};
5744
5745void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5746 unsigned &NumNames) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005747 Names = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005748 NumNames = 0;
5749}
5750
5751void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5752 unsigned &NumAliases) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005753 Aliases = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005754 NumAliases = 0;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005755}
5756} // end anonymous namespace.
5757
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005758namespace {
5759 static const unsigned SPIRAddrSpaceMap[] = {
5760 1, // opencl_global
5761 3, // opencl_local
5762 2, // opencl_constant
5763 0, // cuda_device
5764 0, // cuda_constant
5765 0 // cuda_shared
5766 };
5767 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005768 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005769 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005770 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5771 "SPIR target must use unknown OS");
5772 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5773 "SPIR target must use unknown environment type");
5774 BigEndian = false;
5775 TLSSupported = false;
5776 LongWidth = LongAlign = 64;
5777 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005778 UseAddrSpaceMapMangling = true;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005779 // Define available target features
5780 // These must be defined in sorted order!
5781 NoAsmVariants = true;
5782 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005783 void getTargetDefines(const LangOptions &Opts,
5784 MacroBuilder &Builder) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005785 DefineStd(Builder, "SPIR", Opts);
5786 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005787 bool hasFeature(StringRef Feature) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005788 return Feature == "spir";
5789 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005790
5791 void getTargetBuiltins(const Builtin::Info *&Records,
5792 unsigned &NumRecords) const override {}
5793 const char *getClobbers() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005794 return "";
5795 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005796 void getGCCRegNames(const char * const *&Names,
5797 unsigned &NumNames) const override {}
5798 bool validateAsmConstraint(const char *&Name,
5799 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005800 return true;
5801 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005802 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5803 unsigned &NumAliases) const override {}
5804 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005805 return TargetInfo::VoidPtrBuiltinVaList;
5806 }
5807 };
5808
5809
5810 class SPIR32TargetInfo : public SPIRTargetInfo {
5811 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005812 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005813 PointerWidth = PointerAlign = 32;
5814 SizeType = TargetInfo::UnsignedInt;
5815 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5816 DescriptionString
Stephen Hines651f13c2014-04-23 16:59:28 -07005817 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5818 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005819 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005820 void getTargetDefines(const LangOptions &Opts,
5821 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00005822 DefineStd(Builder, "SPIR32", Opts);
5823 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005824 };
5825
5826 class SPIR64TargetInfo : public SPIRTargetInfo {
5827 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005828 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005829 PointerWidth = PointerAlign = 64;
5830 SizeType = TargetInfo::UnsignedLong;
5831 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07005832 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5833 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005834 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005835 void getTargetDefines(const LangOptions &Opts,
5836 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00005837 DefineStd(Builder, "SPIR64", Opts);
5838 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005839 };
5840}
5841
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005842namespace {
5843class XCoreTargetInfo : public TargetInfo {
5844 static const Builtin::Info BuiltinInfo[];
5845public:
5846 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5847 BigEndian = false;
5848 NoAsmVariants = true;
5849 LongLongAlign = 32;
5850 SuitableAlign = 32;
5851 DoubleAlign = LongDoubleAlign = 32;
Robert Lytton18162192013-11-12 10:09:30 +00005852 SizeType = UnsignedInt;
5853 PtrDiffType = SignedInt;
5854 IntPtrType = SignedInt;
5855 WCharType = UnsignedChar;
5856 WIntType = UnsignedInt;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005857 UseZeroLengthBitfieldAlignment = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07005858 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
5859 "-f64:32-a:0:32-n32";
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005860 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005861 void getTargetDefines(const LangOptions &Opts,
5862 MacroBuilder &Builder) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005863 Builder.defineMacro("__XS1B__");
5864 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005865 void getTargetBuiltins(const Builtin::Info *&Records,
5866 unsigned &NumRecords) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005867 Records = BuiltinInfo;
5868 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5869 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005870 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005871 return TargetInfo::VoidPtrBuiltinVaList;
5872 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005873 const char *getClobbers() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005874 return "";
5875 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005876 void getGCCRegNames(const char * const *&Names,
5877 unsigned &NumNames) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005878 static const char * const GCCRegNames[] = {
5879 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5880 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5881 };
5882 Names = GCCRegNames;
5883 NumNames = llvm::array_lengthof(GCCRegNames);
5884 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005885 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5886 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005887 Aliases = nullptr;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005888 NumAliases = 0;
5889 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005890 bool validateAsmConstraint(const char *&Name,
5891 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005892 return false;
5893 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005894 int getEHDataRegisterNumber(unsigned RegNo) const override {
5895 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
5896 return (RegNo < 2)? RegNo : -1;
5897 }
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005898};
5899
5900const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5901#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5902#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5903 ALL_LANGUAGES },
5904#include "clang/Basic/BuiltinsXCore.def"
5905};
5906} // end anonymous namespace.
5907
Ivan Krasinef05abd2011-08-24 20:22:22 +00005908
Chris Lattner4b009652007-07-25 00:24:17 +00005909//===----------------------------------------------------------------------===//
5910// Driver code
5911//===----------------------------------------------------------------------===//
5912
Benjamin Kramer9df08232013-06-29 16:37:14 +00005913static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00005914 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00005915
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00005916 switch (Triple.getArch()) {
5917 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005918 return nullptr;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00005919
Stephen Hines651f13c2014-04-23 16:59:28 -07005920 case llvm::Triple::arm64:
5921 if (Triple.isOSDarwin())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005922 return new DarwinAArch64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07005923
5924 switch (os) {
5925 case llvm::Triple::Linux:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005926 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
5927 case llvm::Triple::NetBSD:
5928 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07005929 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005930 return new AArch64leTargetInfo(Triple);
5931 }
5932
5933 case llvm::Triple::arm64_be:
5934 switch (os) {
5935 case llvm::Triple::Linux:
5936 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
5937 case llvm::Triple::NetBSD:
5938 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
5939 default:
5940 return new AArch64beTargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07005941 }
5942
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005943 case llvm::Triple::xcore:
5944 return new XCoreTargetInfo(Triple);
5945
Tony Linthicum96319392011-12-12 21:14:55 +00005946 case llvm::Triple::hexagon:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005947 return new HexagonTargetInfo(Triple);
Tony Linthicum96319392011-12-12 21:14:55 +00005948
Tim Northoverc264e162013-01-31 12:13:10 +00005949 case llvm::Triple::aarch64:
5950 switch (os) {
5951 case llvm::Triple::Linux:
Stephen Hines651f13c2014-04-23 16:59:28 -07005952 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
5953 case llvm::Triple::NetBSD:
5954 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005955 default:
Stephen Hines651f13c2014-04-23 16:59:28 -07005956 return new AArch64leTargetInfo(Triple);
5957 }
5958
5959 case llvm::Triple::aarch64_be:
5960 switch (os) {
5961 case llvm::Triple::Linux:
5962 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
5963 case llvm::Triple::NetBSD:
5964 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
5965 default:
5966 return new AArch64beTargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005967 }
5968
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00005969 case llvm::Triple::arm:
Daniel Dunbar3f361b52009-09-11 01:14:50 +00005970 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07005971 if (Triple.isOSBinFormatMachO())
5972 return new DarwinARMTargetInfo(Triple);
5973
5974 switch (os) {
5975 case llvm::Triple::Linux:
5976 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
5977 case llvm::Triple::FreeBSD:
5978 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
5979 case llvm::Triple::NetBSD:
5980 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
5981 case llvm::Triple::OpenBSD:
5982 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
5983 case llvm::Triple::Bitrig:
5984 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
5985 case llvm::Triple::RTEMS:
5986 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
5987 case llvm::Triple::NaCl:
5988 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005989 case llvm::Triple::Win32:
5990 switch (Triple.getEnvironment()) {
5991 default:
5992 return new ARMleTargetInfo(Triple);
5993 case llvm::Triple::Itanium:
5994 return new ItaniumWindowsARMleTargetInfo(Triple);
5995 case llvm::Triple::MSVC:
5996 return new MicrosoftARMleTargetInfo(Triple);
5997 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005998 default:
5999 return new ARMleTargetInfo(Triple);
6000 }
6001
6002 case llvm::Triple::armeb:
6003 case llvm::Triple::thumbeb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006004 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006005 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006006
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006007 switch (os) {
Rafael Espindolad16a2202010-06-10 00:46:51 +00006008 case llvm::Triple::Linux:
Stephen Hines651f13c2014-04-23 16:59:28 -07006009 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006010 case llvm::Triple::FreeBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006011 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006012 case llvm::Triple::NetBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006013 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006014 case llvm::Triple::OpenBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006015 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006016 case llvm::Triple::Bitrig:
Stephen Hines651f13c2014-04-23 16:59:28 -07006017 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006018 case llvm::Triple::RTEMS:
Stephen Hines651f13c2014-04-23 16:59:28 -07006019 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006020 case llvm::Triple::NaCl:
Stephen Hines651f13c2014-04-23 16:59:28 -07006021 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006022 default:
Stephen Hines651f13c2014-04-23 16:59:28 -07006023 return new ARMbeTargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006024 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006025
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006026 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006027 return new MSP430TargetInfo(Triple);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006028
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006029 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006030 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006031 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006032 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006033 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006034 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006035 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006036 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006037 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006038 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006039 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006040 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006041 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006042
6043 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006044 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006045 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006046 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006047 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006048 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006049 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006050 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006051 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006052 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicbbac9aa2013-09-21 01:27:01 +00006053 case llvm::Triple::NaCl:
6054 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006055 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006056 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006057 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00006058
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006059 case llvm::Triple::mips64:
6060 switch (os) {
6061 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006062 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006063 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006064 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006065 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006066 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006067 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006068 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006069 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006070 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006071 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006072 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006073 }
6074
6075 case llvm::Triple::mips64el:
6076 switch (os) {
6077 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006078 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006079 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006080 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006081 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006082 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006083 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006084 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006085 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006086 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006087 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006088 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006089 }
6090
Ivan Krasinef05abd2011-08-24 20:22:22 +00006091 case llvm::Triple::le32:
6092 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00006093 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006094 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00006095 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006096 return nullptr;
Chris Lattnere03ae302010-02-16 18:14:57 +00006097 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006098
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006099 case llvm::Triple::ppc:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006100 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006101 return new DarwinPPC32TargetInfo(Triple);
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00006102 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006103 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006104 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006105 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006106 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006107 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006108 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006109 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006110 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006111 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006112 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006113 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006114 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006115 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006116
6117 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006118 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006119 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006120 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006121 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006122 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006123 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006124 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006125 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006126 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006127 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006128 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006129 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006130 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006131 }
Daniel Dunbard58c03f2009-11-15 06:48:46 +00006132
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006133 case llvm::Triple::ppc64le:
6134 switch (os) {
6135 case llvm::Triple::Linux:
6136 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6137 default:
6138 return new PPC64TargetInfo(Triple);
Reid Spencer5f016e22007-07-11 17:01:13 +00006139 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006140
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006141 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006142 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006143 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006144 return new NVPTX64TargetInfo(Triple);
Chris Lattner2c026472010-03-06 21:21:27 +00006145
Eli Friedman6505a292012-10-12 23:32:00 +00006146 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006147 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00006148
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006149 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006150 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006151 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006152 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006153 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006154 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006155 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006156 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006157 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006158 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006159 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006160 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006161 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006162 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006163 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006164 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006165 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006166
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006167 case llvm::Triple::sparcv9:
6168 switch (os) {
6169 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006170 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006171 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006172 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006173 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006174 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006175 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006176 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006177 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006178 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006179 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006180 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006181 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006182 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006183 }
6184
Ulrich Weigandb8409212013-05-06 16:26:41 +00006185 case llvm::Triple::systemz:
6186 switch (os) {
6187 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006188 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006189 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006190 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006191 }
6192
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006193 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006194 return new TCETargetInfo(Triple);
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006195
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006196 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006197 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006198 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006199
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006200 switch (os) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00006201 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006202 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006203 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006204 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006205 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006206 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006207 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006208 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006209 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006210 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006211 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006212 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006213 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006214 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006215 case llvm::Triple::KFreeBSD:
6216 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner6f4bed52010-07-07 16:01:42 +00006217 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006218 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006219 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006220 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006221 case llvm::Triple::Win32: {
6222 switch (Triple.getEnvironment()) {
6223 default:
6224 return new X86_32TargetInfo(Triple);
6225 case llvm::Triple::Cygnus:
6226 return new CygwinX86_32TargetInfo(Triple);
6227 case llvm::Triple::GNU:
6228 return new MinGWX86_32TargetInfo(Triple);
6229 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006230 return new MicrosoftX86_32TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006231 }
6232 }
Chris Lattnerf853e732010-04-11 19:29:39 +00006233 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006234 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006235 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006236 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006237 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006238 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006239 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006240 return new X86_32TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006241 }
6242
6243 case llvm::Triple::x86_64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006244 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006245 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006246
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006247 switch (os) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00006248 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006249 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006250 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006251 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner1eac0812010-01-09 05:41:14 +00006252 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006253 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006254 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006255 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006256 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006257 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006258 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006259 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006260 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006261 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006262 case llvm::Triple::KFreeBSD:
6263 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006264 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006265 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006266 case llvm::Triple::Win32: {
6267 switch (Triple.getEnvironment()) {
6268 default:
6269 return new X86_64TargetInfo(Triple);
6270 case llvm::Triple::GNU:
6271 return new MinGWX86_64TargetInfo(Triple);
6272 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006273 return new MicrosoftX86_64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006274 }
6275 }
Eli Bendersky441d9f72012-12-04 18:38:10 +00006276 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006277 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006278 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006279 return new X86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006280 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006281
6282 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006283 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006284 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006285 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006286 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006287 }
6288 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006289 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006290 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006291 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006292 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006293 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006294 }
Chris Lattner4b009652007-07-25 00:24:17 +00006295}
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006296
6297/// CreateTargetInfo - Return the target info object for the specified target
6298/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00006299TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00006300 TargetOptions *Opts) {
6301 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006302
6303 // Construct the target
Stephen Hines651f13c2014-04-23 16:59:28 -07006304 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006305 if (!Target) {
6306 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006307 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006308 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00006309 Target->setTargetOpts(Opts);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006310
Daniel Dunbar33b40752009-12-18 18:42:37 +00006311 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006312 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6313 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006314 return nullptr;
Daniel Dunbar33b40752009-12-18 18:42:37 +00006315 }
6316
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006317 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006318 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6319 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006320 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006321 }
6322
Rafael Espindola5389b842013-08-21 21:59:03 +00006323 // Set the fp math unit.
6324 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6325 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006326 return nullptr;
Rafael Espindola5389b842013-08-21 21:59:03 +00006327 }
6328
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006329 // Compute the default target features, we need the target to handle this
6330 // because features may have dependencies on one another.
6331 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00006332 Target->getDefaultFeatures(Features);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006333
6334 // Apply the user specified deltas.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006335 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6336 I < N; ++I) {
6337 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006338 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006339 bool Enabled = Name[0] == '+';
6340 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006341 }
6342
6343 // Add the features to the compile options.
6344 //
6345 // FIXME: If we are completely confident that we have the right set, we only
6346 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00006347 Opts->Features.clear();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006348 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6349 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00006350 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3d11ced2013-10-16 21:26:26 +00006351 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006352 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006353
Stephen Hines651f13c2014-04-23 16:59:28 -07006354 return Target.release();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006355}