blob: 0dbeb250767e4e53b119c510cc2fde1d3c1f8bbf [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"
Stephen Hines176edba2014-12-01 14:53:08 -080024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar0433a022009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattnerf54f2212009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner43954312009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerf8a85782010-01-09 18:20:57 +000031#include <algorithm>
Stephen Hines651f13c2014-04-23 16:59:28 -070032#include <memory>
Chris Lattner4b009652007-07-25 00:24:17 +000033using namespace clang;
34
Chris Lattner4b009652007-07-25 00:24:17 +000035//===----------------------------------------------------------------------===//
36// Common code shared among targets.
37//===----------------------------------------------------------------------===//
38
Chris Lattnerc345a802009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner5f9e2722011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattnerc345a802009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikove7772382009-05-03 13:42:53 +000045
Chris Lattnerc345a802009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000050
Chris Lattnerc345a802009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000053
Chris Lattnerc345a802009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerc345a802009-03-20 16:06:38 +000056}
57
Benjamin Kramer448f68d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattnerbd00eb82008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner43954312009-08-10 19:03:04 +000069
Edwin Török36565e52009-06-30 17:10:35 +000070namespace {
Douglas Gregor937331f2009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Edwin Török36565e52009-06-30 17:10:35 +000073protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Edwin Török36565e52009-06-30 17:10:35 +000076public:
Benjamin Kramer9df08232013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -070078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Edwin Török2d98f9f2009-06-30 17:00:25 +000082 }
Edwin Török36565e52009-06-30 17:10:35 +000083
84};
Chris Lattnerf54f2212009-08-12 06:24:27 +000085} // end anonymous namespace
Edwin Török2d98f9f2009-06-30 17:00:25 +000086
Chris Lattner43954312009-08-10 19:03:04 +000087
Daniel Dunbareab96a22010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilsond588f5c2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenko087c65f2012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Stephen Hines176edba2014-12-01 14:53:08 -080097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikove7772382009-05-03 13:42:53 +000099
John McCall098df7f2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000103
John McCallf85e1932011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000109
John McCallf85e1932011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000114 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000115
Eli Friedmaneff0a422009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmaneff0a422009-06-04 23:00:29 +0000118 else
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar93f64532009-04-10 19:52:24 +0000123
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000129 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000132 }
Daniel Dunbareab96a22010-01-26 01:44:04 +0000133
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Stephen Hines651f13c2014-04-23 16:59:28 -0700142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Stephen Hines176edba2014-12-01 14:53:08 -0800160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000178 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000179
Stephen Hines651f13c2014-04-23 16:59:28 -0700180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman872996c2008-08-20 02:34:37 +0000185}
Chris Lattner4b009652007-07-25 00:24:17 +0000186
Chris Lattner43954312009-08-10 19:03:04 +0000187namespace {
Edwin Török36565e52009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Edwin Török36565e52009-06-30 17:10:35 +0000195 }
Mike Stump25cf7602009-09-09 15:08:12 +0000196
Edwin Török36565e52009-06-30 17:10:35 +0000197public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
Edwin Török36565e52009-06-30 17:10:35 +0000202
Stephen Hines651f13c2014-04-23 16:59:28 -0700203 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner43954312009-08-10 19:03:04 +0000204 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000205 StringRef Segment, Section;
Chris Lattner43954312009-08-10 19:03:04 +0000206 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000207 bool HasTAA;
Chris Lattner43954312009-08-10 19:03:04 +0000208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000209 TAA, HasTAA, StubSize);
Chris Lattner43954312009-08-10 19:03:04 +0000210 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000211
Stephen Hines651f13c2014-04-23 16:59:28 -0700212 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson608b5792010-06-08 22:47:50 +0000213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000216
John McCall41887602012-01-29 01:20:30 +0000217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
Stephen Hines651f13c2014-04-23 16:59:28 -0700220 bool hasProtectedVisibility() const override {
John McCall41887602012-01-29 01:20:30 +0000221 return false;
222 }
Edwin Török36565e52009-06-30 17:10:35 +0000223};
224
Chris Lattner43954312009-08-10 19:03:04 +0000225
Edwin Török36565e52009-06-30 17:10:35 +0000226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000232 // DragonFly defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
Edwin Török36565e52009-06-30 17:10:35 +0000239 }
240public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000244
Benjamin Kramer9df08232013-06-29 16:37:14 +0000245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000252 }
Edwin Török36565e52009-06-30 17:10:35 +0000253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000261 // FreeBSD defines; list based off of gcc output
262
Benjamin Kramer474202f2011-10-18 10:10:08 +0000263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
Edwin Török36565e52009-06-30 17:10:35 +0000266
Benjamin Kramer474202f2011-10-18 10:10:08 +0000267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
Ed Schouten5ada7a52013-09-29 07:54:52 +0000272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
276 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Edwin Török36565e52009-06-30 17:10:35 +0000277 }
278public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000279 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
280 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000281
Benjamin Kramer9df08232013-06-29 16:37:14 +0000282 switch (Triple.getArch()) {
283 default:
284 case llvm::Triple::x86:
285 case llvm::Triple::x86_64:
286 this->MCountName = ".mcount";
287 break;
288 case llvm::Triple::mips:
289 case llvm::Triple::mipsel:
290 case llvm::Triple::ppc:
291 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000292 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000293 this->MCountName = "_mcount";
294 break;
295 case llvm::Triple::arm:
296 this->MCountName = "__mcount";
297 break;
Duncan Sandscd2cb662009-07-08 13:55:08 +0000298 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000299 }
Edwin Török36565e52009-06-30 17:10:35 +0000300};
301
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000302// GNU/kFreeBSD Target
303template<typename Target>
304class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
305protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700306 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
307 MacroBuilder &Builder) const override {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000308 // GNU/kFreeBSD defines; list based off of gcc output
309
310 DefineStd(Builder, "unix", Opts);
311 Builder.defineMacro("__FreeBSD_kernel__");
312 Builder.defineMacro("__GLIBC__");
313 Builder.defineMacro("__ELF__");
314 if (Opts.POSIXThreads)
315 Builder.defineMacro("_REENTRANT");
316 if (Opts.CPlusPlus)
317 Builder.defineMacro("_GNU_SOURCE");
318 }
319public:
Stephen Hines176edba2014-12-01 14:53:08 -0800320 KFreeBSDTargetInfo(const llvm::Triple &Triple)
321 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000322 this->UserLabelPrefix = "";
323 }
324};
325
Chris Lattner6f4bed52010-07-07 16:01:42 +0000326// Minix Target
327template<typename Target>
328class MinixTargetInfo : public OSTargetInfo<Target> {
329protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700330 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
331 MacroBuilder &Builder) const override {
Chris Lattner6f4bed52010-07-07 16:01:42 +0000332 // Minix defines
333
334 Builder.defineMacro("__minix", "3");
335 Builder.defineMacro("_EM_WSIZE", "4");
336 Builder.defineMacro("_EM_PSIZE", "4");
337 Builder.defineMacro("_EM_SSIZE", "2");
338 Builder.defineMacro("_EM_LSIZE", "4");
339 Builder.defineMacro("_EM_FSIZE", "4");
340 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000341 Builder.defineMacro("__ELF__");
Chris Lattner6f4bed52010-07-07 16:01:42 +0000342 DefineStd(Builder, "unix", Opts);
343 }
344public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000345 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
346 this->UserLabelPrefix = "";
347 }
Chris Lattner6f4bed52010-07-07 16:01:42 +0000348};
349
Edwin Török36565e52009-06-30 17:10:35 +0000350// Linux target
351template<typename Target>
352class LinuxTargetInfo : public OSTargetInfo<Target> {
353protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700354 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
355 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000356 // Linux defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000357 DefineStd(Builder, "unix", Opts);
358 DefineStd(Builder, "linux", Opts);
359 Builder.defineMacro("__gnu_linux__");
360 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000361 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000362 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000363 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000364 Builder.defineMacro("_REENTRANT");
Douglas Gregor9b22a172010-04-21 05:52:38 +0000365 if (Opts.CPlusPlus)
366 Builder.defineMacro("_GNU_SOURCE");
Edwin Török36565e52009-06-30 17:10:35 +0000367 }
368public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000369 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000370 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000371 this->WIntType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700372
373 switch (Triple.getArch()) {
374 default:
375 break;
376 case llvm::Triple::ppc:
377 case llvm::Triple::ppc64:
378 case llvm::Triple::ppc64le:
379 this->MCountName = "_mcount";
380 break;
381 }
Edwin Török36565e52009-06-30 17:10:35 +0000382 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000383
Stephen Hines651f13c2014-04-23 16:59:28 -0700384 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000385 return ".text.startup";
386 }
Edwin Török36565e52009-06-30 17:10:35 +0000387};
388
Chris Lattner25fff082009-07-13 20:29:08 +0000389// NetBSD Target
390template<typename Target>
391class NetBSDTargetInfo : public OSTargetInfo<Target> {
392protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700393 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
394 MacroBuilder &Builder) const override {
Chris Lattner25fff082009-07-13 20:29:08 +0000395 // NetBSD defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000396 Builder.defineMacro("__NetBSD__");
397 Builder.defineMacro("__unix__");
398 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000399 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000400 Builder.defineMacro("_POSIX_THREADS");
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700401
402 switch (Triple.getArch()) {
403 default:
404 break;
405 case llvm::Triple::arm:
406 case llvm::Triple::armeb:
407 case llvm::Triple::thumb:
408 case llvm::Triple::thumbeb:
409 Builder.defineMacro("__ARM_DWARF_EH__");
410 break;
411 }
Chris Lattner25fff082009-07-13 20:29:08 +0000412 }
413public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000414 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
415 this->UserLabelPrefix = "";
416 }
Chris Lattner25fff082009-07-13 20:29:08 +0000417};
418
Edwin Török36565e52009-06-30 17:10:35 +0000419// OpenBSD Target
420template<typename Target>
421class OpenBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Edwin Török36565e52009-06-30 17:10:35 +0000425 // OpenBSD defines; list based off of gcc output
426
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000427 Builder.defineMacro("__OpenBSD__");
428 DefineStd(Builder, "unix", Opts);
429 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000430 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000431 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000432 }
433public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000434 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
435 this->UserLabelPrefix = "";
436 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000437
Eli Friedman62d829a2011-12-15 02:15:56 +0000438 switch (Triple.getArch()) {
439 default:
440 case llvm::Triple::x86:
441 case llvm::Triple::x86_64:
442 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000443 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000444 this->MCountName = "__mcount";
445 break;
446 case llvm::Triple::mips64:
447 case llvm::Triple::mips64el:
448 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000449 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000450 this->MCountName = "_mcount";
451 break;
452 }
453 }
Edwin Török36565e52009-06-30 17:10:35 +0000454};
455
Eli Friedman42f74f22012-08-08 23:57:20 +0000456// Bitrig Target
457template<typename Target>
458class BitrigTargetInfo : public OSTargetInfo<Target> {
459protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700460 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
461 MacroBuilder &Builder) const override {
Eli Friedman42f74f22012-08-08 23:57:20 +0000462 // Bitrig defines; list based off of gcc output
463
464 Builder.defineMacro("__Bitrig__");
465 DefineStd(Builder, "unix", Opts);
466 Builder.defineMacro("__ELF__");
467 if (Opts.POSIXThreads)
468 Builder.defineMacro("_REENTRANT");
469 }
470public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000471 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
472 this->UserLabelPrefix = "";
Benjamin Kramer9df08232013-06-29 16:37:14 +0000473 this->MCountName = "__mcount";
Eli Friedman42f74f22012-08-08 23:57:20 +0000474 }
475};
476
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000477// PSP Target
478template<typename Target>
479class PSPTargetInfo : public OSTargetInfo<Target> {
480protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700481 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
482 MacroBuilder &Builder) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000483 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000484 Builder.defineMacro("PSP");
485 Builder.defineMacro("_PSP");
486 Builder.defineMacro("__psp__");
487 Builder.defineMacro("__ELF__");
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000488 }
489public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000490 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000491 this->UserLabelPrefix = "";
492 }
493};
494
John Thompsoned7bdbc2009-11-19 17:18:50 +0000495// PS3 PPU Target
496template<typename Target>
497class PS3PPUTargetInfo : public OSTargetInfo<Target> {
498protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700499 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
500 MacroBuilder &Builder) const override {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000501 // PS3 PPU defines.
John Thompsonfdd2fc32010-03-25 16:18:32 +0000502 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000503 Builder.defineMacro("__PPU__");
504 Builder.defineMacro("__CELLOS_LV2__");
505 Builder.defineMacro("__ELF__");
506 Builder.defineMacro("__LP32__");
John Thompson1deeb9f2010-06-24 22:44:13 +0000507 Builder.defineMacro("_ARCH_PPC64");
508 Builder.defineMacro("__powerpc64__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000509 }
510public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000511 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000512 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000513 this->LongWidth = this->LongAlign = 32;
514 this->PointerWidth = this->PointerAlign = 32;
John Thompson1deeb9f2010-06-24 22:44:13 +0000515 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson1deeb9f2010-06-24 22:44:13 +0000516 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson4c3bd3f2009-12-18 14:21:08 +0000517 this->SizeType = TargetInfo::UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -0700518 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsoned7bdbc2009-11-19 17:18:50 +0000519 }
520};
521
Edwin Török36565e52009-06-30 17:10:35 +0000522// Solaris target
523template<typename Target>
524class SolarisTargetInfo : public OSTargetInfo<Target> {
525protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
527 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000528 DefineStd(Builder, "sun", Opts);
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
531 Builder.defineMacro("__svr4__");
532 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000533 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
534 // newer, but to 500 for everything else. feature_test.h has a check to
535 // ensure that you are not using C99 with an old version of X/Open or C89
Stephen Hines176edba2014-12-01 14:53:08 -0800536 // with a new version.
537 if (Opts.C99)
David Chisnall165329c2012-02-28 17:10:04 +0000538 Builder.defineMacro("_XOPEN_SOURCE", "600");
539 else
540 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000541 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000542 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000543 Builder.defineMacro("_LARGEFILE_SOURCE");
544 Builder.defineMacro("_LARGEFILE64_SOURCE");
545 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000546 Builder.defineMacro("_REENTRANT");
Edwin Török36565e52009-06-30 17:10:35 +0000547 }
548public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000549 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edwin Török36565e52009-06-30 17:10:35 +0000550 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000551 this->WCharType = this->SignedInt;
Edwin Török36565e52009-06-30 17:10:35 +0000552 // FIXME: WIntType should be SignedLong
553 }
554};
Michael J. Spencer01e70082010-10-21 05:21:48 +0000555
556// Windows target
557template<typename Target>
558class WindowsTargetInfo : public OSTargetInfo<Target> {
559protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700560 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
561 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000562 Builder.defineMacro("_WIN32");
563 }
564 void getVisualStudioDefines(const LangOptions &Opts,
565 MacroBuilder &Builder) const {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000566 if (Opts.CPlusPlus) {
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700567 if (Opts.RTTIData)
Michael J. Spencer01e70082010-10-21 05:21:48 +0000568 Builder.defineMacro("_CPPRTTI");
569
570 if (Opts.Exceptions)
571 Builder.defineMacro("_CPPUNWIND");
572 }
573
574 if (!Opts.CharIsSigned)
575 Builder.defineMacro("_CHAR_UNSIGNED");
576
577 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
578 // but it works for now.
579 if (Opts.POSIXThreads)
580 Builder.defineMacro("_MT");
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000581
Stephen Hines176edba2014-12-01 14:53:08 -0800582 if (Opts.MSCompatibilityVersion) {
583 Builder.defineMacro("_MSC_VER",
584 Twine(Opts.MSCompatibilityVersion / 100000));
585 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700586 // FIXME We cannot encode the revision information into 32-bits
587 Builder.defineMacro("_MSC_BUILD", Twine(1));
588 }
Michael J. Spencer01e70082010-10-21 05:21:48 +0000589
Francois Pichet62ec1f22011-09-17 17:15:52 +0000590 if (Opts.MicrosoftExt) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000591 Builder.defineMacro("_MSC_EXTENSIONS");
592
Richard Smith80ad52f2013-01-02 11:42:31 +0000593 if (Opts.CPlusPlus11) {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000594 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
595 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
596 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
597 }
598 }
599
600 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer01e70082010-10-21 05:21:48 +0000601 }
602
Michael J. Spencer01e70082010-10-21 05:21:48 +0000603public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000604 WindowsTargetInfo(const llvm::Triple &Triple)
605 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer01e70082010-10-21 05:21:48 +0000606};
607
Derek Schuff7da46f92012-10-11 16:55:58 +0000608template <typename Target>
609class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000610protected:
Stephen Hines651f13c2014-04-23 16:59:28 -0700611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
612 MacroBuilder &Builder) const override {
Derek Schuff7da46f92012-10-11 16:55:58 +0000613 if (Opts.POSIXThreads)
614 Builder.defineMacro("_REENTRANT");
615 if (Opts.CPlusPlus)
616 Builder.defineMacro("_GNU_SOURCE");
617
618 DefineStd(Builder, "unix", Opts);
619 Builder.defineMacro("__ELF__");
620 Builder.defineMacro("__native_client__");
621 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000622
623public:
624 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000625 this->UserLabelPrefix = "";
626 this->LongAlign = 32;
627 this->LongWidth = 32;
628 this->PointerAlign = 32;
629 this->PointerWidth = 32;
630 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff7da46f92012-10-11 16:55:58 +0000631 this->Int64Type = TargetInfo::SignedLongLong;
632 this->DoubleAlign = 64;
633 this->LongDoubleWidth = 64;
634 this->LongDoubleAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -0700635 this->LongLongWidth = 64;
636 this->LongLongAlign = 64;
Derek Schuff7da46f92012-10-11 16:55:58 +0000637 this->SizeType = TargetInfo::UnsignedInt;
638 this->PtrDiffType = TargetInfo::SignedInt;
639 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000640 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000641 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines651f13c2014-04-23 16:59:28 -0700642 if (Triple.getArch() == llvm::Triple::arm) {
Stephen Hines176edba2014-12-01 14:53:08 -0800643 this->DescriptionString =
644 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Stephen Hines651f13c2014-04-23 16:59:28 -0700645 } else if (Triple.getArch() == llvm::Triple::x86) {
646 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
647 } else if (Triple.getArch() == llvm::Triple::x86_64) {
648 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
649 } else if (Triple.getArch() == llvm::Triple::mipsel) {
650 // Handled on mips' setDescriptionString.
651 } else {
652 assert(Triple.getArch() == llvm::Triple::le32);
653 this->DescriptionString = "e-p:32:32-i64:64";
654 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000655 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700656 typename Target::CallingConvCheckResult checkCallingConvention(
657 CallingConv CC) const override {
Derek Schuff263366f2012-10-16 22:30:41 +0000658 return CC == CC_PnaclCall ? Target::CCCR_OK :
659 Target::checkCallingConvention(CC);
660 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000661};
Mike Stump25cf7602009-09-09 15:08:12 +0000662} // end anonymous namespace.
Edwin Török36565e52009-06-30 17:10:35 +0000663
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000664//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000665// Specific target implementations.
666//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000667
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000668namespace {
669// PPC abstract base class
670class PPCTargetInfo : public TargetInfo {
671 static const Builtin::Info BuiltinInfo[];
672 static const char * const GCCRegNames[];
673 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000674 std::string CPU;
Eric Christopher16543202013-10-16 21:19:26 +0000675
676 // Target cpu features.
677 bool HasVSX;
Stephen Hines176edba2014-12-01 14:53:08 -0800678 bool HasP8Vector;
679
680protected:
681 std::string ABI;
Eric Christopher16543202013-10-16 21:19:26 +0000682
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000683public:
Eric Christopher16543202013-10-16 21:19:26 +0000684 PPCTargetInfo(const llvm::Triple &Triple)
Stephen Hines176edba2014-12-01 14:53:08 -0800685 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000686 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000687 LongDoubleWidth = LongDoubleAlign = 128;
688 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
689 }
Eli Friedmand9389be2009-06-05 07:05:05 +0000690
Hal Finkel39d5fa12012-07-03 16:51:04 +0000691 /// \brief Flags for architecture specific defines.
692 typedef enum {
693 ArchDefineNone = 0,
694 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
695 ArchDefinePpcgr = 1 << 1,
696 ArchDefinePpcsq = 1 << 2,
697 ArchDefine440 = 1 << 3,
698 ArchDefine603 = 1 << 4,
699 ArchDefine604 = 1 << 5,
700 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000701 ArchDefinePwr5 = 1 << 7,
702 ArchDefinePwr5x = 1 << 8,
703 ArchDefinePwr6 = 1 << 9,
704 ArchDefinePwr6x = 1 << 10,
705 ArchDefinePwr7 = 1 << 11,
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700706 ArchDefinePwr8 = 1 << 12,
707 ArchDefineA2 = 1 << 13,
708 ArchDefineA2q = 1 << 14
Hal Finkel39d5fa12012-07-03 16:51:04 +0000709 } ArchDefineTypes;
710
Bill Schmidt2821e182013-02-01 20:23:10 +0000711 // Note: GCC recognizes the following additional cpus:
712 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
713 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
714 // titan, rs64.
Stephen Hines651f13c2014-04-23 16:59:28 -0700715 bool setCPU(const std::string &Name) override {
Hal Finkel02a84272012-06-11 22:35:19 +0000716 bool CPUKnown = llvm::StringSwitch<bool>(Name)
717 .Case("generic", true)
718 .Case("440", true)
719 .Case("450", true)
720 .Case("601", true)
721 .Case("602", true)
722 .Case("603", true)
723 .Case("603e", true)
724 .Case("603ev", true)
725 .Case("604", true)
726 .Case("604e", true)
727 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000728 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000729 .Case("g3", true)
730 .Case("7400", true)
731 .Case("g4", true)
732 .Case("7450", true)
733 .Case("g4+", true)
734 .Case("750", true)
735 .Case("970", true)
736 .Case("g5", true)
737 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000738 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000739 .Case("e500mc", true)
740 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000741 .Case("power3", true)
742 .Case("pwr3", true)
743 .Case("power4", true)
744 .Case("pwr4", true)
745 .Case("power5", true)
746 .Case("pwr5", true)
747 .Case("power5x", true)
748 .Case("pwr5x", true)
749 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000750 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000751 .Case("power6x", true)
752 .Case("pwr6x", true)
753 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000754 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700755 .Case("power8", true)
756 .Case("pwr8", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000757 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000758 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000759 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000760 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000761 .Case("powerpc64le", true)
762 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000763 .Default(false);
764
765 if (CPUKnown)
766 CPU = Name;
767
768 return CPUKnown;
769 }
770
Stephen Hines176edba2014-12-01 14:53:08 -0800771
772 StringRef getABI() const override { return ABI; }
773
Stephen Hines651f13c2014-04-23 16:59:28 -0700774 void getTargetBuiltins(const Builtin::Info *&Records,
775 unsigned &NumRecords) const override {
Chris Lattner4b009652007-07-25 00:24:17 +0000776 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000777 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000778 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000779
Stephen Hines651f13c2014-04-23 16:59:28 -0700780 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000781
Stephen Hines651f13c2014-04-23 16:59:28 -0700782 void getTargetDefines(const LangOptions &Opts,
783 MacroBuilder &Builder) const override;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000784
Stephen Hines651f13c2014-04-23 16:59:28 -0700785 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt199402b2013-02-01 02:14:03 +0000786
Stephen Hines651f13c2014-04-23 16:59:28 -0700787 bool handleTargetFeatures(std::vector<std::string> &Features,
788 DiagnosticsEngine &Diags) override;
789 bool hasFeature(StringRef Feature) const override;
790
791 void getGCCRegNames(const char * const *&Names,
792 unsigned &NumNames) const override;
793 void getGCCRegAliases(const GCCRegAlias *&Aliases,
794 unsigned &NumAliases) const override;
795 bool validateAsmConstraint(const char *&Name,
796 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +0000797 switch (*Name) {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000798 default: return false;
799 case 'O': // Zero
John Thompson1deeb9f2010-06-24 22:44:13 +0000800 break;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000801 case 'b': // Base register
802 case 'f': // Floating point register
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000803 Info.setAllowsRegister();
John Thompson1deeb9f2010-06-24 22:44:13 +0000804 break;
805 // FIXME: The following are added to allow parsing.
806 // I just took a guess at what the actions should be.
807 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000808 case 'd': // Floating point register (containing 64-bit value)
John Thompson1deeb9f2010-06-24 22:44:13 +0000809 case 'v': // Altivec vector register
810 Info.setAllowsRegister();
811 break;
812 case 'w':
813 switch (Name[1]) {
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000814 case 'd':// VSX vector register to hold vector double data
815 case 'f':// VSX vector register to hold vector float data
816 case 's':// VSX vector register to hold scalar float data
817 case 'a':// Any VSX register
Stephen Hines651f13c2014-04-23 16:59:28 -0700818 case 'c':// An individual CR bit
John Thompson1deeb9f2010-06-24 22:44:13 +0000819 break;
820 default:
821 return false;
822 }
823 Info.setAllowsRegister();
824 Name++; // Skip over 'w'.
825 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000826 case 'h': // `MQ', `CTR', or `LINK' register
827 case 'q': // `MQ' register
828 case 'c': // `CTR' register
829 case 'l': // `LINK' register
830 case 'x': // `CR' register (condition register) number 0
831 case 'y': // `CR' register (condition register)
832 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson1deeb9f2010-06-24 22:44:13 +0000833 Info.setAllowsRegister();
834 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000835 case 'I': // Signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000836 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000837 // (use `L' instead for SImode constants)
838 case 'K': // Unsigned 16-bit constant
839 case 'L': // Signed 16-bit constant shifted left 16 bits
840 case 'M': // Constant larger than 31
841 case 'N': // Exact power of 2
842 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000843 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000844 // register with one instruction per word
John Thompson1deeb9f2010-06-24 22:44:13 +0000845 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000846 // into a register using three instructions
John Thompson1deeb9f2010-06-24 22:44:13 +0000847 break;
848 case 'm': // Memory operand. Note that on PowerPC targets, m can
849 // include addresses that update the base register. It
850 // is therefore only safe to use `m' in an asm statement
851 // if that asm statement accesses the operand exactly once.
852 // The asm statement must also use `%U<opno>' as a
Sebastian Redl097ce222010-08-17 22:42:34 +0000853 // placeholder for the "update" flag in the corresponding
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000854 // load or store instruction. For example:
John Thompson1deeb9f2010-06-24 22:44:13 +0000855 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000856 // is correct but:
John Thompson1deeb9f2010-06-24 22:44:13 +0000857 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
858 // is not. Use es rather than m if you don't want the base
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000859 // register to be updated.
860 case 'e':
John Thompsone0a39472010-06-25 00:02:05 +0000861 if (Name[1] != 's')
862 return false;
Sebastian Redl097ce222010-08-17 22:42:34 +0000863 // es: A "stable" memory operand; that is, one which does not
John Thompson1deeb9f2010-06-24 22:44:13 +0000864 // include any automodification of the base register. Unlike
865 // `m', this constraint can be used in asm statements that
866 // might access the operand several times, or that might not
John Thompsone0a39472010-06-25 00:02:05 +0000867 // access it at all.
John Thompson1deeb9f2010-06-24 22:44:13 +0000868 Info.setAllowsMemory();
John Thompsone0a39472010-06-25 00:02:05 +0000869 Name++; // Skip over 'e'.
John Thompson1deeb9f2010-06-24 22:44:13 +0000870 break;
871 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000872 // usually better to use `m' or `es' in asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000873 case 'Z': // Memory operand that is an indexed or indirect from a
874 // register (it is usually better to use `m' or `es' in
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000875 // asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000876 Info.setAllowsMemory();
877 Info.setAllowsRegister();
878 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000879 case 'R': // AIX TOC entry
John Thompson1deeb9f2010-06-24 22:44:13 +0000880 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000881 // register (`p' is preferable for asm statements)
882 case 'S': // Constant suitable as a 64-bit mask operand
883 case 'T': // Constant suitable as a 32-bit mask operand
884 case 'U': // System V Release 4 small data area reference
John Thompson1deeb9f2010-06-24 22:44:13 +0000885 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000886 // instructions
887 case 'W': // Vector constant that does not require memory
888 case 'j': // Vector constant that is all zeros.
John Thompson1deeb9f2010-06-24 22:44:13 +0000889 break;
890 // End FIXME.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000891 }
John Thompson1deeb9f2010-06-24 22:44:13 +0000892 return true;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000893 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700894 std::string convertConstraint(const char *&Constraint) const override {
895 std::string R;
896 switch (*Constraint) {
897 case 'e':
898 case 'w':
899 // Two-character constraint; add "^" hint for later parsing.
900 R = std::string("^") + std::string(Constraint, 2);
901 Constraint++;
902 break;
903 default:
904 return TargetInfo::convertConstraint(Constraint);
905 }
906 return R;
907 }
908 const char *getClobbers() const override {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000909 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000910 }
Stephen Hines651f13c2014-04-23 16:59:28 -0700911 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000912 if (RegNo == 0) return 3;
913 if (RegNo == 1) return 4;
914 return -1;
915 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000916};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000917
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000918const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000919#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000920#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000921 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +0000922#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000923};
Anton Korobeynikove7772382009-05-03 13:42:53 +0000924
Stephen Hines176edba2014-12-01 14:53:08 -0800925/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher16543202013-10-16 21:19:26 +0000926/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +0000927bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher16543202013-10-16 21:19:26 +0000928 DiagnosticsEngine &Diags) {
Eric Christopher16543202013-10-16 21:19:26 +0000929 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
930 // Ignore disabled features.
931 if (Features[i][0] == '-')
932 continue;
933
934 StringRef Feature = StringRef(Features[i]).substr(1);
935
936 if (Feature == "vsx") {
937 HasVSX = true;
938 continue;
939 }
940
Stephen Hines176edba2014-12-01 14:53:08 -0800941 if (Feature == "power8-vector") {
942 HasP8Vector = true;
943 continue;
944 }
945
Eric Christopher16543202013-10-16 21:19:26 +0000946 // TODO: Finish this list and add an assert that we've handled them
947 // all.
948 }
949
950 return true;
951}
Anton Korobeynikove7772382009-05-03 13:42:53 +0000952
Chris Lattnerbef1d722009-03-02 22:27:17 +0000953/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
954/// #defines that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000955void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000956 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000957 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000958 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000959 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000960 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerf8030412010-02-16 18:14:57 +0000961 Builder.defineMacro("__powerpc__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000962 Builder.defineMacro("__POWERPC__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000963 if (PointerWidth == 64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000964 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerf8030412010-02-16 18:14:57 +0000965 Builder.defineMacro("__powerpc64__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000966 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000967 Builder.defineMacro("__PPC64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000968 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000969
Chris Lattnerbef1d722009-03-02 22:27:17 +0000970 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000971 if (getTriple().getArch() == llvm::Triple::ppc64le) {
972 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000973 } else {
974 if (getTriple().getOS() != llvm::Triple::NetBSD &&
975 getTriple().getOS() != llvm::Triple::OpenBSD)
976 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000977 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000978
Stephen Hines176edba2014-12-01 14:53:08 -0800979 // ABI options.
980 if (ABI == "elfv1")
981 Builder.defineMacro("_CALL_ELF", "1");
982 if (ABI == "elfv2")
983 Builder.defineMacro("_CALL_ELF", "2");
984
Chris Lattnerbef1d722009-03-02 22:27:17 +0000985 // Subtarget options.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000986 Builder.defineMacro("__NATURAL_ALIGNMENT__");
987 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000988
Chris Lattnerbef1d722009-03-02 22:27:17 +0000989 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +0000990 if (LongDoubleWidth == 128)
991 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000992
John Thompsoned7bdbc2009-11-19 17:18:50 +0000993 if (Opts.AltiVec) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000994 Builder.defineMacro("__VEC__", "10206");
995 Builder.defineMacro("__ALTIVEC__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000996 }
Hal Finkel02a84272012-06-11 22:35:19 +0000997
998 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000999 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1000 .Case("440", ArchDefineName)
1001 .Case("450", ArchDefineName | ArchDefine440)
1002 .Case("601", ArchDefineName)
1003 .Case("602", ArchDefineName | ArchDefinePpcgr)
1004 .Case("603", ArchDefineName | ArchDefinePpcgr)
1005 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1006 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1007 .Case("604", ArchDefineName | ArchDefinePpcgr)
1008 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1009 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +00001010 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001011 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1012 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1013 .Case("750", ArchDefineName | ArchDefinePpcgr)
1014 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1015 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001016 .Case("a2", ArchDefineA2)
1017 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +00001018 .Case("pwr3", ArchDefinePpcgr)
1019 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1020 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
Hal Finkel39d5fa12012-07-03 16:51:04 +00001021 | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001022 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1023 | ArchDefinePpcgr | ArchDefinePpcsq)
1024 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1025 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1027 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1028 | ArchDefinePpcsq)
1029 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1030 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001031 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1033 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1034 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt2821e182013-02-01 20:23:10 +00001035 .Case("power3", ArchDefinePpcgr)
1036 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1037 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1038 | ArchDefinePpcsq)
1039 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1040 | ArchDefinePpcgr | ArchDefinePpcsq)
1041 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1042 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1044 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1045 | ArchDefinePpcsq)
1046 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1047 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001048 | ArchDefinePpcgr | ArchDefinePpcsq)
1049 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1050 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1051 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001052 .Default(ArchDefineNone);
1053
1054 if (defs & ArchDefineName)
1055 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1056 if (defs & ArchDefinePpcgr)
1057 Builder.defineMacro("_ARCH_PPCGR");
1058 if (defs & ArchDefinePpcsq)
1059 Builder.defineMacro("_ARCH_PPCSQ");
1060 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +00001061 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +00001062 if (defs & ArchDefine603)
1063 Builder.defineMacro("_ARCH_603");
1064 if (defs & ArchDefine604)
1065 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +00001066 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001067 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +00001068 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +00001069 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +00001070 if (defs & ArchDefinePwr5x)
1071 Builder.defineMacro("_ARCH_PWR5X");
1072 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +00001073 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +00001074 if (defs & ArchDefinePwr6x)
1075 Builder.defineMacro("_ARCH_PWR6X");
1076 if (defs & ArchDefinePwr7)
1077 Builder.defineMacro("_ARCH_PWR7");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001078 if (defs & ArchDefinePwr8)
1079 Builder.defineMacro("_ARCH_PWR8");
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001080 if (defs & ArchDefineA2)
1081 Builder.defineMacro("_ARCH_A2");
1082 if (defs & ArchDefineA2q) {
1083 Builder.defineMacro("_ARCH_A2Q");
1084 Builder.defineMacro("_ARCH_QP");
Hal Finkel02a84272012-06-11 22:35:19 +00001085 }
Hal Finkel5ccd3d02013-02-01 05:53:33 +00001086
1087 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1088 Builder.defineMacro("__bg__");
1089 Builder.defineMacro("__THW_BLUEGENE__");
1090 Builder.defineMacro("__bgq__");
1091 Builder.defineMacro("__TOS_BGQ__");
1092 }
Bill Schmidt2821e182013-02-01 20:23:10 +00001093
Eric Christopher16543202013-10-16 21:19:26 +00001094 if (HasVSX)
1095 Builder.defineMacro("__VSX__");
Stephen Hines176edba2014-12-01 14:53:08 -08001096 if (HasP8Vector)
1097 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher16543202013-10-16 21:19:26 +00001098
Bill Schmidt2821e182013-02-01 20:23:10 +00001099 // FIXME: The following are not yet generated here by Clang, but are
1100 // generated by GCC:
1101 //
1102 // _SOFT_FLOAT_
1103 // __RECIP_PRECISION__
1104 // __APPLE_ALTIVEC__
Bill Schmidt2821e182013-02-01 20:23:10 +00001105 // __RECIP__
1106 // __RECIPF__
1107 // __RSQRTE__
1108 // __RSQRTEF__
1109 // _SOFT_DOUBLE_
1110 // __NO_LWSYNC__
1111 // __HAVE_BSWAP__
1112 // __LONGDOUBLE128
1113 // __CMODEL_MEDIUM__
1114 // __CMODEL_LARGE__
1115 // _CALL_SYSV
1116 // _CALL_DARWIN
1117 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001118}
1119
1120void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1121 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1122 .Case("7400", true)
1123 .Case("g4", true)
1124 .Case("7450", true)
1125 .Case("g4+", true)
1126 .Case("970", true)
1127 .Case("g5", true)
1128 .Case("pwr6", true)
1129 .Case("pwr7", true)
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001130 .Case("pwr8", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001131 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001132 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001133 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001134
1135 Features["qpx"] = (CPU == "a2q");
Stephen Hines176edba2014-12-01 14:53:08 -08001136
1137 if (!ABI.empty())
1138 Features[ABI] = true;
Bill Schmidt199402b2013-02-01 02:14:03 +00001139}
1140
Douglas Gregore727d212012-01-30 06:38:25 +00001141bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Stephen Hines176edba2014-12-01 14:53:08 -08001142 return llvm::StringSwitch<bool>(Feature)
1143 .Case("powerpc", true)
1144 .Case("vsx", HasVSX)
1145 .Case("power8-vector", HasP8Vector)
1146 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00001147}
Chris Lattner9fd73612008-04-21 18:56:49 +00001148
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001149const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattner14d2bb72009-09-16 05:05:27 +00001150 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1151 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1152 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1153 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1154 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1155 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1156 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1157 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001158 "mq", "lr", "ctr", "ap",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001159 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001160 "xer",
Chris Lattner14d2bb72009-09-16 05:05:27 +00001161 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1162 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1163 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1164 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001165 "vrsave", "vscr",
1166 "spe_acc", "spefscr",
1167 "sfp"
1168};
Chris Lattner4b009652007-07-25 00:24:17 +00001169
Anton Korobeynikove7772382009-05-03 13:42:53 +00001170void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001171 unsigned &NumNames) const {
1172 Names = GCCRegNames;
1173 NumNames = llvm::array_lengthof(GCCRegNames);
1174}
Chris Lattner4b009652007-07-25 00:24:17 +00001175
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001176const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1177 // While some of these aliases do map to different registers
1178 // they still share the same register name.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001179 { { "0" }, "r0" },
1180 { { "1"}, "r1" },
1181 { { "2" }, "r2" },
1182 { { "3" }, "r3" },
1183 { { "4" }, "r4" },
1184 { { "5" }, "r5" },
1185 { { "6" }, "r6" },
1186 { { "7" }, "r7" },
1187 { { "8" }, "r8" },
1188 { { "9" }, "r9" },
1189 { { "10" }, "r10" },
1190 { { "11" }, "r11" },
1191 { { "12" }, "r12" },
1192 { { "13" }, "r13" },
1193 { { "14" }, "r14" },
1194 { { "15" }, "r15" },
1195 { { "16" }, "r16" },
1196 { { "17" }, "r17" },
1197 { { "18" }, "r18" },
1198 { { "19" }, "r19" },
1199 { { "20" }, "r20" },
1200 { { "21" }, "r21" },
1201 { { "22" }, "r22" },
1202 { { "23" }, "r23" },
1203 { { "24" }, "r24" },
1204 { { "25" }, "r25" },
1205 { { "26" }, "r26" },
1206 { { "27" }, "r27" },
1207 { { "28" }, "r28" },
1208 { { "29" }, "r29" },
1209 { { "30" }, "r30" },
1210 { { "31" }, "r31" },
1211 { { "fr0" }, "f0" },
1212 { { "fr1" }, "f1" },
1213 { { "fr2" }, "f2" },
1214 { { "fr3" }, "f3" },
1215 { { "fr4" }, "f4" },
1216 { { "fr5" }, "f5" },
1217 { { "fr6" }, "f6" },
1218 { { "fr7" }, "f7" },
1219 { { "fr8" }, "f8" },
1220 { { "fr9" }, "f9" },
Mike Stump369c21c2009-09-17 21:15:00 +00001221 { { "fr10" }, "f10" },
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001222 { { "fr11" }, "f11" },
1223 { { "fr12" }, "f12" },
1224 { { "fr13" }, "f13" },
1225 { { "fr14" }, "f14" },
1226 { { "fr15" }, "f15" },
1227 { { "fr16" }, "f16" },
1228 { { "fr17" }, "f17" },
1229 { { "fr18" }, "f18" },
1230 { { "fr19" }, "f19" },
1231 { { "fr20" }, "f20" },
1232 { { "fr21" }, "f21" },
1233 { { "fr22" }, "f22" },
1234 { { "fr23" }, "f23" },
1235 { { "fr24" }, "f24" },
1236 { { "fr25" }, "f25" },
1237 { { "fr26" }, "f26" },
1238 { { "fr27" }, "f27" },
1239 { { "fr28" }, "f28" },
1240 { { "fr29" }, "f29" },
1241 { { "fr30" }, "f30" },
1242 { { "fr31" }, "f31" },
1243 { { "cc" }, "cr0" },
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001244};
1245
Anton Korobeynikove7772382009-05-03 13:42:53 +00001246void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001247 unsigned &NumAliases) const {
1248 Aliases = GCCRegAliases;
1249 NumAliases = llvm::array_lengthof(GCCRegAliases);
1250}
1251} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00001252
1253namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001254class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001255public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001256 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07001257 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerf8030412010-02-16 18:14:57 +00001258
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001259 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001260 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001261 case llvm::Triple::FreeBSD:
1262 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001263 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001264 PtrDiffType = SignedInt;
1265 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001266 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001267 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001268 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001269 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001270
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001271 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1272 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001273 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001274 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001275
1276 // PPC32 supports atomics up to 4 bytes.
1277 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001278 }
1279
Stephen Hines651f13c2014-04-23 16:59:28 -07001280 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001281 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001282 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman2b161652008-08-21 00:13:15 +00001283 }
Chris Lattner4b009652007-07-25 00:24:17 +00001284};
1285} // end anonymous namespace.
1286
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001287// Note: ABI differences may eventually require us to have a separate
1288// TargetInfo for little endian.
Chris Lattner4b009652007-07-25 00:24:17 +00001289namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001290class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001291public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001292 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00001293 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman38e31802009-07-01 03:36:11 +00001294 IntMaxType = SignedLong;
Eli Friedman38e31802009-07-01 03:36:11 +00001295 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001296
Stephen Hines176edba2014-12-01 14:53:08 -08001297 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1298 DescriptionString = "e-m:e-i64:64-n32:64";
1299 ABI = "elfv2";
1300 } else {
1301 DescriptionString = "E-m:e-i64:64-n32:64";
1302 ABI = "elfv1";
1303 }
1304
1305 switch (getTriple().getOS()) {
1306 case llvm::Triple::FreeBSD:
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001307 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001308 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Stephen Hines176edba2014-12-01 14:53:08 -08001309 break;
1310 case llvm::Triple::NetBSD:
1311 IntMaxType = SignedLongLong;
1312 Int64Type = SignedLongLong;
1313 break;
1314 default:
1315 break;
1316 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001317
1318 // PPC64 supports atomics up to 8 bytes.
1319 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnere5fde952008-05-09 06:17:04 +00001320 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001321 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001322 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001323 }
Stephen Hines176edba2014-12-01 14:53:08 -08001324 // PPC64 Linux-specifc ABI options.
1325 bool setABI(const std::string &Name) override {
1326 if (Name == "elfv1" || Name == "elfv2") {
1327 ABI = Name;
1328 return true;
1329 }
1330 return false;
1331 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +00001332};
1333} // end anonymous namespace.
1334
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001335
1336namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001337class DarwinPPC32TargetInfo :
1338 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001339public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001340 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1341 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001342 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001343 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Stephen Hines176edba2014-12-01 14:53:08 -08001344 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001345 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001346 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001347 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001348 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001349 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00001350 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001351 }
1352};
1353
1354class DarwinPPC64TargetInfo :
1355 public DarwinTargetInfo<PPC64TargetInfo> {
1356public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001357 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1358 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001359 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001360 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07001361 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar6501cab2010-05-30 00:07:30 +00001362 }
1363};
1364} // end anonymous namespace.
1365
Chris Lattner4b009652007-07-25 00:24:17 +00001366namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001367 static const unsigned NVPTXAddrSpaceMap[] = {
1368 1, // opencl_global
1369 3, // opencl_local
1370 4, // opencl_constant
1371 1, // cuda_device
1372 4, // cuda_constant
1373 3, // cuda_shared
Justin Holewinski25bedca2011-10-03 17:28:37 +00001374 };
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001375 class NVPTXTargetInfo : public TargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001376 static const char * const GCCRegNames[];
1377 static const Builtin::Info BuiltinInfo[];
1378 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001379 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001380 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +00001381 TLSSupported = false;
1382 LongWidth = LongAlign = 64;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001383 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001384 UseAddrSpaceMapMangling = true;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001385 // Define available target features
Justin Holewinski2c585b92012-05-24 17:43:12 +00001386 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001387 NoAsmVariants = true;
Justin Holewinski285dc652011-04-20 19:34:15 +00001388 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001389 void getTargetDefines(const LangOptions &Opts,
1390 MacroBuilder &Builder) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001391 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001392 Builder.defineMacro("__NVPTX__");
Justin Holewinski285dc652011-04-20 19:34:15 +00001393 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001394 void getTargetBuiltins(const Builtin::Info *&Records,
1395 unsigned &NumRecords) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001396 Records = BuiltinInfo;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001397 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Justin Holewinski285dc652011-04-20 19:34:15 +00001398 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001399 bool hasFeature(StringRef Feature) const override {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001400 return Feature == "ptx" || Feature == "nvptx";
Douglas Gregore727d212012-01-30 06:38:25 +00001401 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001402
1403 void getGCCRegNames(const char * const *&Names,
1404 unsigned &NumNames) const override;
1405 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1406 unsigned &NumAliases) const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001407 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001408 Aliases = nullptr;
Justin Holewinski285dc652011-04-20 19:34:15 +00001409 NumAliases = 0;
1410 }
Stephen Hines176edba2014-12-01 14:53:08 -08001411 bool
1412 validateAsmConstraint(const char *&Name,
1413 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001414 switch (*Name) {
1415 default: return false;
1416 case 'c':
1417 case 'h':
1418 case 'r':
1419 case 'l':
1420 case 'f':
1421 case 'd':
1422 Info.setAllowsRegister();
1423 return true;
1424 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001425 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001426 const char *getClobbers() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001427 // FIXME: Is this really right?
1428 return "";
1429 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001430 BuiltinVaListKind getBuiltinVaListKind() const override {
Justin Holewinski285dc652011-04-20 19:34:15 +00001431 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001432 return TargetInfo::CharPtrBuiltinVaList;
Justin Holewinski285dc652011-04-20 19:34:15 +00001433 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001434 bool setCPU(const std::string &Name) override {
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001435 bool Valid = llvm::StringSwitch<bool>(Name)
1436 .Case("sm_20", true)
1437 .Case("sm_21", true)
1438 .Case("sm_30", true)
1439 .Case("sm_35", true)
1440 .Default(false);
1441
1442 return Valid;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001443 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001444 };
1445
Justin Holewinski2c585b92012-05-24 17:43:12 +00001446 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001447#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +00001448#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001449 ALL_LANGUAGES },
Justin Holewinski2c585b92012-05-24 17:43:12 +00001450#include "clang/Basic/BuiltinsNVPTX.def"
Justin Holewinski285dc652011-04-20 19:34:15 +00001451 };
1452
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001453 const char * const NVPTXTargetInfo::GCCRegNames[] = {
Justin Holewinski285dc652011-04-20 19:34:15 +00001454 "r0"
1455 };
1456
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001457 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
Justin Holewinski285dc652011-04-20 19:34:15 +00001458 unsigned &NumNames) const {
1459 Names = GCCRegNames;
1460 NumNames = llvm::array_lengthof(GCCRegNames);
1461 }
1462
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001463 class NVPTX32TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001464 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001465 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001466 PointerWidth = PointerAlign = 32;
Stephen Hines176edba2014-12-01 14:53:08 -08001467 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1468 IntPtrType = TargetInfo::SignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07001469 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001470 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001471 };
1472
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001473 class NVPTX64TargetInfo : public NVPTXTargetInfo {
Justin Holewinski285dc652011-04-20 19:34:15 +00001474 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001475 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Justin Holewinski285dc652011-04-20 19:34:15 +00001476 PointerWidth = PointerAlign = 64;
Stephen Hines176edba2014-12-01 14:53:08 -08001477 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1478 IntPtrType = TargetInfo::SignedLongLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07001479 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001480 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001481 };
1482}
1483
1484namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001485
1486static const unsigned R600AddrSpaceMap[] = {
1487 1, // opencl_global
1488 3, // opencl_local
1489 2, // opencl_constant
1490 1, // cuda_device
1491 2, // cuda_constant
1492 3 // cuda_shared
1493};
1494
Stephen Hines176edba2014-12-01 14:53:08 -08001495// If you edit the description strings, make sure you update
1496// getPointerWidthV().
1497
Tom Stellardfd075912013-03-04 17:40:53 +00001498static const char *DescriptionStringR600 =
Stephen Hines651f13c2014-04-23 16:59:28 -07001499 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1500 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001501
1502static const char *DescriptionStringR600DoubleOps =
Stephen Hines651f13c2014-04-23 16:59:28 -07001503 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1504 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001505
1506static const char *DescriptionStringSI =
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001507 "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 -07001508 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1509 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardfd075912013-03-04 17:40:53 +00001510
Eli Friedman6505a292012-10-12 23:32:00 +00001511class R600TargetInfo : public TargetInfo {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001512 static const Builtin::Info BuiltinInfo[];
1513
Tom Stellardfd075912013-03-04 17:40:53 +00001514 /// \brief The GPU profiles supported by the R600 target.
1515 enum GPUKind {
1516 GK_NONE,
1517 GK_R600,
1518 GK_R600_DOUBLE_OPS,
1519 GK_R700,
1520 GK_R700_DOUBLE_OPS,
1521 GK_EVERGREEN,
1522 GK_EVERGREEN_DOUBLE_OPS,
1523 GK_NORTHERN_ISLANDS,
1524 GK_CAYMAN,
Tom Stellard42317042013-10-29 16:38:29 +00001525 GK_SOUTHERN_ISLANDS,
1526 GK_SEA_ISLANDS
Tom Stellardfd075912013-03-04 17:40:53 +00001527 } GPU;
1528
Eli Friedman6505a292012-10-12 23:32:00 +00001529public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001530 R600TargetInfo(const llvm::Triple &Triple)
1531 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardfd075912013-03-04 17:40:53 +00001532 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001533 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00001534 UseAddrSpaceMapMangling = true;
Eli Friedman6505a292012-10-12 23:32:00 +00001535 }
1536
Stephen Hines176edba2014-12-01 14:53:08 -08001537 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1538 if (GPU <= GK_CAYMAN)
1539 return 32;
1540
1541 switch(AddrSpace) {
1542 default:
1543 return 64;
1544 case 0:
1545 case 3:
1546 case 5:
1547 return 32;
1548 }
1549 }
1550
Stephen Hines651f13c2014-04-23 16:59:28 -07001551 const char * getClobbers() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001552 return "";
1553 }
1554
Stephen Hines651f13c2014-04-23 16:59:28 -07001555 void getGCCRegNames(const char * const *&Names,
1556 unsigned &numNames) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001557 Names = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001558 numNames = 0;
1559 }
1560
Stephen Hines651f13c2014-04-23 16:59:28 -07001561 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1562 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001563 Aliases = nullptr;
Eli Friedman6505a292012-10-12 23:32:00 +00001564 NumAliases = 0;
1565 }
1566
Stephen Hines651f13c2014-04-23 16:59:28 -07001567 bool validateAsmConstraint(const char *&Name,
1568 TargetInfo::ConstraintInfo &info) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001569 return true;
1570 }
1571
Stephen Hines651f13c2014-04-23 16:59:28 -07001572 void getTargetBuiltins(const Builtin::Info *&Records,
1573 unsigned &NumRecords) const override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001574 Records = BuiltinInfo;
1575 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedman6505a292012-10-12 23:32:00 +00001576 }
1577
Stephen Hines651f13c2014-04-23 16:59:28 -07001578 void getTargetDefines(const LangOptions &Opts,
1579 MacroBuilder &Builder) const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001580 Builder.defineMacro("__R600__");
1581 }
1582
Stephen Hines651f13c2014-04-23 16:59:28 -07001583 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedman6505a292012-10-12 23:32:00 +00001584 return TargetInfo::CharPtrBuiltinVaList;
1585 }
1586
Stephen Hines651f13c2014-04-23 16:59:28 -07001587 bool setCPU(const std::string &Name) override {
Tom Stellardfd075912013-03-04 17:40:53 +00001588 GPU = llvm::StringSwitch<GPUKind>(Name)
1589 .Case("r600" , GK_R600)
1590 .Case("rv610", GK_R600)
1591 .Case("rv620", GK_R600)
1592 .Case("rv630", GK_R600)
1593 .Case("rv635", GK_R600)
1594 .Case("rs780", GK_R600)
1595 .Case("rs880", GK_R600)
1596 .Case("rv670", GK_R600_DOUBLE_OPS)
1597 .Case("rv710", GK_R700)
1598 .Case("rv730", GK_R700)
1599 .Case("rv740", GK_R700_DOUBLE_OPS)
1600 .Case("rv770", GK_R700_DOUBLE_OPS)
1601 .Case("palm", GK_EVERGREEN)
1602 .Case("cedar", GK_EVERGREEN)
1603 .Case("sumo", GK_EVERGREEN)
1604 .Case("sumo2", GK_EVERGREEN)
1605 .Case("redwood", GK_EVERGREEN)
1606 .Case("juniper", GK_EVERGREEN)
1607 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1608 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1609 .Case("barts", GK_NORTHERN_ISLANDS)
1610 .Case("turks", GK_NORTHERN_ISLANDS)
1611 .Case("caicos", GK_NORTHERN_ISLANDS)
1612 .Case("cayman", GK_CAYMAN)
1613 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001614 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001615 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1616 .Case("verde", GK_SOUTHERN_ISLANDS)
1617 .Case("oland", GK_SOUTHERN_ISLANDS)
Stephen Hines176edba2014-12-01 14:53:08 -08001618 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard42317042013-10-29 16:38:29 +00001619 .Case("bonaire", GK_SEA_ISLANDS)
1620 .Case("kabini", GK_SEA_ISLANDS)
1621 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard0de6bc82013-11-14 23:45:53 +00001622 .Case("hawaii", GK_SEA_ISLANDS)
Stephen Hines176edba2014-12-01 14:53:08 -08001623 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001624 .Default(GK_NONE);
1625
1626 if (GPU == GK_NONE) {
1627 return false;
1628 }
1629
1630 // Set the correct data layout
1631 switch (GPU) {
1632 case GK_NONE:
1633 case GK_R600:
1634 case GK_R700:
1635 case GK_EVERGREEN:
1636 case GK_NORTHERN_ISLANDS:
1637 DescriptionString = DescriptionStringR600;
1638 break;
1639 case GK_R600_DOUBLE_OPS:
1640 case GK_R700_DOUBLE_OPS:
1641 case GK_EVERGREEN_DOUBLE_OPS:
1642 case GK_CAYMAN:
1643 DescriptionString = DescriptionStringR600DoubleOps;
1644 break;
1645 case GK_SOUTHERN_ISLANDS:
Tom Stellard42317042013-10-29 16:38:29 +00001646 case GK_SEA_ISLANDS:
Tom Stellardfd075912013-03-04 17:40:53 +00001647 DescriptionString = DescriptionStringSI;
1648 break;
1649 }
1650
1651 return true;
1652 }
Eli Friedman6505a292012-10-12 23:32:00 +00001653};
1654
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001655const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1656#define BUILTIN(ID, TYPE, ATTRS) \
1657 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1658#include "clang/Basic/BuiltinsR600.def"
1659};
1660
Eli Friedman6505a292012-10-12 23:32:00 +00001661} // end anonymous namespace
1662
1663namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001664// Namespace for x86 abstract base class
1665const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001666#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001667#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001668 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +00001669#include "clang/Basic/BuiltinsX86.def"
Eli Friedman872996c2008-08-20 02:34:37 +00001670};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001671
Nuno Lopesad1010d2009-12-23 17:49:57 +00001672static const char* const GCCRegNames[] = {
Eli Friedman872996c2008-08-20 02:34:37 +00001673 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1674 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001675 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman872996c2008-08-20 02:34:37 +00001676 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1677 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1678 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001679 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001680 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1681 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman872996c2008-08-20 02:34:37 +00001682};
1683
Eric Christophercfd323d2011-06-21 00:05:20 +00001684const TargetInfo::AddlRegName AddlRegNames[] = {
1685 { { "al", "ah", "eax", "rax" }, 0 },
1686 { { "bl", "bh", "ebx", "rbx" }, 3 },
1687 { { "cl", "ch", "ecx", "rcx" }, 2 },
1688 { { "dl", "dh", "edx", "rdx" }, 1 },
1689 { { "esi", "rsi" }, 4 },
1690 { { "edi", "rdi" }, 5 },
1691 { { "esp", "rsp" }, 7 },
1692 { { "ebp", "rbp" }, 6 },
Eli Friedman872996c2008-08-20 02:34:37 +00001693};
1694
1695// X86 target abstract base class; x86-32 and x86-64 are very close, so
1696// most of the implementation can be shared.
1697class X86TargetInfo : public TargetInfo {
Chris Lattner715fe4c2009-03-02 22:40:39 +00001698 enum X86SSEEnum {
Craig Topperb7a95d22013-08-21 03:59:22 +00001699 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner715fe4c2009-03-02 22:40:39 +00001700 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001701 enum MMX3DNowEnum {
1702 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1703 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001704 enum XOPEnum {
1705 NoXOP,
1706 SSE4A,
1707 FMA4,
1708 XOP
1709 } XOPLevel;
Anders Carlssone5e222f2010-01-27 03:47:49 +00001710
Eric Christopher6c4e7872010-04-02 23:50:19 +00001711 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001712 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001713 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001714 bool HasRDRND;
Stephen Hines176edba2014-12-01 14:53:08 -08001715 bool HasFSGSBASE;
Craig Topper31ceea02011-12-25 05:06:45 +00001716 bool HasBMI;
1717 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001718 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001719 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001720 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001721 bool HasRDSEED;
Stephen Hines176edba2014-12-01 14:53:08 -08001722 bool HasADX;
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00001723 bool HasTBM;
Craig Topper2ae95072012-06-03 21:46:30 +00001724 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001725 bool HasF16C;
Stephen Hines176edba2014-12-01 14:53:08 -08001726 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1727 HasAVX512VL;
Ben Langmuirb83f5a72013-09-19 13:22:04 +00001728 bool HasSHA;
Nick Lewyckyaf945462013-10-05 20:14:27 +00001729 bool HasCX16;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001730
Chandler Carruth499d9722011-09-28 08:55:34 +00001731 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1732 ///
1733 /// Each enumeration represents a particular CPU supported by Clang. These
1734 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1735 enum CPUKind {
1736 CK_Generic,
1737
1738 /// \name i386
1739 /// i386-generation processors.
1740 //@{
1741 CK_i386,
1742 //@}
1743
1744 /// \name i486
1745 /// i486-generation processors.
1746 //@{
1747 CK_i486,
1748 CK_WinChipC6,
1749 CK_WinChip2,
1750 CK_C3,
1751 //@}
1752
1753 /// \name i586
1754 /// i586-generation processors, P5 microarchitecture based.
1755 //@{
1756 CK_i586,
1757 CK_Pentium,
1758 CK_PentiumMMX,
1759 //@}
1760
1761 /// \name i686
1762 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1763 //@{
1764 CK_i686,
1765 CK_PentiumPro,
1766 CK_Pentium2,
1767 CK_Pentium3,
1768 CK_Pentium3M,
1769 CK_PentiumM,
1770 CK_C3_2,
1771
1772 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1773 /// Clang however has some logic to suport this.
1774 // FIXME: Warn, deprecate, and potentially remove this.
1775 CK_Yonah,
1776 //@}
1777
1778 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001779 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001780 //@{
1781 CK_Pentium4,
1782 CK_Pentium4M,
1783 CK_Prescott,
1784 CK_Nocona,
1785 //@}
1786
1787 /// \name Core
1788 /// Core microarchitecture based processors.
1789 //@{
1790 CK_Core2,
1791
1792 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1793 /// codename which GCC no longer accepts as an option to -march, but Clang
1794 /// has some logic for recognizing it.
1795 // FIXME: Warn, deprecate, and potentially remove this.
1796 CK_Penryn,
1797 //@}
1798
1799 /// \name Atom
1800 /// Atom processors
1801 //@{
1802 CK_Atom,
Preston Gurdc57ea682013-09-13 19:27:17 +00001803 CK_Silvermont,
Chandler Carruth499d9722011-09-28 08:55:34 +00001804 //@}
1805
1806 /// \name Nehalem
1807 /// Nehalem microarchitecture based processors.
1808 //@{
1809 CK_Corei7,
1810 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001811 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001812 CK_CoreAVX2,
Stephen Hines176edba2014-12-01 14:53:08 -08001813 CK_Broadwell,
Chandler Carruth499d9722011-09-28 08:55:34 +00001814 //@}
1815
Craig Topper10c2c682013-08-20 07:09:39 +00001816 /// \name Knights Landing
1817 /// Knights Landing processor.
1818 CK_KNL,
1819
Stephen Hines176edba2014-12-01 14:53:08 -08001820 /// \name Skylake Server
1821 /// Skylake server processor.
1822 CK_SKX,
1823
Chandler Carruth499d9722011-09-28 08:55:34 +00001824 /// \name K6
1825 /// K6 architecture processors.
1826 //@{
1827 CK_K6,
1828 CK_K6_2,
1829 CK_K6_3,
1830 //@}
1831
1832 /// \name K7
1833 /// K7 architecture processors.
1834 //@{
1835 CK_Athlon,
1836 CK_AthlonThunderbird,
1837 CK_Athlon4,
1838 CK_AthlonXP,
1839 CK_AthlonMP,
1840 //@}
1841
1842 /// \name K8
1843 /// K8 architecture processors.
1844 //@{
1845 CK_Athlon64,
1846 CK_Athlon64SSE3,
1847 CK_AthlonFX,
1848 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001849 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001850 CK_Opteron,
1851 CK_OpteronSSE3,
Roman Divackyf051cde2011-10-30 07:48:46 +00001852 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001853 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001854
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001855 /// \name Bobcat
1856 /// Bobcat architecture processors.
1857 //@{
1858 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00001859 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001860 //@}
1861
1862 /// \name Bulldozer
1863 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001864 //@{
1865 CK_BDVER1,
1866 CK_BDVER2,
Benjamin Kramera2420962013-11-04 10:29:51 +00001867 CK_BDVER3,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001868 CK_BDVER4,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001869 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001870
Chandler Carruth499d9722011-09-28 08:55:34 +00001871 /// This specification is deprecated and will be removed in the future.
1872 /// Users should prefer \see CK_K8.
1873 // FIXME: Warn on this when the CPU is set to it.
Stephen Hines176edba2014-12-01 14:53:08 -08001874 //@{
Chandler Carruth499d9722011-09-28 08:55:34 +00001875 CK_x86_64,
1876 //@}
1877
1878 /// \name Geode
1879 /// Geode processors.
1880 //@{
1881 CK_Geode
1882 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001883 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001884
Rafael Espindola5389b842013-08-21 21:59:03 +00001885 enum FPMathKind {
1886 FP_Default,
1887 FP_SSE,
1888 FP_387
1889 } FPMath;
1890
Eli Friedman872996c2008-08-20 02:34:37 +00001891public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001892 X86TargetInfo(const llvm::Triple &Triple)
1893 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001894 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Stephen Hines176edba2014-12-01 14:53:08 -08001895 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1896 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1897 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1898 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1899 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1900 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001901 BigEndian = false;
Eli Friedman872996c2008-08-20 02:34:37 +00001902 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +00001903 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001904 unsigned getFloatEvalMethod() const override {
Benjamin Kramerb4066692011-12-28 15:47:06 +00001905 // X87 evaluates with 80 bits "long double" precision.
1906 return SSELevel == NoSSE ? 2 : 0;
1907 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001908 void getTargetBuiltins(const Builtin::Info *&Records,
1909 unsigned &NumRecords) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001910 Records = BuiltinInfo;
1911 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +00001912 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001913 void getGCCRegNames(const char * const *&Names,
1914 unsigned &NumNames) const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001915 Names = GCCRegNames;
1916 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001917 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001918 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1919 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07001920 Aliases = nullptr;
Eric Christophercfd323d2011-06-21 00:05:20 +00001921 NumAliases = 0;
1922 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001923 void getGCCAddlRegNames(const AddlRegName *&Names,
1924 unsigned &NumNames) const override {
Eric Christophercfd323d2011-06-21 00:05:20 +00001925 Names = AddlRegNames;
1926 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00001927 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001928 bool validateAsmConstraint(const char *&Name,
Stephen Hines176edba2014-12-01 14:53:08 -08001929 TargetInfo::ConstraintInfo &info) const override;
1930
1931 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1932
1933 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1934
1935 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1936
Stephen Hines651f13c2014-04-23 16:59:28 -07001937 std::string convertConstraint(const char *&Constraint) const override;
1938 const char *getClobbers() const override {
Eli Friedman872996c2008-08-20 02:34:37 +00001939 return "~{dirflag},~{fpsr},~{flags}";
1940 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001941 void getTargetDefines(const LangOptions &Opts,
1942 MacroBuilder &Builder) const override;
Craig Topper319d81f2013-09-17 04:12:55 +00001943 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1944 bool Enabled);
1945 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1946 bool Enabled);
1947 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1948 bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07001949 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1950 StringRef Name, bool Enabled) const override {
Craig Topper85bfef62013-09-17 04:51:29 +00001951 setFeatureEnabledImpl(Features, Name, Enabled);
1952 }
1953 // This exists purely to cut down on the number of virtual calls in
1954 // getDefaultFeatures which calls this repeatedly.
1955 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1956 StringRef Name, bool Enabled);
Stephen Hines651f13c2014-04-23 16:59:28 -07001957 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1958 bool hasFeature(StringRef Feature) const override;
1959 bool handleTargetFeatures(std::vector<std::string> &Features,
1960 DiagnosticsEngine &Diags) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07001961 StringRef getABI() const override {
Derek Schuffbabaf312012-10-11 15:52:22 +00001962 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001963 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001964 else if (getTriple().getArch() == llvm::Triple::x86 &&
1965 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001966 return "no-mmx";
1967 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001968 }
Stephen Hines651f13c2014-04-23 16:59:28 -07001969 bool setCPU(const std::string &Name) override {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001970 CPU = llvm::StringSwitch<CPUKind>(Name)
1971 .Case("i386", CK_i386)
1972 .Case("i486", CK_i486)
1973 .Case("winchip-c6", CK_WinChipC6)
1974 .Case("winchip2", CK_WinChip2)
1975 .Case("c3", CK_C3)
1976 .Case("i586", CK_i586)
1977 .Case("pentium", CK_Pentium)
1978 .Case("pentium-mmx", CK_PentiumMMX)
1979 .Case("i686", CK_i686)
1980 .Case("pentiumpro", CK_PentiumPro)
1981 .Case("pentium2", CK_Pentium2)
1982 .Case("pentium3", CK_Pentium3)
1983 .Case("pentium3m", CK_Pentium3M)
1984 .Case("pentium-m", CK_PentiumM)
1985 .Case("c3-2", CK_C3_2)
1986 .Case("yonah", CK_Yonah)
1987 .Case("pentium4", CK_Pentium4)
1988 .Case("pentium4m", CK_Pentium4M)
1989 .Case("prescott", CK_Prescott)
1990 .Case("nocona", CK_Nocona)
1991 .Case("core2", CK_Core2)
1992 .Case("penryn", CK_Penryn)
1993 .Case("atom", CK_Atom)
Preston Gurdc57ea682013-09-13 19:27:17 +00001994 .Case("slm", CK_Silvermont)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001995 .Case("corei7", CK_Corei7)
1996 .Case("corei7-avx", CK_Corei7AVX)
1997 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001998 .Case("core-avx2", CK_CoreAVX2)
Stephen Hines176edba2014-12-01 14:53:08 -08001999 .Case("broadwell", CK_Broadwell)
Craig Topper10c2c682013-08-20 07:09:39 +00002000 .Case("knl", CK_KNL)
Stephen Hines176edba2014-12-01 14:53:08 -08002001 .Case("skx", CK_SKX)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002002 .Case("k6", CK_K6)
2003 .Case("k6-2", CK_K6_2)
2004 .Case("k6-3", CK_K6_3)
2005 .Case("athlon", CK_Athlon)
2006 .Case("athlon-tbird", CK_AthlonThunderbird)
2007 .Case("athlon-4", CK_Athlon4)
2008 .Case("athlon-xp", CK_AthlonXP)
2009 .Case("athlon-mp", CK_AthlonMP)
2010 .Case("athlon64", CK_Athlon64)
2011 .Case("athlon64-sse3", CK_Athlon64SSE3)
2012 .Case("athlon-fx", CK_AthlonFX)
2013 .Case("k8", CK_K8)
2014 .Case("k8-sse3", CK_K8SSE3)
2015 .Case("opteron", CK_Opteron)
2016 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divackyf051cde2011-10-30 07:48:46 +00002017 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002018 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00002019 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002020 .Case("bdver1", CK_BDVER1)
2021 .Case("bdver2", CK_BDVER2)
Benjamin Kramera2420962013-11-04 10:29:51 +00002022 .Case("bdver3", CK_BDVER3)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002023 .Case("bdver4", CK_BDVER4)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002024 .Case("x86-64", CK_x86_64)
2025 .Case("geode", CK_Geode)
2026 .Default(CK_Generic);
2027
Chandler Carruth26a39142011-09-28 09:45:08 +00002028 // Perform any per-CPU checks necessary to determine if this CPU is
2029 // acceptable.
2030 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2031 // invalid without explaining *why*.
2032 switch (CPU) {
2033 case CK_Generic:
2034 // No processor selected!
2035 return false;
2036
2037 case CK_i386:
2038 case CK_i486:
2039 case CK_WinChipC6:
2040 case CK_WinChip2:
2041 case CK_C3:
2042 case CK_i586:
2043 case CK_Pentium:
2044 case CK_PentiumMMX:
2045 case CK_i686:
2046 case CK_PentiumPro:
2047 case CK_Pentium2:
2048 case CK_Pentium3:
2049 case CK_Pentium3M:
2050 case CK_PentiumM:
2051 case CK_Yonah:
2052 case CK_C3_2:
2053 case CK_Pentium4:
2054 case CK_Pentium4M:
2055 case CK_Prescott:
2056 case CK_K6:
2057 case CK_K6_2:
2058 case CK_K6_3:
2059 case CK_Athlon:
2060 case CK_AthlonThunderbird:
2061 case CK_Athlon4:
2062 case CK_AthlonXP:
2063 case CK_AthlonMP:
2064 case CK_Geode:
2065 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00002066 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00002067 return false;
2068
2069 // Fallthrough
2070 case CK_Nocona:
2071 case CK_Core2:
2072 case CK_Penryn:
2073 case CK_Atom:
Preston Gurdc57ea682013-09-13 19:27:17 +00002074 case CK_Silvermont:
Chandler Carruth26a39142011-09-28 09:45:08 +00002075 case CK_Corei7:
2076 case CK_Corei7AVX:
2077 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002078 case CK_CoreAVX2:
Stephen Hines176edba2014-12-01 14:53:08 -08002079 case CK_Broadwell:
Craig Topper10c2c682013-08-20 07:09:39 +00002080 case CK_KNL:
Stephen Hines176edba2014-12-01 14:53:08 -08002081 case CK_SKX:
Chandler Carruth26a39142011-09-28 09:45:08 +00002082 case CK_Athlon64:
2083 case CK_Athlon64SSE3:
2084 case CK_AthlonFX:
2085 case CK_K8:
2086 case CK_K8SSE3:
2087 case CK_Opteron:
2088 case CK_OpteronSSE3:
Roman Divackyf051cde2011-10-30 07:48:46 +00002089 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002090 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00002091 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002092 case CK_BDVER1:
2093 case CK_BDVER2:
Benjamin Kramera2420962013-11-04 10:29:51 +00002094 case CK_BDVER3:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002095 case CK_BDVER4:
Chandler Carruth26a39142011-09-28 09:45:08 +00002096 case CK_x86_64:
2097 return true;
2098 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00002099 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002100 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002101
Stephen Hines651f13c2014-04-23 16:59:28 -07002102 bool setFPMath(StringRef Name) override;
Rafael Espindola5389b842013-08-21 21:59:03 +00002103
Stephen Hines651f13c2014-04-23 16:59:28 -07002104 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00002105 // We accept all non-ARM calling conventions
2106 return (CC == CC_X86ThisCall ||
2107 CC == CC_X86FastCall ||
Stephen Hines176edba2014-12-01 14:53:08 -08002108 CC == CC_X86StdCall ||
2109 CC == CC_X86VectorCall ||
2110 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00002111 CC == CC_X86Pascal ||
2112 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002113 }
2114
Stephen Hines651f13c2014-04-23 16:59:28 -07002115 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00002116 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002117 }
Chris Lattner4b009652007-07-25 00:24:17 +00002118};
Chris Lattner7d6220c2009-03-02 22:20:04 +00002119
Rafael Espindola5389b842013-08-21 21:59:03 +00002120bool X86TargetInfo::setFPMath(StringRef Name) {
2121 if (Name == "387") {
2122 FPMath = FP_387;
2123 return true;
2124 }
2125 if (Name == "sse") {
2126 FPMath = FP_SSE;
2127 return true;
2128 }
2129 return false;
2130}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002131
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002132void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar07181d72009-05-06 03:16:41 +00002133 // FIXME: This *really* should not be here.
2134
2135 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00002136 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper85bfef62013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar07181d72009-05-06 03:16:41 +00002138
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002139 switch (CPU) {
2140 case CK_Generic:
2141 case CK_i386:
2142 case CK_i486:
2143 case CK_i586:
2144 case CK_Pentium:
2145 case CK_i686:
2146 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002147 break;
2148 case CK_PentiumMMX:
2149 case CK_Pentium2:
Stephen Hines176edba2014-12-01 14:53:08 -08002150 case CK_K6:
2151 case CK_WinChipC6:
Craig Topper85bfef62013-09-17 04:51:29 +00002152 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002153 break;
2154 case CK_Pentium3:
2155 case CK_Pentium3M:
Stephen Hines176edba2014-12-01 14:53:08 -08002156 case CK_C3_2:
Craig Topper85bfef62013-09-17 04:51:29 +00002157 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002158 break;
2159 case CK_PentiumM:
2160 case CK_Pentium4:
2161 case CK_Pentium4M:
2162 case CK_x86_64:
Craig Topper85bfef62013-09-17 04:51:29 +00002163 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002164 break;
2165 case CK_Yonah:
2166 case CK_Prescott:
2167 case CK_Nocona:
Craig Topper85bfef62013-09-17 04:51:29 +00002168 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002169 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002170 break;
2171 case CK_Core2:
Stephen Hines176edba2014-12-01 14:53:08 -08002172 case CK_Atom:
Craig Topper85bfef62013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002174 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002175 break;
2176 case CK_Penryn:
Craig Topper85bfef62013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002178 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002179 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002180 case CK_SKX:
2181 setFeatureEnabledImpl(Features, "avx512f", true);
2182 setFeatureEnabledImpl(Features, "avx512cd", true);
2183 setFeatureEnabledImpl(Features, "avx512dq", true);
2184 setFeatureEnabledImpl(Features, "avx512bw", true);
2185 setFeatureEnabledImpl(Features, "avx512vl", true);
2186 // FALLTHROUGH
2187 case CK_Broadwell:
2188 setFeatureEnabledImpl(Features, "rdseed", true);
2189 setFeatureEnabledImpl(Features, "adx", true);
2190 // FALLTHROUGH
Craig Topper2b03bb02011-12-17 19:55:21 +00002191 case CK_CoreAVX2:
Craig Topper85bfef62013-09-17 04:51:29 +00002192 setFeatureEnabledImpl(Features, "avx2", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002193 setFeatureEnabledImpl(Features, "lzcnt", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002194 setFeatureEnabledImpl(Features, "bmi", true);
2195 setFeatureEnabledImpl(Features, "bmi2", true);
2196 setFeatureEnabledImpl(Features, "rtm", true);
2197 setFeatureEnabledImpl(Features, "fma", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002198 // FALLTHROUGH
2199 case CK_CoreAVXi:
2200 setFeatureEnabledImpl(Features, "rdrnd", true);
2201 setFeatureEnabledImpl(Features, "f16c", true);
2202 setFeatureEnabledImpl(Features, "fsgsbase", true);
2203 // FALLTHROUGH
2204 case CK_Corei7AVX:
2205 setFeatureEnabledImpl(Features, "avx", true);
2206 // FALLTHROUGH
2207 case CK_Silvermont:
2208 setFeatureEnabledImpl(Features, "aes", true);
2209 setFeatureEnabledImpl(Features, "pclmul", true);
2210 // FALLTHROUGH
2211 case CK_Corei7:
2212 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002213 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002214 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002215 case CK_KNL:
Craig Topper85bfef62013-09-17 04:51:29 +00002216 setFeatureEnabledImpl(Features, "avx512f", true);
2217 setFeatureEnabledImpl(Features, "avx512cd", true);
2218 setFeatureEnabledImpl(Features, "avx512er", true);
2219 setFeatureEnabledImpl(Features, "avx512pf", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002220 setFeatureEnabledImpl(Features, "rdseed", true);
2221 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002222 setFeatureEnabledImpl(Features, "lzcnt", true);
Craig Topper85bfef62013-09-17 04:51:29 +00002223 setFeatureEnabledImpl(Features, "bmi", true);
2224 setFeatureEnabledImpl(Features, "bmi2", true);
2225 setFeatureEnabledImpl(Features, "rtm", true);
2226 setFeatureEnabledImpl(Features, "fma", true);
Stephen Hines176edba2014-12-01 14:53:08 -08002227 setFeatureEnabledImpl(Features, "rdrnd", true);
2228 setFeatureEnabledImpl(Features, "f16c", true);
2229 setFeatureEnabledImpl(Features, "fsgsbase", true);
2230 setFeatureEnabledImpl(Features, "aes", true);
2231 setFeatureEnabledImpl(Features, "pclmul", true);
2232 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002233 break;
2234 case CK_K6_2:
2235 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002236 case CK_WinChip2:
2237 case CK_C3:
Craig Topper85bfef62013-09-17 04:51:29 +00002238 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002239 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002240 case CK_Athlon:
2241 case CK_AthlonThunderbird:
2242 case CK_Geode:
Craig Topper85bfef62013-09-17 04:51:29 +00002243 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00002244 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002245 case CK_Athlon4:
2246 case CK_AthlonXP:
2247 case CK_AthlonMP:
Craig Topper85bfef62013-09-17 04:51:29 +00002248 setFeatureEnabledImpl(Features, "sse", true);
2249 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002250 break;
2251 case CK_K8:
2252 case CK_Opteron:
2253 case CK_Athlon64:
2254 case CK_AthlonFX:
Craig Topper85bfef62013-09-17 04:51:29 +00002255 setFeatureEnabledImpl(Features, "sse2", true);
2256 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002257 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002258 case CK_AMDFAM10:
2259 setFeatureEnabledImpl(Features, "sse4a", true);
2260 setFeatureEnabledImpl(Features, "lzcnt", true);
2261 setFeatureEnabledImpl(Features, "popcnt", true);
2262 // FALLTHROUGH
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002263 case CK_K8SSE3:
2264 case CK_OpteronSSE3:
2265 case CK_Athlon64SSE3:
Craig Topper85bfef62013-09-17 04:51:29 +00002266 setFeatureEnabledImpl(Features, "sse3", true);
2267 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divacky9979cfe2011-10-30 13:47:56 +00002268 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002269 case CK_BTVER2:
2270 setFeatureEnabledImpl(Features, "avx", true);
2271 setFeatureEnabledImpl(Features, "aes", true);
2272 setFeatureEnabledImpl(Features, "pclmul", true);
2273 setFeatureEnabledImpl(Features, "bmi", true);
2274 setFeatureEnabledImpl(Features, "f16c", true);
2275 // FALLTHROUGH
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002276 case CK_BTVER1:
Craig Topper85bfef62013-09-17 04:51:29 +00002277 setFeatureEnabledImpl(Features, "ssse3", true);
2278 setFeatureEnabledImpl(Features, "sse4a", true);
2279 setFeatureEnabledImpl(Features, "lzcnt", true);
2280 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002281 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002282 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002283 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002284 case CK_BDVER4:
2285 setFeatureEnabledImpl(Features, "avx2", true);
2286 setFeatureEnabledImpl(Features, "bmi2", true);
2287 // FALLTHROUGH
Benjamin Kramera2420962013-11-04 10:29:51 +00002288 case CK_BDVER3:
Stephen Hines176edba2014-12-01 14:53:08 -08002289 setFeatureEnabledImpl(Features, "fsgsbase", true);
2290 // FALLTHROUGH
2291 case CK_BDVER2:
2292 setFeatureEnabledImpl(Features, "bmi", true);
2293 setFeatureEnabledImpl(Features, "fma", true);
2294 setFeatureEnabledImpl(Features, "f16c", true);
2295 setFeatureEnabledImpl(Features, "tbm", true);
2296 // FALLTHROUGH
2297 case CK_BDVER1:
2298 // xop implies avx, sse4a and fma4.
Craig Topper85bfef62013-09-17 04:51:29 +00002299 setFeatureEnabledImpl(Features, "xop", true);
2300 setFeatureEnabledImpl(Features, "lzcnt", true);
2301 setFeatureEnabledImpl(Features, "aes", true);
2302 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002303 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewyckyaf945462013-10-05 20:14:27 +00002304 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002305 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002306 }
Daniel Dunbar07181d72009-05-06 03:16:41 +00002307}
2308
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002309void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002310 X86SSEEnum Level, bool Enabled) {
Daniel Dunbar0838f962009-05-06 21:07:50 +00002311 if (Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002312 switch (Level) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002313 case AVX512F:
2314 Features["avx512f"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002315 case AVX2:
2316 Features["avx2"] = true;
2317 case AVX:
2318 Features["avx"] = true;
2319 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002320 Features["sse4.2"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002321 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002322 Features["sse4.1"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002323 case SSSE3:
2324 Features["ssse3"] = true;
2325 case SSE3:
2326 Features["sse3"] = true;
2327 case SSE2:
2328 Features["sse2"] = true;
2329 case SSE1:
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002330 Features["sse"] = true;
2331 case NoSSE:
2332 break;
2333 }
2334 return;
Daniel Dunbar0838f962009-05-06 21:07:50 +00002335 }
2336
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002337 switch (Level) {
2338 case NoSSE:
2339 case SSE1:
2340 Features["sse"] = false;
2341 case SSE2:
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002342 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2343 Features["sha"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002344 case SSE3:
2345 Features["sse3"] = false;
2346 setXOPLevel(Features, NoXOP, false);
2347 case SSSE3:
2348 Features["ssse3"] = false;
2349 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002350 Features["sse4.1"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002351 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002352 Features["sse4.2"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002353 case AVX:
Craig Topper84f007b2013-09-16 04:54:13 +00002354 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola29f26de2013-08-21 13:28:02 +00002355 setXOPLevel(Features, FMA4, false);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002356 case AVX2:
2357 Features["avx2"] = false;
Craig Topperb7a95d22013-08-21 03:59:22 +00002358 case AVX512F:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002359 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Stephen Hines176edba2014-12-01 14:53:08 -08002360 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2361 Features["avx512vl"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002362 }
Daniel Dunbar0838f962009-05-06 21:07:50 +00002363}
2364
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002365void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper319d81f2013-09-17 04:12:55 +00002366 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002367 if (Enabled) {
2368 switch (Level) {
2369 case AMD3DNowAthlon:
2370 Features["3dnowa"] = true;
2371 case AMD3DNow:
2372 Features["3dnow"] = true;
2373 case MMX:
2374 Features["mmx"] = true;
2375 case NoMMX3DNow:
2376 break;
2377 }
2378 return;
2379 }
2380
2381 switch (Level) {
2382 case NoMMX3DNow:
2383 case MMX:
2384 Features["mmx"] = false;
2385 case AMD3DNow:
2386 Features["3dnow"] = false;
2387 case AMD3DNowAthlon:
2388 Features["3dnowa"] = false;
2389 }
2390}
2391
2392void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper319d81f2013-09-17 04:12:55 +00002393 bool Enabled) {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002394 if (Enabled) {
2395 switch (Level) {
2396 case XOP:
2397 Features["xop"] = true;
2398 case FMA4:
2399 Features["fma4"] = true;
2400 setSSELevel(Features, AVX, true);
2401 case SSE4A:
2402 Features["sse4a"] = true;
2403 setSSELevel(Features, SSE3, true);
2404 case NoXOP:
2405 break;
2406 }
2407 return;
2408 }
2409
2410 switch (Level) {
2411 case NoXOP:
2412 case SSE4A:
2413 Features["sse4a"] = false;
2414 case FMA4:
2415 Features["fma4"] = false;
2416 case XOP:
2417 Features["xop"] = false;
2418 }
2419}
2420
Craig Topper85bfef62013-09-17 04:51:29 +00002421void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2422 StringRef Name, bool Enabled) {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002423 // FIXME: This *really* should not be here. We need some way of translating
2424 // options into llvm subtarget features.
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002425 if (Name == "sse4")
2426 Name = "sse4.2";
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002427
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002428 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002429
Craig Topperb22352e2013-09-19 01:13:07 +00002430 if (Name == "mmx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002431 setMMXLevel(Features, MMX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002432 } else if (Name == "sse") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002433 setSSELevel(Features, SSE1, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002434 } else if (Name == "sse2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002435 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002436 } else if (Name == "sse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002437 setSSELevel(Features, SSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002438 } else if (Name == "ssse3") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002439 setSSELevel(Features, SSSE3, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002440 } else if (Name == "sse4.2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002441 setSSELevel(Features, SSE42, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002442 } else if (Name == "sse4.1") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002443 setSSELevel(Features, SSE41, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002444 } else if (Name == "3dnow") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002445 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002446 } else if (Name == "3dnowa") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002447 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002448 } else if (Name == "aes") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002449 if (Enabled)
2450 setSSELevel(Features, SSE2, Enabled);
2451 } else if (Name == "pclmul") {
2452 if (Enabled)
2453 setSSELevel(Features, SSE2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002454 } else if (Name == "avx") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002455 setSSELevel(Features, AVX, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002456 } else if (Name == "avx2") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002457 setSSELevel(Features, AVX2, Enabled);
Craig Topperb22352e2013-09-19 01:13:07 +00002458 } else if (Name == "avx512f") {
Craig Topperb7a95d22013-08-21 03:59:22 +00002459 setSSELevel(Features, AVX512F, Enabled);
Stephen Hines176edba2014-12-01 14:53:08 -08002460 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2461 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topperbca2c4f2013-08-21 05:29:10 +00002462 if (Enabled)
2463 setSSELevel(Features, AVX512F, Enabled);
2464 } else if (Name == "fma") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002465 if (Enabled)
2466 setSSELevel(Features, AVX, Enabled);
2467 } else if (Name == "fma4") {
2468 setXOPLevel(Features, FMA4, Enabled);
2469 } else if (Name == "xop") {
2470 setXOPLevel(Features, XOP, Enabled);
2471 } else if (Name == "sse4a") {
2472 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper84f007b2013-09-16 04:54:13 +00002473 } else if (Name == "f16c") {
2474 if (Enabled)
2475 setSSELevel(Features, AVX, Enabled);
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002476 } else if (Name == "sha") {
2477 if (Enabled)
2478 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002479 }
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002480}
2481
Eric Christopher3d11ced2013-10-16 21:26:26 +00002482/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar07181d72009-05-06 03:16:41 +00002483/// configured set of features.
Eric Christopher3d11ced2013-10-16 21:26:26 +00002484bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindola5389b842013-08-21 21:59:03 +00002485 DiagnosticsEngine &Diags) {
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002486 // Remember the maximum enabled sselevel.
2487 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2488 // Ignore disabled features.
2489 if (Features[i][0] == '-')
2490 continue;
2491
Benjamin Kramer713575a2012-03-05 15:10:44 +00002492 StringRef Feature = StringRef(Features[i]).substr(1);
2493
2494 if (Feature == "aes") {
Eric Christopher6c4e7872010-04-02 23:50:19 +00002495 HasAES = true;
2496 continue;
2497 }
2498
Craig Topper3c0bc152012-05-31 05:18:48 +00002499 if (Feature == "pclmul") {
2500 HasPCLMUL = true;
2501 continue;
2502 }
2503
Benjamin Kramer713575a2012-03-05 15:10:44 +00002504 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002505 HasLZCNT = true;
2506 continue;
2507 }
2508
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002509 if (Feature == "rdrnd") {
Benjamin Kramer84f30802012-07-07 09:39:18 +00002510 HasRDRND = true;
2511 continue;
2512 }
2513
Stephen Hines176edba2014-12-01 14:53:08 -08002514 if (Feature == "fsgsbase") {
2515 HasFSGSBASE = true;
2516 continue;
2517 }
2518
Benjamin Kramer713575a2012-03-05 15:10:44 +00002519 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002520 HasBMI = true;
2521 continue;
2522 }
2523
Benjamin Kramer713575a2012-03-05 15:10:44 +00002524 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002525 HasBMI2 = true;
2526 continue;
2527 }
2528
Benjamin Kramer713575a2012-03-05 15:10:44 +00002529 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002530 HasPOPCNT = true;
2531 continue;
2532 }
2533
Michael Liao463eb892012-11-10 05:17:46 +00002534 if (Feature == "rtm") {
2535 HasRTM = true;
2536 continue;
2537 }
2538
Michael Liao72339a02013-03-26 17:52:08 +00002539 if (Feature == "prfchw") {
2540 HasPRFCHW = true;
2541 continue;
2542 }
2543
Michael Liao1bfc28c2013-03-29 05:17:55 +00002544 if (Feature == "rdseed") {
2545 HasRDSEED = true;
2546 continue;
2547 }
2548
Stephen Hines176edba2014-12-01 14:53:08 -08002549 if (Feature == "adx") {
2550 HasADX = true;
2551 continue;
2552 }
2553
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002554 if (Feature == "tbm") {
2555 HasTBM = true;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002556 continue;
2557 }
2558
Craig Topper2ae95072012-06-03 21:46:30 +00002559 if (Feature == "fma") {
2560 HasFMA = true;
2561 continue;
2562 }
2563
Manman Ren146e5a42012-10-11 00:59:55 +00002564 if (Feature == "f16c") {
2565 HasF16C = true;
2566 continue;
2567 }
2568
Craig Topperbca2c4f2013-08-21 05:29:10 +00002569 if (Feature == "avx512cd") {
2570 HasAVX512CD = true;
2571 continue;
2572 }
2573
2574 if (Feature == "avx512er") {
2575 HasAVX512ER = true;
2576 continue;
2577 }
2578
2579 if (Feature == "avx512pf") {
2580 HasAVX512PF = true;
2581 continue;
2582 }
2583
Stephen Hines176edba2014-12-01 14:53:08 -08002584 if (Feature == "avx512dq") {
2585 HasAVX512DQ = true;
2586 continue;
2587 }
2588
2589 if (Feature == "avx512bw") {
2590 HasAVX512BW = true;
2591 continue;
2592 }
2593
2594 if (Feature == "avx512vl") {
2595 HasAVX512VL = true;
2596 continue;
2597 }
2598
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002599 if (Feature == "sha") {
2600 HasSHA = true;
2601 continue;
2602 }
2603
Nick Lewyckyaf945462013-10-05 20:14:27 +00002604 if (Feature == "cx16") {
2605 HasCX16 = true;
2606 continue;
2607 }
2608
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002609 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002610 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002611 .Case("avx512f", AVX512F)
Craig Topper05fe4b52012-01-09 09:19:09 +00002612 .Case("avx2", AVX2)
2613 .Case("avx", AVX)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002614 .Case("sse4.2", SSE42)
2615 .Case("sse4.1", SSE41)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002616 .Case("ssse3", SSSE3)
Nuno Lopes3a16d782010-03-12 10:20:09 +00002617 .Case("sse3", SSE3)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002618 .Case("sse2", SSE2)
2619 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002620 .Default(NoSSE);
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002621 SSELevel = std::max(SSELevel, Level);
Michael J. Spencerd5513a32010-10-21 03:16:25 +00002622
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002623 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002624 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone5e222f2010-01-27 03:47:49 +00002625 .Case("3dnowa", AMD3DNowAthlon)
2626 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002627 .Case("mmx", MMX)
2628 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002629 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002630
2631 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2632 .Case("xop", XOP)
2633 .Case("fma4", FMA4)
2634 .Case("sse4a", SSE4A)
2635 .Default(NoXOP);
2636 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002637 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002638
Craig Topper89a5e792013-09-10 06:55:47 +00002639 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2640 // Can't do this earlier because we need to be able to explicitly enable
2641 // popcnt and still disable sse4.2.
2642 if (!HasPOPCNT && SSELevel >= SSE42 &&
2643 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2644 HasPOPCNT = true;
2645 Features.push_back("+popcnt");
2646 }
2647
Yunzhong Gao15dbacc2013-10-16 19:07:02 +00002648 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2649 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2650 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2651 HasPRFCHW = true;
2652 Features.push_back("+prfchw");
2653 }
2654
Rafael Espindola5389b842013-08-21 21:59:03 +00002655 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2656 // matches the selected sse level.
2657 if (FPMath == FP_SSE && SSELevel < SSE1) {
2658 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2659 return false;
2660 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2661 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2662 return false;
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00002663 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002664
2665 // Don't tell the backend if we're turning off mmx; it will end up disabling
2666 // SSE, which we don't want.
Craig Topper56bed972013-09-11 06:48:53 +00002667 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2668 // then enable MMX.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002669 std::vector<std::string>::iterator it;
2670 it = std::find(Features.begin(), Features.end(), "-mmx");
2671 if (it != Features.end())
2672 Features.erase(it);
Craig Topper56bed972013-09-11 06:48:53 +00002673 else if (SSELevel > NoSSE)
2674 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindola5389b842013-08-21 21:59:03 +00002675 return true;
Chris Lattner7d6220c2009-03-02 22:20:04 +00002676}
Chris Lattnerbef1d722009-03-02 22:27:17 +00002677
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002678/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2679/// definitions for this particular subtarget.
Chris Lattner79682402009-03-20 15:52:06 +00002680void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002681 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00002682 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002683 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002684 Builder.defineMacro("__amd64__");
2685 Builder.defineMacro("__amd64");
2686 Builder.defineMacro("__x86_64");
2687 Builder.defineMacro("__x86_64__");
Stephen Hines176edba2014-12-01 14:53:08 -08002688 if (getTriple().getArchName() == "x86_64h") {
2689 Builder.defineMacro("__x86_64h");
2690 Builder.defineMacro("__x86_64h__");
2691 }
Chris Lattnerbef1d722009-03-02 22:27:17 +00002692 } else {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002693 DefineStd(Builder, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +00002694 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00002695
Chris Lattnerc0f59212009-03-02 22:27:17 +00002696 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002697 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2698 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002699 switch (CPU) {
2700 case CK_Generic:
2701 break;
2702 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002703 // The rest are coming from the i386 define above.
2704 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002705 break;
2706 case CK_i486:
2707 case CK_WinChipC6:
2708 case CK_WinChip2:
2709 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002710 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002711 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002712 case CK_PentiumMMX:
2713 Builder.defineMacro("__pentium_mmx__");
2714 Builder.defineMacro("__tune_pentium_mmx__");
2715 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002716 case CK_i586:
2717 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002718 defineCPUMacros(Builder, "i586");
2719 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002720 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002721 case CK_Pentium3:
2722 case CK_Pentium3M:
2723 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002724 Builder.defineMacro("__tune_pentium3__");
2725 // Fallthrough
2726 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002727 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002728 Builder.defineMacro("__tune_pentium2__");
2729 // Fallthrough
2730 case CK_PentiumPro:
2731 Builder.defineMacro("__tune_i686__");
2732 Builder.defineMacro("__tune_pentiumpro__");
2733 // Fallthrough
2734 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002735 Builder.defineMacro("__i686");
2736 Builder.defineMacro("__i686__");
2737 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2738 Builder.defineMacro("__pentiumpro");
2739 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002740 break;
2741 case CK_Pentium4:
2742 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002743 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002744 break;
2745 case CK_Yonah:
2746 case CK_Prescott:
2747 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002748 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002749 break;
2750 case CK_Core2:
2751 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002752 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002753 break;
2754 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002755 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002756 break;
Preston Gurdc57ea682013-09-13 19:27:17 +00002757 case CK_Silvermont:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00002758 defineCPUMacros(Builder, "slm");
2759 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002760 case CK_Corei7:
2761 case CK_Corei7AVX:
2762 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002763 case CK_CoreAVX2:
Stephen Hines176edba2014-12-01 14:53:08 -08002764 case CK_Broadwell:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002765 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002766 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002767 case CK_KNL:
2768 defineCPUMacros(Builder, "knl");
2769 break;
Stephen Hines176edba2014-12-01 14:53:08 -08002770 case CK_SKX:
2771 defineCPUMacros(Builder, "skx");
2772 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002773 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002774 Builder.defineMacro("__k6_2__");
2775 Builder.defineMacro("__tune_k6_2__");
2776 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002777 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002778 if (CPU != CK_K6_2) { // In case of fallthrough
2779 // FIXME: GCC may be enabling these in cases where some other k6
2780 // architecture is specified but -m3dnow is explicitly provided. The
2781 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002782 Builder.defineMacro("__k6_3__");
2783 Builder.defineMacro("__tune_k6_3__");
2784 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002785 // Fallthrough
2786 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002787 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002788 break;
2789 case CK_Athlon:
2790 case CK_AthlonThunderbird:
2791 case CK_Athlon4:
2792 case CK_AthlonXP:
2793 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002794 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002795 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002796 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002797 Builder.defineMacro("__tune_athlon_sse__");
2798 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002799 break;
2800 case CK_K8:
2801 case CK_K8SSE3:
2802 case CK_x86_64:
2803 case CK_Opteron:
2804 case CK_OpteronSSE3:
2805 case CK_Athlon64:
2806 case CK_Athlon64SSE3:
2807 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002808 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002809 break;
Roman Divackyf051cde2011-10-30 07:48:46 +00002810 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002811 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002812 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002813 case CK_BTVER1:
2814 defineCPUMacros(Builder, "btver1");
Roman Divackyf051cde2011-10-30 07:48:46 +00002815 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002816 case CK_BTVER2:
2817 defineCPUMacros(Builder, "btver2");
2818 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002819 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002820 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002821 break;
2822 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002823 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002824 break;
Benjamin Kramera2420962013-11-04 10:29:51 +00002825 case CK_BDVER3:
2826 defineCPUMacros(Builder, "bdver3");
2827 break;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07002828 case CK_BDVER4:
2829 defineCPUMacros(Builder, "bdver4");
2830 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002831 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002832 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002833 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002834 }
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00002835
Chris Lattnerbef1d722009-03-02 22:27:17 +00002836 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002837 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002838
Chris Lattner25ac1c12009-04-19 17:32:33 +00002839 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2840 // functions in glibc header files that use FP Stack inline asm which the
2841 // backend can't deal with (PR879).
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002842 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikove7772382009-05-03 13:42:53 +00002843
Chandler Carruth88c75b02011-09-28 09:54:07 +00002844 if (HasAES)
2845 Builder.defineMacro("__AES__");
2846
Craig Topper3c0bc152012-05-31 05:18:48 +00002847 if (HasPCLMUL)
2848 Builder.defineMacro("__PCLMUL__");
2849
Craig Topper31ceea02011-12-25 05:06:45 +00002850 if (HasLZCNT)
2851 Builder.defineMacro("__LZCNT__");
2852
Benjamin Kramer84f30802012-07-07 09:39:18 +00002853 if (HasRDRND)
2854 Builder.defineMacro("__RDRND__");
2855
Stephen Hines176edba2014-12-01 14:53:08 -08002856 if (HasFSGSBASE)
2857 Builder.defineMacro("__FSGSBASE__");
2858
Craig Topper31ceea02011-12-25 05:06:45 +00002859 if (HasBMI)
2860 Builder.defineMacro("__BMI__");
2861
2862 if (HasBMI2)
2863 Builder.defineMacro("__BMI2__");
2864
Craig Toppere14e08b2011-12-29 16:10:46 +00002865 if (HasPOPCNT)
2866 Builder.defineMacro("__POPCNT__");
2867
Michael Liao463eb892012-11-10 05:17:46 +00002868 if (HasRTM)
2869 Builder.defineMacro("__RTM__");
2870
Michael Liao72339a02013-03-26 17:52:08 +00002871 if (HasPRFCHW)
2872 Builder.defineMacro("__PRFCHW__");
2873
Michael Liao1bfc28c2013-03-29 05:17:55 +00002874 if (HasRDSEED)
2875 Builder.defineMacro("__RDSEED__");
2876
Stephen Hines176edba2014-12-01 14:53:08 -08002877 if (HasADX)
2878 Builder.defineMacro("__ADX__");
2879
Yunzhong Gaoa8f7d9d2013-09-24 19:00:58 +00002880 if (HasTBM)
2881 Builder.defineMacro("__TBM__");
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002882
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002883 switch (XOPLevel) {
2884 case XOP:
2885 Builder.defineMacro("__XOP__");
2886 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00002887 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002888 case SSE4A:
2889 Builder.defineMacro("__SSE4A__");
2890 case NoXOP:
2891 break;
2892 }
Chandler Carruth88c75b02011-09-28 09:54:07 +00002893
Craig Topper2ae95072012-06-03 21:46:30 +00002894 if (HasFMA)
2895 Builder.defineMacro("__FMA__");
2896
Manman Ren146e5a42012-10-11 00:59:55 +00002897 if (HasF16C)
2898 Builder.defineMacro("__F16C__");
2899
Craig Topperbca2c4f2013-08-21 05:29:10 +00002900 if (HasAVX512CD)
2901 Builder.defineMacro("__AVX512CD__");
2902 if (HasAVX512ER)
2903 Builder.defineMacro("__AVX512ER__");
2904 if (HasAVX512PF)
2905 Builder.defineMacro("__AVX512PF__");
Stephen Hines176edba2014-12-01 14:53:08 -08002906 if (HasAVX512DQ)
2907 Builder.defineMacro("__AVX512DQ__");
2908 if (HasAVX512BW)
2909 Builder.defineMacro("__AVX512BW__");
2910 if (HasAVX512VL)
2911 Builder.defineMacro("__AVX512VL__");
Craig Topperbca2c4f2013-08-21 05:29:10 +00002912
Ben Langmuirb83f5a72013-09-19 13:22:04 +00002913 if (HasSHA)
2914 Builder.defineMacro("__SHA__");
2915
Nick Lewyckyaf945462013-10-05 20:14:27 +00002916 if (HasCX16)
2917 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2918
Chris Lattner715fe4c2009-03-02 22:40:39 +00002919 // Each case falls through to the previous one here.
2920 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002921 case AVX512F:
Craig Topper42f98732013-08-20 07:39:54 +00002922 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00002923 case AVX2:
2924 Builder.defineMacro("__AVX2__");
2925 case AVX:
2926 Builder.defineMacro("__AVX__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002927 case SSE42:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002928 Builder.defineMacro("__SSE4_2__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002929 case SSE41:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002930 Builder.defineMacro("__SSE4_1__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002931 case SSSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002932 Builder.defineMacro("__SSSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002933 case SSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002934 Builder.defineMacro("__SSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00002935 case SSE2:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002936 Builder.defineMacro("__SSE2__");
2937 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner715fe4c2009-03-02 22:40:39 +00002938 case SSE1:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002939 Builder.defineMacro("__SSE__");
2940 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002941 case NoSSE:
Chris Lattner715fe4c2009-03-02 22:40:39 +00002942 break;
2943 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00002944
Derek Schuffbabaf312012-10-11 15:52:22 +00002945 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer01e70082010-10-21 05:21:48 +00002946 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002947 case AVX512F:
Craig Topper05fe4b52012-01-09 09:19:09 +00002948 case AVX2:
2949 case AVX:
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00002950 case SSE42:
2951 case SSE41:
2952 case SSSE3:
2953 case SSE3:
Michael J. Spencer01e70082010-10-21 05:21:48 +00002954 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002955 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002956 break;
2957 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002958 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002959 break;
2960 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002961 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer01e70082010-10-21 05:21:48 +00002962 }
2963 }
2964
Anders Carlssone5e222f2010-01-27 03:47:49 +00002965 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002966 switch (MMX3DNowLevel) {
Anders Carlssone5e222f2010-01-27 03:47:49 +00002967 case AMD3DNowAthlon:
2968 Builder.defineMacro("__3dNOW_A__");
2969 case AMD3DNow:
2970 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002971 case MMX:
2972 Builder.defineMacro("__MMX__");
2973 case NoMMX3DNow:
Anders Carlssone5e222f2010-01-27 03:47:49 +00002974 break;
2975 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00002976
2977 if (CPU >= CK_i486) {
2978 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2979 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2980 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2981 }
2982 if (CPU >= CK_i586)
2983 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerbef1d722009-03-02 22:27:17 +00002984}
Anton Korobeynikove7772382009-05-03 13:42:53 +00002985
Douglas Gregore727d212012-01-30 06:38:25 +00002986bool X86TargetInfo::hasFeature(StringRef Feature) const {
2987 return llvm::StringSwitch<bool>(Feature)
2988 .Case("aes", HasAES)
2989 .Case("avx", SSELevel >= AVX)
2990 .Case("avx2", SSELevel >= AVX2)
Craig Topperb7a95d22013-08-21 03:59:22 +00002991 .Case("avx512f", SSELevel >= AVX512F)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002992 .Case("avx512cd", HasAVX512CD)
2993 .Case("avx512er", HasAVX512ER)
2994 .Case("avx512pf", HasAVX512PF)
Stephen Hines176edba2014-12-01 14:53:08 -08002995 .Case("avx512dq", HasAVX512DQ)
2996 .Case("avx512bw", HasAVX512BW)
2997 .Case("avx512vl", HasAVX512VL)
Douglas Gregore727d212012-01-30 06:38:25 +00002998 .Case("bmi", HasBMI)
2999 .Case("bmi2", HasBMI2)
Nick Lewyckyaf945462013-10-05 20:14:27 +00003000 .Case("cx16", HasCX16)
3001 .Case("f16c", HasF16C)
Craig Topper2ae95072012-06-03 21:46:30 +00003002 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003003 .Case("fma4", XOPLevel >= FMA4)
Stephen Hines176edba2014-12-01 14:53:08 -08003004 .Case("fsgsbase", HasFSGSBASE)
Douglas Gregore727d212012-01-30 06:38:25 +00003005 .Case("lzcnt", HasLZCNT)
3006 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3007 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3008 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00003009 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00003010 .Case("popcnt", HasPOPCNT)
Michael Liao72339a02013-03-26 17:52:08 +00003011 .Case("prfchw", HasPRFCHW)
Stephen Hines176edba2014-12-01 14:53:08 -08003012 .Case("rdrnd", HasRDRND)
Michael Liao1bfc28c2013-03-29 05:17:55 +00003013 .Case("rdseed", HasRDSEED)
Stephen Hines176edba2014-12-01 14:53:08 -08003014 .Case("rtm", HasRTM)
Ben Langmuirb83f5a72013-09-19 13:22:04 +00003015 .Case("sha", HasSHA)
Douglas Gregore727d212012-01-30 06:38:25 +00003016 .Case("sse", SSELevel >= SSE1)
3017 .Case("sse2", SSELevel >= SSE2)
3018 .Case("sse3", SSELevel >= SSE3)
3019 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00003020 .Case("sse4.1", SSELevel >= SSE41)
3021 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003022 .Case("sse4a", XOPLevel >= SSE4A)
Stephen Hines176edba2014-12-01 14:53:08 -08003023 .Case("tbm", HasTBM)
Douglas Gregore727d212012-01-30 06:38:25 +00003024 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00003025 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3026 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00003027 .Case("xop", XOPLevel >= XOP)
Douglas Gregore727d212012-01-30 06:38:25 +00003028 .Default(false);
3029}
Anton Korobeynikove7772382009-05-03 13:42:53 +00003030
Eli Friedman872996c2008-08-20 02:34:37 +00003031bool
Anders Carlsson36834a72009-02-28 17:11:49 +00003032X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00003033 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +00003034 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +00003035 default: return false;
Dale Johanneseneba819a2010-08-24 22:33:12 +00003036 case 'Y': // first letter of a pair:
3037 switch (*(Name+1)) {
3038 default: return false;
3039 case '0': // First SSE register.
3040 case 't': // Any SSE register, when SSE2 is enabled.
3041 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3042 case 'm': // any MMX register, when inter-unit moves enabled.
3043 break; // falls through to setAllowsRegister.
3044 }
Stephen Hines176edba2014-12-01 14:53:08 -08003045 case 'f': // any x87 floating point stack register.
3046 // Constraint 'f' cannot be used for output operands.
3047 if (Info.ConstraintStr[0] == '=')
3048 return false;
3049
3050 Info.setAllowsRegister();
3051 return true;
Eli Friedman872996c2008-08-20 02:34:37 +00003052 case 'a': // eax.
3053 case 'b': // ebx.
3054 case 'c': // ecx.
3055 case 'd': // edx.
3056 case 'S': // esi.
3057 case 'D': // edi.
3058 case 'A': // edx:eax.
3059 case 't': // top of floating point stack.
3060 case 'u': // second from top of floating point stack.
3061 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +00003062 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +00003063 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +00003064 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johanneseneba819a2010-08-24 22:33:12 +00003065 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3066 case 'l': // "Index" registers: any general register that can be used as an
3067 // index in a base+index memory access.
3068 Info.setAllowsRegister();
3069 return true;
3070 case 'C': // SSE floating point constant.
3071 case 'G': // x87 floating point constant.
Anton Korobeynikove7772382009-05-03 13:42:53 +00003072 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00003073 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +00003074 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00003075 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +00003076 return true;
3077 }
3078}
3079
Stephen Hines176edba2014-12-01 14:53:08 -08003080bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3081 unsigned Size) const {
3082 // Strip off constraint modifiers.
3083 while (Constraint[0] == '=' ||
3084 Constraint[0] == '+' ||
3085 Constraint[0] == '&')
3086 Constraint = Constraint.substr(1);
3087
3088 return validateOperandSize(Constraint, Size);
3089}
3090
3091bool X86TargetInfo::validateInputSize(StringRef Constraint,
3092 unsigned Size) const {
3093 return validateOperandSize(Constraint, Size);
3094}
3095
3096bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3097 unsigned Size) const {
3098 switch (Constraint[0]) {
3099 default: break;
3100 case 'y':
3101 return Size <= 64;
3102 case 'f':
3103 case 't':
3104 case 'u':
3105 return Size <= 128;
3106 case 'x':
3107 // 256-bit ymm registers can be used if target supports AVX.
3108 return Size <= (SSELevel >= AVX ? 256U : 128U);
3109 }
3110
3111 return true;
3112}
Dale Johannesen3a161e52010-10-29 23:12:32 +00003113
Eli Friedman872996c2008-08-20 02:34:37 +00003114std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00003115X86TargetInfo::convertConstraint(const char *&Constraint) const {
3116 switch (*Constraint) {
Eli Friedman872996c2008-08-20 02:34:37 +00003117 case 'a': return std::string("{ax}");
3118 case 'b': return std::string("{bx}");
3119 case 'c': return std::string("{cx}");
3120 case 'd': return std::string("{dx}");
3121 case 'S': return std::string("{si}");
3122 case 'D': return std::string("{di}");
Dale Johannesena49254e2010-10-22 21:07:10 +00003123 case 'p': // address
3124 return std::string("im");
Eli Friedman872996c2008-08-20 02:34:37 +00003125 case 't': // top of floating point stack.
3126 return std::string("{st}");
3127 case 'u': // second from top of floating point stack.
3128 return std::string("{st(1)}"); // second from top of floating point stack.
3129 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00003130 return std::string(1, *Constraint);
Eli Friedman872996c2008-08-20 02:34:37 +00003131 }
3132}
Eli Friedman872996c2008-08-20 02:34:37 +00003133} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +00003134
3135namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00003136// X86-32 generic target
3137class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00003138public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003139 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003140 DoubleAlign = LongLongAlign = 32;
3141 LongDoubleWidth = 96;
3142 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00003143 SuitableAlign = 128;
Stephen Hines651f13c2014-04-23 16:59:28 -07003144 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman04ede302009-03-29 20:31:09 +00003145 SizeType = UnsignedInt;
3146 PtrDiffType = SignedInt;
3147 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003148 RegParmMax = 3;
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003149
3150 // Use fpret for all types.
3151 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3152 (1 << TargetInfo::Double) |
3153 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00003154
3155 // x86-32 has atomics up to 8 bytes
3156 // FIXME: Check that we actually have cmpxchg8b before setting
3157 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman872996c2008-08-20 02:34:37 +00003159 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003160 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003161 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman872996c2008-08-20 02:34:37 +00003162 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003163
Stephen Hines651f13c2014-04-23 16:59:28 -07003164 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003165 if (RegNo == 0) return 0;
3166 if (RegNo == 1) return 2;
3167 return -1;
3168 }
Stephen Hines176edba2014-12-01 14:53:08 -08003169 bool validateOperandSize(StringRef Constraint,
3170 unsigned Size) const override {
Bill Wendling68fd6082012-11-12 06:42:51 +00003171 switch (Constraint[0]) {
3172 default: break;
Stephen Hines176edba2014-12-01 14:53:08 -08003173 case 'R':
3174 case 'q':
3175 case 'Q':
Bill Wendling68fd6082012-11-12 06:42:51 +00003176 case 'a':
3177 case 'b':
3178 case 'c':
3179 case 'd':
Stephen Hines176edba2014-12-01 14:53:08 -08003180 case 'S':
3181 case 'D':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00003182 return Size <= 32;
Stephen Hines176edba2014-12-01 14:53:08 -08003183 case 'A':
3184 return Size <= 64;
Bill Wendling68fd6082012-11-12 06:42:51 +00003185 }
3186
Stephen Hines176edba2014-12-01 14:53:08 -08003187 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling68fd6082012-11-12 06:42:51 +00003188 }
Eli Friedman872996c2008-08-20 02:34:37 +00003189};
3190} // end anonymous namespace
3191
3192namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003193class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3194public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003195 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3196 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003197
Stephen Hines651f13c2014-04-23 16:59:28 -07003198 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger8daa7fe2013-11-11 14:00:37 +00003199 unsigned Major, Minor, Micro;
3200 getTriple().getOSVersion(Major, Minor, Micro);
3201 // New NetBSD uses the default rounding mode.
3202 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3203 return X86_32TargetInfo::getFloatEvalMethod();
3204 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003205 return 1;
3206 }
3207};
3208} // end anonymous namespace
3209
3210namespace {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003211class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3212public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003213 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3214 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003215 SizeType = UnsignedLong;
3216 IntPtrType = SignedLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003217 PtrDiffType = SignedLong;
Eli Friedman1c79f4b2009-07-05 18:47:56 +00003218 }
3219};
3220} // end anonymous namespace
3221
3222namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003223class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3224public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003225 BitrigI386TargetInfo(const llvm::Triple &Triple)
3226 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00003227 SizeType = UnsignedLong;
3228 IntPtrType = SignedLong;
3229 PtrDiffType = SignedLong;
3230 }
3231};
3232} // end anonymous namespace
3233
3234namespace {
Edwin Török36565e52009-06-30 17:10:35 +00003235class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman872996c2008-08-20 02:34:37 +00003236public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003237 DarwinI386TargetInfo(const llvm::Triple &Triple)
3238 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00003239 LongDoubleWidth = 128;
3240 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003241 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003242 MaxVectorAlign = 256;
Eli Friedman04ede302009-03-29 20:31:09 +00003243 SizeType = UnsignedLong;
3244 IntPtrType = SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003245 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbar9451c542010-05-27 00:35:16 +00003246 HasAlignMac68kSupport = true;
Edwin Török2d98f9f2009-06-30 17:00:25 +00003247 }
3248
Eli Friedman872996c2008-08-20 02:34:37 +00003249};
Daniel Dunbar64c77a12009-06-29 20:52:51 +00003250} // end anonymous namespace
3251
3252namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +00003253// x86-32 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003254class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman23cb7912008-08-21 01:40:19 +00003255public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003256 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3257 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattnera8a69e12009-06-24 17:12:15 +00003258 WCharType = UnsignedShort;
Eli Friedmanb28055e2009-06-08 21:16:17 +00003259 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003260 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedman23cb7912008-08-21 01:40:19 +00003261 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003262 void getTargetDefines(const LangOptions &Opts,
3263 MacroBuilder &Builder) const override {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003264 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Eli Friedman23cb7912008-08-21 01:40:19 +00003265 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003266};
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003267
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003268// x86-32 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003269class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003270public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003271 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003272 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003273 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003274 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003275 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003276 void getTargetDefines(const LangOptions &Opts,
3277 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003278 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003279 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003280 // The value of the following reflects processor type.
3281 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3282 // We lost the original triple, so we use the default.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003283 Builder.defineMacro("_M_IX86", "600");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003284 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003285};
3286} // end anonymous namespace
3287
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003288static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3289 Builder.defineMacro("__MSVCRT__");
3290 Builder.defineMacro("__MINGW32__");
3291
3292 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3293 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3294 // macro anyway for pre-processor compatibility.
3295 if (Opts.MicrosoftExt)
3296 Builder.defineMacro("__declspec", "__declspec");
3297 else
3298 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3299
3300 if (!Opts.MicrosoftExt) {
3301 // Provide macros for all the calling convention keywords. Provide both
3302 // single and double underscore prefixed variants. These are available on
3303 // x64 as well as x86, even though they have no effect.
3304 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3305 for (const char *CC : CCs) {
3306 std::string GCCSpelling = "__attribute__((__";
3307 GCCSpelling += CC;
3308 GCCSpelling += "__))";
3309 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3310 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3311 }
3312 }
3313}
3314
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003315namespace {
3316// x86-32 MinGW target
3317class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3318public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003319 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3320 : WindowsX86_32TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003321 void getTargetDefines(const LangOptions &Opts,
3322 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003323 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003324 DefineStd(Builder, "WIN32", Opts);
3325 DefineStd(Builder, "WINNT", Opts);
3326 Builder.defineMacro("_X86_");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003327 addMinGWDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003328 }
3329};
3330} // end anonymous namespace
3331
3332namespace {
3333// x86-32 Cygwin target
3334class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3335public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003336 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3337 : X86_32TargetInfo(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003338 TLSSupported = false;
3339 WCharType = UnsignedShort;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003340 DoubleAlign = LongLongAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07003341 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003342 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003343 void getTargetDefines(const LangOptions &Opts,
3344 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003345 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003346 Builder.defineMacro("_X86_");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003347 Builder.defineMacro("__CYGWIN__");
3348 Builder.defineMacro("__CYGWIN32__");
3349 DefineStd(Builder, "unix", Opts);
Douglas Gregor9b22a172010-04-21 05:52:38 +00003350 if (Opts.CPlusPlus)
3351 Builder.defineMacro("_GNU_SOURCE");
Eli Friedman6b6ca942009-06-08 06:11:14 +00003352 }
Eli Friedman23cb7912008-08-21 01:40:19 +00003353};
3354} // end anonymous namespace
3355
3356namespace {
Chris Lattnerf853e732010-04-11 19:29:39 +00003357// x86-32 Haiku target
3358class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3359public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003360 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerf853e732010-04-11 19:29:39 +00003361 SizeType = UnsignedLong;
Chris Lattner5b8b18a2010-04-22 17:48:00 +00003362 IntPtrType = SignedLong;
3363 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003364 ProcessIDType = SignedLong;
Rafael Espindolaa7bdfdd2010-11-09 16:41:02 +00003365 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003366 this->TLSSupported = false;
Eli Friedman08f845b2010-08-22 01:00:03 +00003367 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003368 void getTargetDefines(const LangOptions &Opts,
3369 MacroBuilder &Builder) const override {
Chris Lattnerf853e732010-04-11 19:29:39 +00003370 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3371 Builder.defineMacro("__INTEL__");
3372 Builder.defineMacro("__HAIKU__");
3373 }
3374};
3375} // end anonymous namespace
3376
Douglas Gregordca52262011-07-01 22:41:14 +00003377// RTEMS Target
3378template<typename Target>
3379class RTEMSTargetInfo : public OSTargetInfo<Target> {
3380protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07003381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3382 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003383 // RTEMS defines; list based off of gcc output
3384
Douglas Gregordca52262011-07-01 22:41:14 +00003385 Builder.defineMacro("__rtems__");
3386 Builder.defineMacro("__ELF__");
3387 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003388
Douglas Gregordca52262011-07-01 22:41:14 +00003389public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003390 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3391 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00003392
Benjamin Kramer9df08232013-06-29 16:37:14 +00003393 switch (Triple.getArch()) {
3394 default:
3395 case llvm::Triple::x86:
3396 // this->MCountName = ".mcount";
3397 break;
3398 case llvm::Triple::mips:
3399 case llvm::Triple::mipsel:
3400 case llvm::Triple::ppc:
3401 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003402 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003403 // this->MCountName = "_mcount";
3404 break;
3405 case llvm::Triple::arm:
3406 // this->MCountName = "__mcount";
3407 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003408 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003409 }
Douglas Gregordca52262011-07-01 22:41:14 +00003410};
3411
3412namespace {
3413// x86-32 RTEMS target
3414class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3415public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003416 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003417 SizeType = UnsignedLong;
3418 IntPtrType = SignedLong;
3419 PtrDiffType = SignedLong;
3420 this->UserLabelPrefix = "";
3421 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003422 void getTargetDefines(const LangOptions &Opts,
3423 MacroBuilder &Builder) const override {
Douglas Gregordca52262011-07-01 22:41:14 +00003424 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3425 Builder.defineMacro("__INTEL__");
3426 Builder.defineMacro("__rtems__");
3427 }
3428};
3429} // end anonymous namespace
3430
Chris Lattnerf853e732010-04-11 19:29:39 +00003431namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00003432// x86-64 generic target
3433class X86_64TargetInfo : public X86TargetInfo {
3434public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003435 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Stephen Hines176edba2014-12-01 14:53:08 -08003436 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003437 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003438 LongDoubleWidth = 128;
3439 LongDoubleAlign = 128;
Rafael Espindolabfa7c002010-06-04 23:15:27 +00003440 LargeArrayMinWidth = 128;
3441 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003442 SuitableAlign = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003443 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3444 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3445 IntPtrType = IsX32 ? SignedInt : SignedLong;
3446 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003447 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00003448 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00003449
Stephen Hines176edba2014-12-01 14:53:08 -08003450 // Pointers are 32-bit in x32.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003451 DescriptionString = (IsX32)
Stephen Hines176edba2014-12-01 14:53:08 -08003452 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3453 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00003454
3455 // Use fpret only for long double.
3456 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003457
Anders Carlsson321b7ac2011-10-31 16:27:11 +00003458 // Use fp2ret for _Complex long double.
3459 ComplexLongDoubleUsesFP2Ret = true;
3460
Eli Friedman2be46072011-10-14 20:59:01 +00003461 // x86-64 has atomics up to 16 bytes.
Eli Friedman2be46072011-10-14 20:59:01 +00003462 MaxAtomicPromoteWidth = 128;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003463 MaxAtomicInlineWidth = 128;
Chris Lattner4b009652007-07-25 00:24:17 +00003464 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003465 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003466 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson7dd1c952007-11-24 23:38:12 +00003467 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00003468
Stephen Hines651f13c2014-04-23 16:59:28 -07003469 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattneraa339182009-09-23 06:06:36 +00003470 if (RegNo == 0) return 0;
3471 if (RegNo == 1) return 1;
3472 return -1;
3473 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003474
Stephen Hines651f13c2014-04-23 16:59:28 -07003475 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003476 return (CC == CC_C ||
Stephen Hines176edba2014-12-01 14:53:08 -08003477 CC == CC_X86VectorCall ||
Charles Davise8519c32013-08-30 04:39:01 +00003478 CC == CC_IntelOclBicc ||
3479 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003480 }
3481
Stephen Hines651f13c2014-04-23 16:59:28 -07003482 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballmanfff32482012-12-09 17:45:41 +00003483 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003484 }
3485
Stephen Hines176edba2014-12-01 14:53:08 -08003486 // for x32 we need it here explicitly
3487 bool hasInt128Type() const override { return true; }
Eli Friedman872996c2008-08-20 02:34:37 +00003488};
3489} // end anonymous namespace
3490
3491namespace {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003492// x86-64 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00003493class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003494public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003495 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3496 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003497 WCharType = UnsignedShort;
Mike Stump4da7a162009-10-08 23:00:00 +00003498 LongWidth = LongAlign = 32;
Michael J. Spencer3d796932010-10-18 07:10:59 +00003499 DoubleAlign = LongLongAlign = 64;
Nate Begeman472bd992010-07-21 02:02:56 +00003500 IntMaxType = SignedLongLong;
Nate Begeman472bd992010-07-21 02:02:56 +00003501 Int64Type = SignedLongLong;
Cameron Esfahani32083822010-09-15 00:28:12 +00003502 SizeType = UnsignedLongLong;
3503 PtrDiffType = SignedLongLong;
3504 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003505 this->UserLabelPrefix = "";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003506 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003507 void getTargetDefines(const LangOptions &Opts,
3508 MacroBuilder &Builder) const override {
Michael J. Spencer01e70082010-10-21 05:21:48 +00003509 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003510 Builder.defineMacro("_WIN64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003511 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003512 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00003513 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003514 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003515 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davise8519c32013-08-30 04:39:01 +00003516 return (CC == CC_C ||
Stephen Hines176edba2014-12-01 14:53:08 -08003517 CC == CC_X86VectorCall ||
Charles Davise8519c32013-08-30 04:39:01 +00003518 CC == CC_IntelOclBicc ||
3519 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3520 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003521};
3522} // end anonymous namespace
3523
3524namespace {
3525// x86-64 Windows Visual Studio target
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003526class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003527public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003528 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramer9df08232013-06-29 16:37:14 +00003529 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003530 LongDoubleWidth = LongDoubleAlign = 64;
3531 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003532 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003533 void getTargetDefines(const LangOptions &Opts,
3534 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003535 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003536 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003537 Builder.defineMacro("_M_X64");
Michael J. Spencer01e70082010-10-21 05:21:48 +00003538 Builder.defineMacro("_M_AMD64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003539 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003540};
3541} // end anonymous namespace
3542
3543namespace {
3544// x86-64 MinGW target
3545class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3546public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003547 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3548 : WindowsX86_64TargetInfo(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07003549 void getTargetDefines(const LangOptions &Opts,
3550 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003551 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00003552 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00003553 Builder.defineMacro("__MINGW64__");
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003554 addMinGWDefines(Opts, Builder);
Stephen Hines176edba2014-12-01 14:53:08 -08003555
3556 // GCC defines this macro when it is using __gxx_personality_seh0.
3557 if (!Opts.SjLjExceptions)
3558 Builder.defineMacro("__SEH__");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003559 }
3560};
3561} // end anonymous namespace
3562
3563namespace {
Eli Friedman38e31802009-07-01 03:36:11 +00003564class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3565public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003566 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3567 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman38e31802009-07-01 03:36:11 +00003568 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003569 MaxVectorAlign = 256;
Stephen Hines651f13c2014-04-23 16:59:28 -07003570 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3571 llvm::Triple T = llvm::Triple(Triple);
Stephen Hines176edba2014-12-01 14:53:08 -08003572 if (T.isiOS())
Stephen Hines651f13c2014-04-23 16:59:28 -07003573 UseSignedCharForObjCBool = false;
3574 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman38e31802009-07-01 03:36:11 +00003575 }
3576};
3577} // end anonymous namespace
3578
3579namespace {
Eli Friedman96ada022009-07-05 22:31:18 +00003580class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3581public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003582 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3583 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman96ada022009-07-05 22:31:18 +00003584 IntMaxType = SignedLongLong;
Eli Friedman96ada022009-07-05 22:31:18 +00003585 Int64Type = SignedLongLong;
3586 }
3587};
3588} // end anonymous namespace
3589
3590namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003591class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3592public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003593 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3594 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3595 IntMaxType = SignedLongLong;
Benjamin Kramer9df08232013-06-29 16:37:14 +00003596 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003597 }
3598};
Tim Northoverc264e162013-01-31 12:13:10 +00003599}
3600
Eli Friedman42f74f22012-08-08 23:57:20 +00003601
3602namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00003603class ARMTargetInfo : public TargetInfo {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003604 // Possible FPU choices.
3605 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003606 VFP2FPU = (1 << 0),
3607 VFP3FPU = (1 << 1),
3608 VFP4FPU = (1 << 2),
Bernard Ogdenf779e652013-10-24 18:32:51 +00003609 NeonFPU = (1 << 3),
3610 FPARMV8 = (1 << 4)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003611 };
3612
Silviu Baranga1db2e272013-10-21 10:54:53 +00003613 // Possible HWDiv features.
3614 enum HWDivMode {
3615 HWDivThumb = (1 << 0),
3616 HWDivARM = (1 << 1)
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003617 };
3618
3619 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenf779e652013-10-24 18:32:51 +00003620 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003621 }
3622
3623 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3624 static const char * const GCCRegNames[];
Daniel Dunbar40b774e2009-09-17 07:03:19 +00003625
Daniel Dunbar33b40752009-12-18 18:42:37 +00003626 std::string ABI, CPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003627
Rafael Espindola5389b842013-08-21 21:59:03 +00003628 enum {
3629 FP_Default,
3630 FP_VFP,
3631 FP_Neon
3632 } FPMath;
3633
Bernard Ogdenf779e652013-10-24 18:32:51 +00003634 unsigned FPU : 5;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003635
Logan Chieneae5a8202012-10-10 06:56:20 +00003636 unsigned IsAAPCS : 1;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003637 unsigned IsThumb : 1;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003638 unsigned HWDiv : 2;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003639
3640 // Initialized via features.
3641 unsigned SoftFloat : 1;
3642 unsigned SoftFloatABI : 1;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003643
Bernard Ogden909f35a2013-10-29 09:47:51 +00003644 unsigned CRC : 1;
Stephen Hines651f13c2014-04-23 16:59:28 -07003645 unsigned Crypto : 1;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003646
Stephen Hines176edba2014-12-01 14:53:08 -08003647 // ACLE 6.5.1 Hardware floating point
3648 enum {
3649 HW_FP_HP = (1 << 1), /// half (16-bit)
3650 HW_FP_SP = (1 << 2), /// single (32-bit)
3651 HW_FP_DP = (1 << 3), /// double (64-bit)
3652 };
3653 uint32_t HW_FP;
3654
Chris Lattnerb4527522010-03-03 19:03:45 +00003655 static const Builtin::Info BuiltinInfo[];
3656
Rafael Espindola620c0af2013-05-13 20:09:47 +00003657 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola620c0af2013-05-13 20:09:47 +00003658 StringRef ArchName = T.getArchName();
Stephen Hines651f13c2014-04-23 16:59:28 -07003659 if (T.getArch() == llvm::Triple::arm ||
3660 T.getArch() == llvm::Triple::armeb) {
3661 StringRef VersionStr;
3662 if (ArchName.startswith("armv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003663 VersionStr = ArchName.substr(4, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003664 else if (ArchName.startswith("armebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003665 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003666 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003667 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003668 unsigned Version;
3669 if (VersionStr.getAsInteger(10, Version))
3670 return false;
3671 return Version >= 6;
3672 }
Stephen Hines651f13c2014-04-23 16:59:28 -07003673 assert(T.getArch() == llvm::Triple::thumb ||
3674 T.getArch() == llvm::Triple::thumbeb);
3675 StringRef VersionStr;
3676 if (ArchName.startswith("thumbv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003677 VersionStr = ArchName.substr(6, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003678 else if (ArchName.startswith("thumbebv"))
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003679 VersionStr = ArchName.substr(8, 1);
Stephen Hines651f13c2014-04-23 16:59:28 -07003680 else
Rafael Espindola69db5552013-05-14 00:44:24 +00003681 return false;
Rafael Espindola69db5552013-05-14 00:44:24 +00003682 unsigned Version;
3683 if (VersionStr.getAsInteger(10, Version))
3684 return false;
3685 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003686 }
3687
Stephen Hines651f13c2014-04-23 16:59:28 -07003688 void setABIAAPCS() {
3689 IsAAPCS = true;
3690
3691 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3692 const llvm::Triple &T = getTriple();
3693
Stephen Hines176edba2014-12-01 14:53:08 -08003694 // size_t is unsigned long on MachO-derived environments and NetBSD.
3695 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003696 SizeType = UnsignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07003697 else
3698 SizeType = UnsignedInt;
3699
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003700 switch (T.getOS()) {
3701 case llvm::Triple::NetBSD:
Bill Wendling604470b2013-12-01 04:22:48 +00003702 WCharType = SignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003703 break;
3704 case llvm::Triple::Win32:
3705 WCharType = UnsignedShort;
3706 break;
3707 case llvm::Triple::Linux:
3708 default:
Bill Wendling604470b2013-12-01 04:22:48 +00003709 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3710 WCharType = UnsignedInt;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003711 break;
Stephen Hines651f13c2014-04-23 16:59:28 -07003712 }
3713
3714 UseBitFieldTypeAlignment = true;
3715
3716 ZeroLengthBitfieldBoundary = 0;
3717
Stephen Hines176edba2014-12-01 14:53:08 -08003718 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3719 // so set preferred for small types to 32.
3720 if (T.isOSBinFormatMachO()) {
3721 DescriptionString =
3722 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3723 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3724 } else if (T.isOSWindows()) {
3725 // FIXME: this is invalid for WindowsCE
3726 assert(!BigEndian && "Windows on ARM does not support big endian");
3727 DescriptionString = "e"
3728 "-m:e"
3729 "-p:32:32"
3730 "-i64:64"
3731 "-v128:64:128"
3732 "-a:0:32"
3733 "-n32"
3734 "-S64";
Stephen Hines651f13c2014-04-23 16:59:28 -07003735 } else {
Stephen Hines176edba2014-12-01 14:53:08 -08003736 DescriptionString =
3737 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3738 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Stephen Hines651f13c2014-04-23 16:59:28 -07003739 }
3740
3741 // FIXME: Enumerated types are variable width in straight AAPCS.
3742 }
3743
3744 void setABIAPCS() {
3745 const llvm::Triple &T = getTriple();
3746
3747 IsAAPCS = false;
3748
3749 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3750
3751 // size_t is unsigned int on FreeBSD.
3752 if (T.getOS() == llvm::Triple::FreeBSD)
Bill Wendling85ad3892013-12-02 19:19:57 +00003753 SizeType = UnsignedInt;
Stephen Hines651f13c2014-04-23 16:59:28 -07003754 else
3755 SizeType = UnsignedLong;
3756
3757 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3758 WCharType = SignedInt;
3759
3760 // Do not respect the alignment of bit-field types when laying out
3761 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3762 UseBitFieldTypeAlignment = false;
3763
3764 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3765 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3766 /// gcc.
3767 ZeroLengthBitfieldBoundary = 32;
3768
Stephen Hines176edba2014-12-01 14:53:08 -08003769 if (T.isOSBinFormatMachO())
3770 DescriptionString =
3771 BigEndian
3772 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3773 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3774 else
3775 DescriptionString =
3776 BigEndian
3777 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3778 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Stephen Hines651f13c2014-04-23 16:59:28 -07003779
3780 // FIXME: Override "preferred align" for double and long long.
3781 }
3782
3783public:
3784 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
3785 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Stephen Hines176edba2014-12-01 14:53:08 -08003786 IsAAPCS(true), HW_FP(0) {
Stephen Hines651f13c2014-04-23 16:59:28 -07003787 BigEndian = IsBigEndian;
3788
3789 switch (getTriple().getOS()) {
3790 case llvm::Triple::NetBSD:
3791 PtrDiffType = SignedLong;
3792 break;
3793 default:
Bill Wendling85ad3892013-12-02 19:19:57 +00003794 PtrDiffType = SignedInt;
Bill Wendling604470b2013-12-01 04:22:48 +00003795 break;
3796 }
Daniel Dunbarf0156562009-09-17 16:21:10 +00003797
Chris Lattnere20b8122010-04-23 16:29:58 +00003798 // {} in inline assembly are neon specifiers, not assembly variant
3799 // specifiers.
3800 NoAsmVariants = true;
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003801
Daniel Dunbar33b40752009-12-18 18:42:37 +00003802 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0a542ca2009-12-18 19:57:13 +00003803 IsThumb = getTriple().getArchName().startswith("thumb");
Stephen Hines651f13c2014-04-23 16:59:28 -07003804
3805 setABI("aapcs-linux");
John McCall68086b92010-08-21 22:46:04 +00003806
3807 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003808 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003809
3810 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003811 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003812 if (shouldUseInlineAtomic(getTriple()))
3813 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003814
3815 // Do force alignment of members that follow zero length bitfields. If
Stephen Hines176edba2014-12-01 14:53:08 -08003816 // the alignment of the zero-length bitfield is greater than the member
3817 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloye45b9b72012-03-12 09:14:10 +00003818 // zero length bitfield.
3819 UseZeroLengthBitfieldAlignment = true;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00003820 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07003821 StringRef getABI() const override { return ABI; }
Stephen Hines651f13c2014-04-23 16:59:28 -07003822 bool setABI(const std::string &Name) override {
Daniel Dunbar0d83d512009-09-14 00:35:03 +00003823 ABI = Name;
3824
Daniel Dunbarb9531632009-09-14 00:02:24 +00003825 // The defaults (above) are for AAPCS, check if we need to change them.
3826 //
3827 // FIXME: We need support for -meabi... we could just mangle it into the
3828 // name.
3829 if (Name == "apcs-gnu") {
Stephen Hines651f13c2014-04-23 16:59:28 -07003830 setABIAPCS();
3831 return true;
3832 }
3833 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3834 setABIAAPCS();
3835 return true;
3836 }
3837 return false;
Daniel Dunbarb9531632009-09-14 00:02:24 +00003838 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00003839
Stephen Hines651f13c2014-04-23 16:59:28 -07003840 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
3841 if (IsAAPCS)
3842 Features["aapcs"] = true;
3843 else
3844 Features["apcs"] = true;
3845
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003846 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003847 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3848 Features["vfp2"] = true;
Stephen Hines176edba2014-12-01 14:53:08 -08003849 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golin1302f9f2013-09-13 17:02:45 +00003850 Features["vfp3"] = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003851 Features["neon"] = true;
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003852 }
3853 else if (CPU == "cortex-a5") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003854 Features["vfp4"] = true;
3855 Features["neon"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003856 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3857 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Stephen Hines176edba2014-12-01 14:53:08 -08003858 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003859 Features["vfp4"] = true;
3860 Features["neon"] = true;
3861 Features["hwdiv"] = true;
3862 Features["hwdiv-arm"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003863 } else if (CPU == "cyclone") {
3864 Features["v8fp"] = true;
3865 Features["neon"] = true;
3866 Features["hwdiv"] = true;
3867 Features["hwdiv-arm"] = true;
Bernard Ogdenf779e652013-10-24 18:32:51 +00003868 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3869 Features["fp-armv8"] = true;
3870 Features["neon"] = true;
3871 Features["hwdiv"] = true;
3872 Features["hwdiv-arm"] = true;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003873 Features["crc"] = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07003874 Features["crypto"] = true;
3875 } else if (CPU == "cortex-r5" ||
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003876 // Enable the hwdiv extension for all v8a AArch32 cores by
3877 // default.
3878 ArchName == "armv8a" || ArchName == "armv8" ||
Stephen Hines651f13c2014-04-23 16:59:28 -07003879 ArchName == "armebv8a" || ArchName == "armebv8" ||
3880 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3881 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangac6c9cf42013-10-21 10:59:33 +00003882 Features["hwdiv"] = true;
3883 Features["hwdiv-arm"] = true;
Stephen Hines176edba2014-12-01 14:53:08 -08003884 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Stephen Hines651f13c2014-04-23 16:59:28 -07003885 Features["hwdiv"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003886 }
Daniel Dunbar96be2a42009-12-21 23:28:17 +00003887 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00003888
Stephen Hines651f13c2014-04-23 16:59:28 -07003889 bool handleTargetFeatures(std::vector<std::string> &Features,
3890 DiagnosticsEngine &Diags) override {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003891 FPU = 0;
Bernard Ogden909f35a2013-10-29 09:47:51 +00003892 CRC = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07003893 Crypto = 0;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003894 SoftFloat = SoftFloatABI = false;
Silviu Baranga1db2e272013-10-21 10:54:53 +00003895 HWDiv = 0;
Stephen Hines176edba2014-12-01 14:53:08 -08003896
3897 for (const auto &Feature : Features) {
3898 if (Feature == "+soft-float") {
Daniel Dunbar48075d82009-12-19 04:15:38 +00003899 SoftFloat = true;
Stephen Hines176edba2014-12-01 14:53:08 -08003900 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar48075d82009-12-19 04:15:38 +00003901 SoftFloatABI = true;
Stephen Hines176edba2014-12-01 14:53:08 -08003902 } else if (Feature == "+vfp2") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003903 FPU |= VFP2FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08003904 HW_FP = HW_FP_SP | HW_FP_DP;
3905 } else if (Feature == "+vfp3") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003906 FPU |= VFP3FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08003907 HW_FP = HW_FP_SP | HW_FP_DP;
3908 } else if (Feature == "+vfp4") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003909 FPU |= VFP4FPU;
Stephen Hines176edba2014-12-01 14:53:08 -08003910 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3911 } else if (Feature == "+fp-armv8") {
Bernard Ogdenf779e652013-10-24 18:32:51 +00003912 FPU |= FPARMV8;
Stephen Hines176edba2014-12-01 14:53:08 -08003913 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3914 } else if (Feature == "+neon") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003915 FPU |= NeonFPU;
Stephen Hines176edba2014-12-01 14:53:08 -08003916 HW_FP = HW_FP_SP | HW_FP_DP;
3917 } else if (Feature == "+long64") {
Stephen Hines64f85312011-10-21 14:54:52 -07003918 LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
Stephen Hines176edba2014-12-01 14:53:08 -08003919 } else if (Feature == "+hwdiv") {
Silviu Baranga1db2e272013-10-21 10:54:53 +00003920 HWDiv |= HWDivThumb;
Stephen Hines176edba2014-12-01 14:53:08 -08003921 } else if (Feature == "+hwdiv-arm") {
Silviu Baranga1db2e272013-10-21 10:54:53 +00003922 HWDiv |= HWDivARM;
Stephen Hines176edba2014-12-01 14:53:08 -08003923 } else if (Feature == "+crc") {
Bernard Ogden909f35a2013-10-29 09:47:51 +00003924 CRC = 1;
Stephen Hines176edba2014-12-01 14:53:08 -08003925 } else if (Feature == "+crypto") {
Stephen Hines651f13c2014-04-23 16:59:28 -07003926 Crypto = 1;
Stephen Hines176edba2014-12-01 14:53:08 -08003927 } else if (Feature == "+fp-only-sp") {
3928 HW_FP &= ~HW_FP_DP;
3929 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00003930 }
3931
Rafael Espindola5389b842013-08-21 21:59:03 +00003932 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3933 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3934 return false;
3935 }
3936
3937 if (FPMath == FP_Neon)
3938 Features.push_back("+neonfp");
3939 else if (FPMath == FP_VFP)
3940 Features.push_back("-neonfp");
3941
Daniel Dunbar48075d82009-12-19 04:15:38 +00003942 // Remove front-end specific options which the backend handles differently.
Stephen Hines176edba2014-12-01 14:53:08 -08003943 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3944 for (const auto &FEFeature : FrontEndFeatures) {
3945 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3946 if (Feature != Features.end())
3947 Features.erase(Feature);
3948 }
3949
Rafael Espindola5389b842013-08-21 21:59:03 +00003950 return true;
Daniel Dunbar48075d82009-12-19 04:15:38 +00003951 }
3952
Stephen Hines651f13c2014-04-23 16:59:28 -07003953 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00003954 return llvm::StringSwitch<bool>(Feature)
3955 .Case("arm", true)
3956 .Case("softfloat", SoftFloat)
3957 .Case("thumb", IsThumb)
Amara Emerson2440fb12013-09-16 18:07:35 +00003958 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Baranga1db2e272013-10-21 10:54:53 +00003959 .Case("hwdiv", HWDiv & HWDivThumb)
3960 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregore727d212012-01-30 06:38:25 +00003961 .Default(false);
3962 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003963 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003964 static const char *getCPUDefineSuffix(StringRef Name) {
Stephen Hines176edba2014-12-01 14:53:08 -08003965 return llvm::StringSwitch<const char *>(Name)
3966 .Cases("arm8", "arm810", "4")
3967 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
3968 "4")
3969 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3970 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3971 .Case("ep9312", "4T")
3972 .Cases("arm10tdmi", "arm1020t", "5T")
3973 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3974 .Case("arm926ej-s", "5TEJ")
3975 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3976 .Cases("xscale", "iwmmxt", "5TE")
3977 .Case("arm1136j-s", "6J")
3978 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
3979 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
3980 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
3981 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3982 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
3983 "7A")
3984 .Cases("cortex-r4", "cortex-r5", "7R")
3985 .Case("swift", "7S")
3986 .Case("cyclone", "8A")
3987 .Case("cortex-m3", "7M")
3988 .Cases("cortex-m4", "cortex-m7", "7EM")
3989 .Case("cortex-m0", "6M")
3990 .Cases("cortex-a53", "cortex-a57", "8A")
3991 .Default(nullptr);
Daniel Dunbar33b40752009-12-18 18:42:37 +00003992 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003993 static const char *getCPUProfile(StringRef Name) {
Stephen Hines176edba2014-12-01 14:53:08 -08003994 return llvm::StringSwitch<const char *>(Name)
3995 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
3996 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
3997 "A")
3998 .Cases("cortex-a53", "cortex-a57", "A")
3999 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4000 .Cases("cortex-r4", "cortex-r5", "R")
4001 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004002 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004003 bool setCPU(const std::string &Name) override {
Daniel Dunbar33b40752009-12-18 18:42:37 +00004004 if (!getCPUDefineSuffix(Name))
4005 return false;
4006
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004007 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4008 StringRef Profile = getCPUProfile(Name);
4009 if (Profile == "M" && MaxAtomicInlineWidth) {
4010 MaxAtomicPromoteWidth = 32;
4011 MaxAtomicInlineWidth = 32;
4012 }
4013
Daniel Dunbar33b40752009-12-18 18:42:37 +00004014 CPU = Name;
4015 return true;
4016 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004017 bool setFPMath(StringRef Name) override;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004018 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4019 unsigned CPUArchVer) const {
4020 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4021 (CPUArch.find('M') != StringRef::npos);
4022 }
4023 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4024 unsigned CPUArchVer) const {
4025 // We check both CPUArchVer and ArchName because when only triple is
4026 // specified, the default CPU is arm1136j-s.
4027 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4028 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4029 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004030 void getTargetDefines(const LangOptions &Opts,
4031 MacroBuilder &Builder) const override {
Chris Lattnerbef1d722009-03-02 22:27:17 +00004032 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004033 Builder.defineMacro("__arm");
4034 Builder.defineMacro("__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00004035
Chris Lattnerbef1d722009-03-02 22:27:17 +00004036 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004037 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004038
Chris Lattner5f9e2722011-07-23 10:55:15 +00004039 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden51f997d2013-10-24 18:32:44 +00004040 unsigned int CPUArchVer;
Stephen Hines176edba2014-12-01 14:53:08 -08004041 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden51f997d2013-10-24 18:32:44 +00004042 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004043 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004044
4045 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004046 StringRef CPUProfile = getCPUProfile(CPU);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004047 StringRef ArchName = getTriple().getArchName();
4048
4049 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4050 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Stephen Hines176edba2014-12-01 14:53:08 -08004051 if (CPUArch[0] >= '8') {
4052 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4053 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4054 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004055
4056 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4057 // is not defined for the M-profile.
4058 // NOTE that the deffault profile is assumed to be 'A'
4059 if (CPUProfile.empty() || CPUProfile != "M")
4060 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4061
4062 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4063 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4064 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4065 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4066 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4067 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4068 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4069
4070 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4071 // instruction set such as ARM or Thumb.
4072 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4073
4074 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4075
4076 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004077 if (!CPUProfile.empty())
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004078 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
4079
Stephen Hines176edba2014-12-01 14:53:08 -08004080 // ACLE 6.5.1 Hardware Floating Point
4081 if (HW_FP)
4082 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
4083
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004084 // ACLE predefines.
4085 Builder.defineMacro("__ARM_ACLE", "200");
Stephen Hines651f13c2014-04-23 16:59:28 -07004086
Mike Stumpf90a29f2009-04-08 02:07:04 +00004087 // Subtarget options.
Daniel Dunbarf0156562009-09-17 16:21:10 +00004088
Daniel Dunbar33b40752009-12-18 18:42:37 +00004089 // FIXME: It's more complicated than this and we don't really support
4090 // interworking.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004091 // Windows on ARM does not "support" interworking
4092 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004093 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004094
David Tweedb16abb12012-10-25 13:33:01 +00004095 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northover9b796302013-11-11 19:11:22 +00004096 // Embedded targets on Darwin follow AAPCS, but not EABI.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004097 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4098 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbar849289e2012-10-22 18:51:13 +00004099 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004100 Builder.defineMacro("__ARM_PCS", "1");
4101
David Tweedb16abb12012-10-25 13:33:01 +00004102 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00004103 Builder.defineMacro("__ARM_PCS_VFP", "1");
4104 }
Daniel Dunbar33b40752009-12-18 18:42:37 +00004105
Daniel Dunbar48075d82009-12-19 04:15:38 +00004106 if (SoftFloat)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004107 Builder.defineMacro("__SOFTFP__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00004108
4109 if (CPU == "xscale")
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004110 Builder.defineMacro("__XSCALE__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004111
4112 if (IsThumb) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004113 Builder.defineMacro("__THUMBEL__");
4114 Builder.defineMacro("__thumb__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004115 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004116 Builder.defineMacro("__thumb2__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004117 }
Silviu Baranga1db2e272013-10-21 10:54:53 +00004118 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4119 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbarf0156562009-09-17 16:21:10 +00004120
4121 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004122 Builder.defineMacro("__APCS_32__");
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004123
Bob Wilsoncfaab002012-09-29 23:52:52 +00004124 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004125 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00004126 if (FPU & VFP2FPU)
4127 Builder.defineMacro("__ARM_VFPV2__");
4128 if (FPU & VFP3FPU)
4129 Builder.defineMacro("__ARM_VFPV3__");
4130 if (FPU & VFP4FPU)
4131 Builder.defineMacro("__ARM_VFPV4__");
4132 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004133
Daniel Dunbar96be2a42009-12-21 23:28:17 +00004134 // This only gets set when Neon instructions are actually available, unlike
4135 // the VFP define, hence the soft float and arch check. This is subtly
4136 // different from gcc, we follow the intent which was that it should be set
4137 // when Neon instructions are actually available.
Stephen Hines651f13c2014-04-23 16:59:28 -07004138 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4139 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00004140 Builder.defineMacro("__ARM_NEON__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004141 }
4142
4143 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4144 Opts.ShortWChar ? "2" : "4");
4145
4146 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4147 Opts.ShortEnums ? "1" : "4");
Joey Gouly520ec1e2013-09-18 10:07:09 +00004148
Bernard Ogden909f35a2013-10-29 09:47:51 +00004149 if (CRC)
Joey Gouly520ec1e2013-09-18 10:07:09 +00004150 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao8712ded2013-09-30 22:51:32 +00004151
Stephen Hines651f13c2014-04-23 16:59:28 -07004152 if (Crypto)
4153 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4154
Bernard Ogden51f997d2013-10-24 18:32:44 +00004155 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao8712ded2013-09-30 22:51:32 +00004156 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4157 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4158 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4159 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4160 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004161 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004162 void getTargetBuiltins(const Builtin::Info *&Records,
4163 unsigned &NumRecords) const override {
Chris Lattnerb4527522010-03-03 19:03:45 +00004164 Records = BuiltinInfo;
4165 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner9fd73612008-04-21 18:56:49 +00004166 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004167 bool isCLZForZeroUndef() const override { return false; }
4168 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chieneae5a8202012-10-10 06:56:20 +00004169 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner9fd73612008-04-21 18:56:49 +00004170 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004171 void getGCCRegNames(const char * const *&Names,
4172 unsigned &NumNames) const override;
4173 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4174 unsigned &NumAliases) const override;
4175 bool validateAsmConstraint(const char *&Name,
4176 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson36834a72009-02-28 17:11:49 +00004177 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00004178 default: break;
Nate Begeman222823a2008-04-22 05:03:19 +00004179 case 'l': // r0-r7
4180 case 'h': // r8-r15
4181 case 'w': // VFP Floating point register single precision
4182 case 'P': // VFP Floating point register double precision
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00004183 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00004184 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00004185 case 'Q': // A memory address that is a single base register.
4186 Info.setAllowsMemory();
4187 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00004188 case 'U': // a memory reference...
4189 switch (Name[1]) {
4190 case 'q': // ...ARMV4 ldrsb
4191 case 'v': // ...VFP load/store (reg+constant offset)
4192 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00004193 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00004194 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00004195 case 'n': // valid address for Neon doubleword vector load/store
4196 case 'm': // valid address for Neon element and structure load/store
4197 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00004198 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00004199 Info.setAllowsMemory();
4200 Name++;
4201 return true;
4202 }
Nate Begeman222823a2008-04-22 05:03:19 +00004203 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004204 return false;
4205 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004206 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings002333f2011-06-07 23:45:05 +00004207 std::string R;
4208 switch (*Constraint) {
4209 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00004210 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00004211 Constraint++;
4212 break;
Eric Christopher283f4472011-06-17 00:40:18 +00004213 case 'p': // 'p' should be translated to 'r' by default.
4214 R = std::string("r");
4215 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00004216 default:
4217 return std::string(1, *Constraint);
4218 }
4219 return R;
4220 }
Stephen Hines176edba2014-12-01 14:53:08 -08004221 bool
4222 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4223 std::string &SuggestedModifier) const override {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004224 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00004225 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00004226
Bill Wendling50d46ca2012-10-25 23:28:48 +00004227 // Strip off constraint modifiers.
4228 while (Constraint[0] == '=' ||
4229 Constraint[0] == '+' ||
4230 Constraint[0] == '&')
4231 Constraint = Constraint.substr(1);
4232
4233 switch (Constraint[0]) {
4234 default: break;
4235 case 'r': {
4236 switch (Modifier) {
4237 default:
Bill Wendlingdd6669d2013-12-09 02:58:56 +00004238 return (isInOut || isOutput || Size <= 64);
Bill Wendling50d46ca2012-10-25 23:28:48 +00004239 case 'q':
4240 // A register of size 32 cannot fit a vector type.
4241 return false;
4242 }
4243 }
4244 }
4245
4246 return true;
4247 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004248 const char *getClobbers() const override {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004249 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00004250 return "";
4251 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00004252
Stephen Hines651f13c2014-04-23 16:59:28 -07004253 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballman82bfa192012-10-02 14:26:08 +00004254 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4255 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004256
Stephen Hines651f13c2014-04-23 16:59:28 -07004257 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00004258 if (RegNo == 0) return 0;
4259 if (RegNo == 1) return 1;
4260 return -1;
4261 }
Chris Lattner9fd73612008-04-21 18:56:49 +00004262};
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004263
Rafael Espindola5389b842013-08-21 21:59:03 +00004264bool ARMTargetInfo::setFPMath(StringRef Name) {
4265 if (Name == "neon") {
4266 FPMath = FP_Neon;
4267 return true;
4268 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4269 Name == "vfp4") {
4270 FPMath = FP_VFP;
4271 return true;
4272 }
4273 return false;
4274}
4275
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004276const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004277 // Integer registers
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004278 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004279 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4280
4281 // Float registers
4282 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4283 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4284 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004285 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00004286
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004287 // Double registers
4288 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4289 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesen0d79b042010-10-28 01:05:37 +00004290 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4291 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004292
4293 // Quad registers
Dale Johannesen0d79b042010-10-28 01:05:37 +00004294 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4295 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004296};
4297
4298void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004299 unsigned &NumNames) const {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004300 Names = GCCRegNames;
4301 NumNames = llvm::array_lengthof(GCCRegNames);
4302}
4303
4304const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004305 { { "a1" }, "r0" },
4306 { { "a2" }, "r1" },
4307 { { "a3" }, "r2" },
4308 { { "a4" }, "r3" },
4309 { { "v1" }, "r4" },
4310 { { "v2" }, "r5" },
4311 { { "v3" }, "r6" },
4312 { { "v4" }, "r7" },
4313 { { "v5" }, "r8" },
4314 { { "v6", "rfp" }, "r9" },
4315 { { "sl" }, "r10" },
4316 { { "fp" }, "r11" },
4317 { { "ip" }, "r12" },
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00004318 { { "r13" }, "sp" },
4319 { { "r14" }, "lr" },
4320 { { "r15" }, "pc" },
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00004321 // The S, D and Q registers overlap, but aren't really aliases; we
4322 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00004323};
4324
4325void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4326 unsigned &NumAliases) const {
4327 Aliases = GCCRegAliases;
4328 NumAliases = llvm::array_lengthof(GCCRegAliases);
4329}
Chris Lattnerb4527522010-03-03 19:03:45 +00004330
4331const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00004332#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00004333#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00004334 ALL_LANGUAGES },
Stephen Hines651f13c2014-04-23 16:59:28 -07004335#include "clang/Basic/BuiltinsNEON.def"
4336
4337#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004338#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Stephen Hines651f13c2014-04-23 16:59:28 -07004339#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4340 ALL_LANGUAGES },
Chris Lattnerb4527522010-03-03 19:03:45 +00004341#include "clang/Basic/BuiltinsARM.def"
4342};
Stephen Hines651f13c2014-04-23 16:59:28 -07004343
4344class ARMleTargetInfo : public ARMTargetInfo {
4345public:
4346 ARMleTargetInfo(const llvm::Triple &Triple)
4347 : ARMTargetInfo(Triple, false) { }
4348 virtual void getTargetDefines(const LangOptions &Opts,
4349 MacroBuilder &Builder) const {
4350 Builder.defineMacro("__ARMEL__");
4351 ARMTargetInfo::getTargetDefines(Opts, Builder);
4352 }
4353};
4354
4355class ARMbeTargetInfo : public ARMTargetInfo {
4356public:
4357 ARMbeTargetInfo(const llvm::Triple &Triple)
4358 : ARMTargetInfo(Triple, true) { }
4359 virtual void getTargetDefines(const LangOptions &Opts,
4360 MacroBuilder &Builder) const {
4361 Builder.defineMacro("__ARMEB__");
4362 Builder.defineMacro("__ARM_BIG_ENDIAN");
4363 ARMTargetInfo::getTargetDefines(Opts, Builder);
4364 }
4365};
Chris Lattner9fd73612008-04-21 18:56:49 +00004366} // end anonymous namespace.
4367
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004368namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004369class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4370 const llvm::Triple Triple;
4371public:
4372 WindowsARMTargetInfo(const llvm::Triple &Triple)
4373 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4374 TLSSupported = false;
4375 WCharType = UnsignedShort;
4376 SizeType = UnsignedInt;
4377 UserLabelPrefix = "";
4378 }
4379 void getVisualStudioDefines(const LangOptions &Opts,
4380 MacroBuilder &Builder) const {
4381 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4382
4383 // FIXME: this is invalid for WindowsCE
4384 Builder.defineMacro("_M_ARM_NT", "1");
4385 Builder.defineMacro("_M_ARMT", "_M_ARM");
4386 Builder.defineMacro("_M_THUMB", "_M_ARM");
4387
4388 assert((Triple.getArch() == llvm::Triple::arm ||
4389 Triple.getArch() == llvm::Triple::thumb) &&
4390 "invalid architecture for Windows ARM target info");
4391 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4392 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4393
4394 // TODO map the complete set of values
4395 // 31: VFPv3 40: VFPv4
4396 Builder.defineMacro("_M_ARM_FP", "31");
4397 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004398 BuiltinVaListKind getBuiltinVaListKind() const override {
4399 return TargetInfo::CharPtrBuiltinVaList;
4400 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004401};
4402
4403// Windows ARM + Itanium C++ ABI Target
4404class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4405public:
4406 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4407 : WindowsARMTargetInfo(Triple) {
4408 TheCXXABI.set(TargetCXXABI::GenericARM);
4409 }
4410
4411 void getTargetDefines(const LangOptions &Opts,
4412 MacroBuilder &Builder) const override {
4413 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4414
4415 if (Opts.MSVCCompat)
4416 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4417 }
4418};
4419
4420// Windows ARM, MS (C++) ABI
4421class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4422public:
4423 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4424 : WindowsARMTargetInfo(Triple) {
4425 TheCXXABI.set(TargetCXXABI::Microsoft);
4426 }
4427
4428 void getTargetDefines(const LangOptions &Opts,
4429 MacroBuilder &Builder) const override {
4430 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4431 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4432 }
4433};
4434}
4435
4436
4437namespace {
Mike Stump25cf7602009-09-09 15:08:12 +00004438class DarwinARMTargetInfo :
Stephen Hines651f13c2014-04-23 16:59:28 -07004439 public DarwinTargetInfo<ARMleTargetInfo> {
Edwin Török36565e52009-06-30 17:10:35 +00004440protected:
Stephen Hines651f13c2014-04-23 16:59:28 -07004441 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4442 MacroBuilder &Builder) const override {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004443 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedman8f575172009-04-19 21:38:35 +00004444 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004445
Edwin Török36565e52009-06-30 17:10:35 +00004446public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004447 DarwinARMTargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004448 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar01045582010-05-27 07:00:26 +00004449 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004450 // iOS always has 64-bit atomic instructions.
Stephen Hines176edba2014-12-01 14:53:08 -08004451 // FIXME: This should be based off of the target features in
4452 // ARMleTargetInfo.
Eli Friedman2be46072011-10-14 20:59:01 +00004453 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004454
4455 // Darwin on iOS uses a variant of the ARM C++ ABI.
4456 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar01045582010-05-27 07:00:26 +00004457 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00004458};
4459} // end anonymous namespace.
4460
Tony Linthicum96319392011-12-12 21:14:55 +00004461
4462namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004463class AArch64TargetInfo : public TargetInfo {
4464 virtual void setDescriptionString() = 0;
Stephen Hines651f13c2014-04-23 16:59:28 -07004465 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4466 static const char *const GCCRegNames[];
4467
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004468 enum FPUModeEnum {
4469 FPUMode,
4470 NeonMode
4471 };
4472
4473 unsigned FPU;
4474 unsigned CRC;
4475 unsigned Crypto;
4476
Stephen Hines651f13c2014-04-23 16:59:28 -07004477 static const Builtin::Info BuiltinInfo[];
4478
4479 std::string ABI;
4480
4481public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004482 AArch64TargetInfo(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07004483 : TargetInfo(Triple), ABI("aapcs") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004484
4485 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4486 WCharType = SignedInt;
4487
4488 // NetBSD apparently prefers consistency across ARM targets to consistency
4489 // across 64-bit targets.
4490 Int64Type = SignedLongLong;
4491 IntMaxType = SignedLongLong;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004492 } else {
4493 WCharType = UnsignedInt;
4494 Int64Type = SignedLong;
4495 IntMaxType = SignedLong;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004496 }
4497
Stephen Hines651f13c2014-04-23 16:59:28 -07004498 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Stephen Hines651f13c2014-04-23 16:59:28 -07004499 MaxVectorAlign = 128;
4500 RegParmMax = 8;
4501 MaxAtomicInlineWidth = 128;
4502 MaxAtomicPromoteWidth = 128;
4503
4504 LongDoubleWidth = LongDoubleAlign = 128;
4505 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4506
Stephen Hines651f13c2014-04-23 16:59:28 -07004507 // {} in inline assembly are neon specifiers, not assembly variant
4508 // specifiers.
4509 NoAsmVariants = true;
4510
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004511 // AArch64 targets default to using the ARM C++ ABI.
Stephen Hines651f13c2014-04-23 16:59:28 -07004512 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4513 }
4514
Stephen Hinesc568f1e2014-07-21 00:47:37 -07004515 StringRef getABI() const override { return ABI; }
Stephen Hines176edba2014-12-01 14:53:08 -08004516 bool setABI(const std::string &Name) override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004517 if (Name != "aapcs" && Name != "darwinpcs")
4518 return false;
4519
4520 ABI = Name;
4521 return true;
4522 }
4523
Stephen Hines176edba2014-12-01 14:53:08 -08004524 bool setCPU(const std::string &Name) override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004525 bool CPUKnown = llvm::StringSwitch<bool>(Name)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004526 .Case("generic", true)
4527 .Cases("cortex-a53", "cortex-a57", true)
Stephen Hines651f13c2014-04-23 16:59:28 -07004528 .Case("cyclone", true)
4529 .Default(false);
4530 return CPUKnown;
4531 }
4532
4533 virtual void getTargetDefines(const LangOptions &Opts,
Stephen Hines176edba2014-12-01 14:53:08 -08004534 MacroBuilder &Builder) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004535 // Target identification.
Stephen Hines651f13c2014-04-23 16:59:28 -07004536 Builder.defineMacro("__aarch64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004537
4538 // Target properties.
4539 Builder.defineMacro("_LP64");
4540 Builder.defineMacro("__LP64__");
Stephen Hines651f13c2014-04-23 16:59:28 -07004541
4542 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4543 Builder.defineMacro("__ARM_ACLE", "200");
4544 Builder.defineMacro("__ARM_ARCH", "8");
4545 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4546
4547 Builder.defineMacro("__ARM_64BIT_STATE");
4548 Builder.defineMacro("__ARM_PCS_AAPCS64");
4549 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4550
4551 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4552 Builder.defineMacro("__ARM_FEATURE_CLZ");
4553 Builder.defineMacro("__ARM_FEATURE_FMA");
4554 Builder.defineMacro("__ARM_FEATURE_DIV");
Stephen Hines176edba2014-12-01 14:53:08 -08004555 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4556 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4557 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4558 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Stephen Hines651f13c2014-04-23 16:59:28 -07004559
4560 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4561
4562 // 0xe implies support for half, single and double precision operations.
4563 Builder.defineMacro("__ARM_FP", "0xe");
4564
4565 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4566 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4567 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4568
4569 if (Opts.FastMath || Opts.FiniteMathOnly)
4570 Builder.defineMacro("__ARM_FP_FAST");
4571
Stephen Hines176edba2014-12-01 14:53:08 -08004572 if (Opts.C99 && !Opts.Freestanding)
Stephen Hines651f13c2014-04-23 16:59:28 -07004573 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4574
4575 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4576
4577 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4578 Opts.ShortEnums ? "1" : "4");
4579
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004580 if (FPU == NeonMode) {
4581 Builder.defineMacro("__ARM_NEON");
4582 // 64-bit NEON supports half, single and double precision operations.
4583 Builder.defineMacro("__ARM_NEON_FP", "0xe");
4584 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004585
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004586 if (CRC)
4587 Builder.defineMacro("__ARM_FEATURE_CRC32");
Stephen Hines651f13c2014-04-23 16:59:28 -07004588
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004589 if (Crypto)
4590 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Stephen Hines651f13c2014-04-23 16:59:28 -07004591 }
4592
4593 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Stephen Hines176edba2014-12-01 14:53:08 -08004594 unsigned &NumRecords) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004595 Records = BuiltinInfo;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004596 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Stephen Hines651f13c2014-04-23 16:59:28 -07004597 }
4598
Stephen Hines176edba2014-12-01 14:53:08 -08004599 bool hasFeature(StringRef Feature) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004600 return Feature == "aarch64" ||
4601 Feature == "arm64" ||
4602 (Feature == "neon" && FPU == NeonMode);
4603 }
4604
4605 bool handleTargetFeatures(std::vector<std::string> &Features,
4606 DiagnosticsEngine &Diags) override {
4607 FPU = FPUMode;
4608 CRC = 0;
4609 Crypto = 0;
4610 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4611 if (Features[i] == "+neon")
4612 FPU = NeonMode;
4613 if (Features[i] == "+crc")
4614 CRC = 1;
4615 if (Features[i] == "+crypto")
4616 Crypto = 1;
4617 }
4618
4619 setDescriptionString();
4620
4621 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004622 }
4623
Stephen Hines176edba2014-12-01 14:53:08 -08004624 bool isCLZForZeroUndef() const override { return false; }
Stephen Hines651f13c2014-04-23 16:59:28 -07004625
Stephen Hines176edba2014-12-01 14:53:08 -08004626 BuiltinVaListKind getBuiltinVaListKind() const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004627 return TargetInfo::AArch64ABIBuiltinVaList;
4628 }
4629
4630 virtual void getGCCRegNames(const char *const *&Names,
Stephen Hines176edba2014-12-01 14:53:08 -08004631 unsigned &NumNames) const override;
Stephen Hines651f13c2014-04-23 16:59:28 -07004632 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Stephen Hines176edba2014-12-01 14:53:08 -08004633 unsigned &NumAliases) const override;
Stephen Hines651f13c2014-04-23 16:59:28 -07004634
Stephen Hines176edba2014-12-01 14:53:08 -08004635 virtual bool
4636 validateAsmConstraint(const char *&Name,
4637 TargetInfo::ConstraintInfo &Info) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004638 switch (*Name) {
4639 default:
4640 return false;
4641 case 'w': // Floating point and SIMD registers (V0-V31)
4642 Info.setAllowsRegister();
4643 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004644 case 'I': // Constant that can be used with an ADD instruction
4645 case 'J': // Constant that can be used with a SUB instruction
4646 case 'K': // Constant that can be used with a 32-bit logical instruction
4647 case 'L': // Constant that can be used with a 64-bit logical instruction
4648 case 'M': // Constant that can be used as a 32-bit MOV immediate
4649 case 'N': // Constant that can be used as a 64-bit MOV immediate
4650 case 'Y': // Floating point constant zero
4651 case 'Z': // Integer constant zero
4652 return true;
4653 case 'Q': // A memory reference with base register and no offset
4654 Info.setAllowsMemory();
4655 return true;
4656 case 'S': // A symbolic address
4657 Info.setAllowsRegister();
4658 return true;
4659 case 'U':
Stephen Hines176edba2014-12-01 14:53:08 -08004660 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4661 // Utf: A memory address suitable for ldp/stp in TF mode.
4662 // Usa: An absolute symbolic address.
4663 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4664 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Stephen Hines651f13c2014-04-23 16:59:28 -07004665 case 'z': // Zero register, wzr or xzr
4666 Info.setAllowsRegister();
4667 return true;
4668 case 'x': // Floating point and SIMD registers (V0-V15)
4669 Info.setAllowsRegister();
4670 return true;
Stephen Hines651f13c2014-04-23 16:59:28 -07004671 }
4672 return false;
4673 }
4674
Stephen Hines176edba2014-12-01 14:53:08 -08004675 bool
4676 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4677 std::string &SuggestedModifier) const override {
4678 // Strip off constraint modifiers.
4679 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4680 Constraint = Constraint.substr(1);
Stephen Hines651f13c2014-04-23 16:59:28 -07004681
Stephen Hines176edba2014-12-01 14:53:08 -08004682 switch (Constraint[0]) {
4683 default:
4684 return true;
4685 case 'z':
4686 case 'r': {
4687 switch (Modifier) {
4688 case 'x':
4689 case 'w':
4690 // For now assume that the person knows what they're
4691 // doing with the modifier.
4692 return true;
4693 default:
4694 // By default an 'r' constraint will be in the 'x'
4695 // registers.
4696 if (Size == 64)
4697 return true;
4698
4699 SuggestedModifier = "w";
4700 return false;
4701 }
4702 }
4703 }
4704 }
4705
4706 const char *getClobbers() const override { return ""; }
4707
4708 int getEHDataRegisterNumber(unsigned RegNo) const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004709 if (RegNo == 0)
4710 return 0;
4711 if (RegNo == 1)
4712 return 1;
4713 return -1;
4714 }
4715};
4716
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004717const char *const AArch64TargetInfo::GCCRegNames[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004718 // 32-bit Integer registers
4719 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4720 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4721 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4722
4723 // 64-bit Integer registers
4724 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4725 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4726 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4727
4728 // 32-bit floating point regsisters
4729 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4730 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4731 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4732
4733 // 64-bit floating point regsisters
4734 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4735 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4736 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4737
4738 // Vector registers
4739 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4740 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4741 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4742};
4743
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004744void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Stephen Hines651f13c2014-04-23 16:59:28 -07004745 unsigned &NumNames) const {
4746 Names = GCCRegNames;
4747 NumNames = llvm::array_lengthof(GCCRegNames);
4748}
4749
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004750const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004751 { { "w31" }, "wsp" },
4752 { { "x29" }, "fp" },
4753 { { "x30" }, "lr" },
4754 { { "x31" }, "sp" },
4755 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4756 // don't want to substitute one of these for a different-sized one.
4757};
4758
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004759void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Stephen Hines651f13c2014-04-23 16:59:28 -07004760 unsigned &NumAliases) const {
4761 Aliases = GCCRegAliases;
4762 NumAliases = llvm::array_lengthof(GCCRegAliases);
4763}
4764
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004765const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Stephen Hines651f13c2014-04-23 16:59:28 -07004766#define BUILTIN(ID, TYPE, ATTRS) \
4767 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4768#include "clang/Basic/BuiltinsNEON.def"
4769
4770#define BUILTIN(ID, TYPE, ATTRS) \
4771 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004772#include "clang/Basic/BuiltinsAArch64.def"
4773};
4774
4775class AArch64leTargetInfo : public AArch64TargetInfo {
4776 void setDescriptionString() override {
4777 if (getTriple().isOSBinFormatMachO())
4778 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4779 else
4780 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4781 }
4782
4783public:
4784 AArch64leTargetInfo(const llvm::Triple &Triple)
4785 : AArch64TargetInfo(Triple) {
4786 BigEndian = false;
4787 }
4788 void getTargetDefines(const LangOptions &Opts,
4789 MacroBuilder &Builder) const override {
4790 Builder.defineMacro("__AARCH64EL__");
4791 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4792 }
4793};
4794
4795class AArch64beTargetInfo : public AArch64TargetInfo {
4796 void setDescriptionString() override {
4797 assert(!getTriple().isOSBinFormatMachO());
4798 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4799 }
4800
4801public:
4802 AArch64beTargetInfo(const llvm::Triple &Triple)
4803 : AArch64TargetInfo(Triple) { }
4804 void getTargetDefines(const LangOptions &Opts,
4805 MacroBuilder &Builder) const override {
4806 Builder.defineMacro("__AARCH64EB__");
4807 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4808 Builder.defineMacro("__ARM_BIG_ENDIAN");
4809 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4810 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004811};
4812} // end anonymous namespace.
4813
4814namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004815class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
4816protected:
4817 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4818 MacroBuilder &Builder) const override {
4819 Builder.defineMacro("__AARCH64_SIMD__");
4820 Builder.defineMacro("__ARM64_ARCH_8__");
4821 Builder.defineMacro("__ARM_NEON__");
4822 Builder.defineMacro("__LITTLE_ENDIAN__");
4823 Builder.defineMacro("__REGISTER_PREFIX__", "");
4824 Builder.defineMacro("__arm64", "1");
4825 Builder.defineMacro("__arm64__", "1");
4826
4827 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4828 }
4829
Stephen Hines651f13c2014-04-23 16:59:28 -07004830public:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004831 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4832 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07004833 Int64Type = SignedLongLong;
4834 WCharType = SignedInt;
4835 UseSignedCharForObjCBool = false;
4836
4837 LongDoubleWidth = LongDoubleAlign = 64;
4838 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4839
4840 TheCXXABI.set(TargetCXXABI::iOS64);
4841 }
4842
Stephen Hines176edba2014-12-01 14:53:08 -08004843 BuiltinVaListKind getBuiltinVaListKind() const override {
Stephen Hines651f13c2014-04-23 16:59:28 -07004844 return TargetInfo::CharPtrBuiltinVaList;
4845 }
4846};
4847} // end anonymous namespace
4848
4849namespace {
Tony Linthicum96319392011-12-12 21:14:55 +00004850// Hexagon abstract base class
4851class HexagonTargetInfo : public TargetInfo {
4852 static const Builtin::Info BuiltinInfo[];
4853 static const char * const GCCRegNames[];
4854 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4855 std::string CPU;
4856public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004857 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004858 BigEndian = false;
Stephen Hines651f13c2014-04-23 16:59:28 -07004859 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum96319392011-12-12 21:14:55 +00004860
4861 // {} in inline assembly are packet specifiers, not assembly variant
4862 // specifiers.
4863 NoAsmVariants = true;
4864 }
4865
Stephen Hines651f13c2014-04-23 16:59:28 -07004866 void getTargetBuiltins(const Builtin::Info *&Records,
4867 unsigned &NumRecords) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004868 Records = BuiltinInfo;
4869 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4870 }
4871
Stephen Hines651f13c2014-04-23 16:59:28 -07004872 bool validateAsmConstraint(const char *&Name,
4873 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004874 return true;
4875 }
4876
Stephen Hines651f13c2014-04-23 16:59:28 -07004877 void getTargetDefines(const LangOptions &Opts,
4878 MacroBuilder &Builder) const override;
Tony Linthicum96319392011-12-12 21:14:55 +00004879
Stephen Hines651f13c2014-04-23 16:59:28 -07004880 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00004881 return Feature == "hexagon";
4882 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004883
4884 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00004885 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00004886 }
Stephen Hines651f13c2014-04-23 16:59:28 -07004887 void getGCCRegNames(const char * const *&Names,
4888 unsigned &NumNames) const override;
4889 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4890 unsigned &NumAliases) const override;
4891 const char *getClobbers() const override {
Tony Linthicum96319392011-12-12 21:14:55 +00004892 return "";
4893 }
Sebastian Pop43115d42012-01-13 20:37:10 +00004894
4895 static const char *getHexagonCPUSuffix(StringRef Name) {
4896 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00004897 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00004898 .Case("hexagonv5", "5")
Stephen Hines6bcf27b2014-05-29 04:14:42 -07004899 .Default(nullptr);
Sebastian Pop43115d42012-01-13 20:37:10 +00004900 }
4901
Stephen Hines651f13c2014-04-23 16:59:28 -07004902 bool setCPU(const std::string &Name) override {
Sebastian Pop43115d42012-01-13 20:37:10 +00004903 if (!getHexagonCPUSuffix(Name))
4904 return false;
4905
Tony Linthicum96319392011-12-12 21:14:55 +00004906 CPU = Name;
4907 return true;
4908 }
4909};
4910
4911void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4912 MacroBuilder &Builder) const {
4913 Builder.defineMacro("qdsp6");
4914 Builder.defineMacro("__qdsp6", "1");
4915 Builder.defineMacro("__qdsp6__", "1");
4916
4917 Builder.defineMacro("hexagon");
4918 Builder.defineMacro("__hexagon", "1");
4919 Builder.defineMacro("__hexagon__", "1");
4920
4921 if(CPU == "hexagonv1") {
4922 Builder.defineMacro("__HEXAGON_V1__");
4923 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4924 if(Opts.HexagonQdsp6Compat) {
4925 Builder.defineMacro("__QDSP6_V1__");
4926 Builder.defineMacro("__QDSP6_ARCH__", "1");
4927 }
4928 }
4929 else if(CPU == "hexagonv2") {
4930 Builder.defineMacro("__HEXAGON_V2__");
4931 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4932 if(Opts.HexagonQdsp6Compat) {
4933 Builder.defineMacro("__QDSP6_V2__");
4934 Builder.defineMacro("__QDSP6_ARCH__", "2");
4935 }
4936 }
4937 else if(CPU == "hexagonv3") {
4938 Builder.defineMacro("__HEXAGON_V3__");
4939 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4940 if(Opts.HexagonQdsp6Compat) {
4941 Builder.defineMacro("__QDSP6_V3__");
4942 Builder.defineMacro("__QDSP6_ARCH__", "3");
4943 }
4944 }
4945 else if(CPU == "hexagonv4") {
4946 Builder.defineMacro("__HEXAGON_V4__");
4947 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4948 if(Opts.HexagonQdsp6Compat) {
4949 Builder.defineMacro("__QDSP6_V4__");
4950 Builder.defineMacro("__QDSP6_ARCH__", "4");
4951 }
4952 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004953 else if(CPU == "hexagonv5") {
4954 Builder.defineMacro("__HEXAGON_V5__");
4955 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4956 if(Opts.HexagonQdsp6Compat) {
4957 Builder.defineMacro("__QDSP6_V5__");
4958 Builder.defineMacro("__QDSP6_ARCH__", "5");
4959 }
4960 }
Tony Linthicum96319392011-12-12 21:14:55 +00004961}
4962
4963const char * const HexagonTargetInfo::GCCRegNames[] = {
4964 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4965 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4966 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4967 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4968 "p0", "p1", "p2", "p3",
4969 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4970};
4971
4972void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4973 unsigned &NumNames) const {
4974 Names = GCCRegNames;
4975 NumNames = llvm::array_lengthof(GCCRegNames);
4976}
4977
4978
4979const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4980 { { "sp" }, "r29" },
4981 { { "fp" }, "r30" },
4982 { { "lr" }, "r31" },
4983 };
4984
4985void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4986 unsigned &NumAliases) const {
4987 Aliases = GCCRegAliases;
4988 NumAliases = llvm::array_lengthof(GCCRegAliases);
4989}
4990
4991
4992const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4993#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4994#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4995 ALL_LANGUAGES },
4996#include "clang/Basic/BuiltinsHexagon.def"
4997};
4998}
4999
5000
Chris Lattner4b009652007-07-25 00:24:17 +00005001namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005002// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5003class SparcTargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005004 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5005 static const char * const GCCRegNames[];
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005006 bool SoftFloat;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005007public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005008 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005009
Stephen Hines651f13c2014-04-23 16:59:28 -07005010 bool handleTargetFeatures(std::vector<std::string> &Features,
5011 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005012 SoftFloat = false;
5013 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5014 if (Features[i] == "+soft-float")
5015 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00005016 return true;
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005017 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005018 void getTargetDefines(const LangOptions &Opts,
5019 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005020 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005021 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00005022
5023 if (SoftFloat)
5024 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005025 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005026
5027 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005028 return llvm::StringSwitch<bool>(Feature)
5029 .Case("softfloat", SoftFloat)
5030 .Case("sparc", true)
5031 .Default(false);
5032 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005033
5034 void getTargetBuiltins(const Builtin::Info *&Records,
5035 unsigned &NumRecords) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005036 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005037 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005038 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005039 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005040 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005041 void getGCCRegNames(const char * const *&Names,
5042 unsigned &NumNames) const override;
5043 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5044 unsigned &NumAliases) const override;
5045 bool validateAsmConstraint(const char *&Name,
5046 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005047 // FIXME: Implement!
5048 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005049 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005050 const char *getClobbers() const override {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005051 // FIXME: Implement!
5052 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005053 }
5054};
5055
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005056const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005057 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5058 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5059 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5060 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5061};
5062
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005063void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5064 unsigned &NumNames) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005065 Names = GCCRegNames;
5066 NumNames = llvm::array_lengthof(GCCRegNames);
5067}
5068
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005069const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikove7772382009-05-03 13:42:53 +00005070 { { "g0" }, "r0" },
5071 { { "g1" }, "r1" },
5072 { { "g2" }, "r2" },
5073 { { "g3" }, "r3" },
5074 { { "g4" }, "r4" },
5075 { { "g5" }, "r5" },
5076 { { "g6" }, "r6" },
5077 { { "g7" }, "r7" },
5078 { { "o0" }, "r8" },
5079 { { "o1" }, "r9" },
5080 { { "o2" }, "r10" },
5081 { { "o3" }, "r11" },
5082 { { "o4" }, "r12" },
5083 { { "o5" }, "r13" },
5084 { { "o6", "sp" }, "r14" },
5085 { { "o7" }, "r15" },
5086 { { "l0" }, "r16" },
5087 { { "l1" }, "r17" },
5088 { { "l2" }, "r18" },
5089 { { "l3" }, "r19" },
5090 { { "l4" }, "r20" },
5091 { { "l5" }, "r21" },
5092 { { "l6" }, "r22" },
5093 { { "l7" }, "r23" },
5094 { { "i0" }, "r24" },
5095 { { "i1" }, "r25" },
5096 { { "i2" }, "r26" },
5097 { { "i3" }, "r27" },
5098 { { "i4" }, "r28" },
5099 { { "i5" }, "r29" },
5100 { { "i6", "fp" }, "r30" },
5101 { { "i7" }, "r31" },
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005102};
5103
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005104void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5105 unsigned &NumAliases) const {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00005106 Aliases = GCCRegAliases;
5107 NumAliases = llvm::array_lengthof(GCCRegAliases);
5108}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005109
5110// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5111class SparcV8TargetInfo : public SparcTargetInfo {
5112public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005113 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Stephen Hines651f13c2014-04-23 16:59:28 -07005114 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005115 }
5116
Stephen Hines651f13c2014-04-23 16:59:28 -07005117 void getTargetDefines(const LangOptions &Opts,
5118 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005119 SparcTargetInfo::getTargetDefines(Opts, Builder);
5120 Builder.defineMacro("__sparcv8");
5121 }
5122};
5123
5124// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5125class SparcV9TargetInfo : public SparcTargetInfo {
5126public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005127 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005128 // FIXME: Support Sparc quad-precision long double?
Stephen Hines651f13c2014-04-23 16:59:28 -07005129 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00005130 // This is an LP64 platform.
5131 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005132
5133 // OpenBSD uses long long for int64_t and intmax_t.
Stephen Hines176edba2014-12-01 14:53:08 -08005134 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005135 IntMaxType = SignedLongLong;
Stephen Hines176edba2014-12-01 14:53:08 -08005136 else
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005137 IntMaxType = SignedLong;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00005138 Int64Type = IntMaxType;
Stephen Hines651f13c2014-04-23 16:59:28 -07005139
5140 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5141 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5142 LongDoubleWidth = 128;
5143 LongDoubleAlign = 128;
5144 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5145 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005146 }
5147
Stephen Hines651f13c2014-04-23 16:59:28 -07005148 void getTargetDefines(const LangOptions &Opts,
5149 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005150 SparcTargetInfo::getTargetDefines(Opts, Builder);
5151 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00005152 Builder.defineMacro("__arch64__");
Stephen Hines176edba2014-12-01 14:53:08 -08005153 // Solaris doesn't need these variants, but the BSDs do.
5154 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00005155 Builder.defineMacro("__sparc64__");
5156 Builder.defineMacro("__sparc_v9__");
5157 Builder.defineMacro("__sparcv9__");
5158 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005159 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005160
5161 bool setCPU(const std::string &Name) override {
5162 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5163 .Case("v9", true)
5164 .Case("ultrasparc", true)
5165 .Case("ultrasparc3", true)
5166 .Case("niagara", true)
5167 .Case("niagara2", true)
5168 .Case("niagara3", true)
5169 .Case("niagara4", true)
5170 .Default(false);
5171
5172 // No need to store the CPU yet. There aren't any CPU-specific
5173 // macros to define.
5174 return CPUKnown;
5175 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005176};
5177
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00005178} // end anonymous namespace.
5179
Eli Friedmanff158dd2008-08-20 07:28:14 +00005180namespace {
Edwin Török36565e52009-06-30 17:10:35 +00005181class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanff158dd2008-08-20 07:28:14 +00005182public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005183 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5184 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedman7cca0982008-11-02 02:43:55 +00005185 SizeType = UnsignedInt;
5186 PtrDiffType = SignedInt;
Eli Friedmanff158dd2008-08-20 07:28:14 +00005187 }
5188};
5189} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00005190
Chris Lattner85970f32008-05-08 05:58:21 +00005191namespace {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005192class SystemZTargetInfo : public TargetInfo {
5193 static const char *const GCCRegNames[];
Ulrich Weigandb8409212013-05-06 16:26:41 +00005194
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005195public:
5196 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5197 TLSSupported = true;
5198 IntWidth = IntAlign = 32;
5199 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5200 PointerWidth = PointerAlign = 64;
5201 LongDoubleWidth = 128;
5202 LongDoubleAlign = 64;
5203 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5204 MinGlobalAlign = 16;
5205 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5206 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5207 }
5208 void getTargetDefines(const LangOptions &Opts,
5209 MacroBuilder &Builder) const override {
5210 Builder.defineMacro("__s390__");
5211 Builder.defineMacro("__s390x__");
5212 Builder.defineMacro("__zarch__");
5213 Builder.defineMacro("__LONG_DOUBLE_128__");
5214 }
5215 void getTargetBuiltins(const Builtin::Info *&Records,
5216 unsigned &NumRecords) const override {
5217 // FIXME: Implement.
5218 Records = nullptr;
5219 NumRecords = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005220 }
5221
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005222 void getGCCRegNames(const char *const *&Names,
5223 unsigned &NumNames) const override;
5224 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5225 unsigned &NumAliases) const override {
5226 // No aliases.
5227 Aliases = nullptr;
5228 NumAliases = 0;
Ulrich Weigandb8409212013-05-06 16:26:41 +00005229 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005230 bool validateAsmConstraint(const char *&Name,
5231 TargetInfo::ConstraintInfo &info) const override;
5232 const char *getClobbers() const override {
5233 // FIXME: Is this really right?
5234 return "";
5235 }
5236 BuiltinVaListKind getBuiltinVaListKind() const override {
5237 return TargetInfo::SystemZBuiltinVaList;
5238 }
5239 bool setCPU(const std::string &Name) override {
5240 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5241 .Case("z10", true)
5242 .Case("z196", true)
5243 .Case("zEC12", true)
5244 .Default(false);
5245
5246 // No need to store the CPU yet. There aren't any CPU-specific
5247 // macros to define.
5248 return CPUKnown;
5249 }
5250};
5251
5252const char *const SystemZTargetInfo::GCCRegNames[] = {
5253 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5254 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5255 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5256 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5257};
5258
5259void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5260 unsigned &NumNames) const {
5261 Names = GCCRegNames;
5262 NumNames = llvm::array_lengthof(GCCRegNames);
5263}
5264
5265bool SystemZTargetInfo::
5266validateAsmConstraint(const char *&Name,
5267 TargetInfo::ConstraintInfo &Info) const {
5268 switch (*Name) {
5269 default:
5270 return false;
5271
5272 case 'a': // Address register
5273 case 'd': // Data register (equivalent to 'r')
5274 case 'f': // Floating-point register
5275 Info.setAllowsRegister();
5276 return true;
5277
5278 case 'I': // Unsigned 8-bit constant
5279 case 'J': // Unsigned 12-bit constant
5280 case 'K': // Signed 16-bit constant
5281 case 'L': // Signed 20-bit displacement (on all targets we support)
5282 case 'M': // 0x7fffffff
5283 return true;
5284
5285 case 'Q': // Memory with base and unsigned 12-bit displacement
5286 case 'R': // Likewise, plus an index
5287 case 'S': // Memory with base and signed 20-bit displacement
5288 case 'T': // Likewise, plus an index
5289 Info.setAllowsMemory();
5290 return true;
5291 }
5292}
Ulrich Weigandb8409212013-05-06 16:26:41 +00005293}
5294
5295namespace {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005296 class MSP430TargetInfo : public TargetInfo {
5297 static const char * const GCCRegNames[];
5298 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005299 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005300 BigEndian = false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005301 TLSSupported = false;
Anton Korobeynikov2a6630a2010-01-30 12:55:11 +00005302 IntWidth = 16; IntAlign = 16;
5303 LongWidth = 32; LongLongWidth = 64;
5304 LongAlign = LongLongAlign = 16;
5305 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005306 SuitableAlign = 16;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005307 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005308 IntMaxType = SignedLongLong;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00005309 IntPtrType = SignedInt;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005310 PtrDiffType = SignedInt;
Edward O'Callaghan14a70a32009-11-21 00:49:54 +00005311 SigAtomicType = SignedLong;
Stephen Hines176edba2014-12-01 14:53:08 -08005312 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Stephen Hines651f13c2014-04-23 16:59:28 -07005313 }
5314 void getTargetDefines(const LangOptions &Opts,
5315 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005316 Builder.defineMacro("MSP430");
5317 Builder.defineMacro("__MSP430__");
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005318 // FIXME: defines for different 'flavours' of MCU
5319 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005320 void getTargetBuiltins(const Builtin::Info *&Records,
5321 unsigned &NumRecords) const override {
5322 // FIXME: Implement.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005323 Records = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005324 NumRecords = 0;
5325 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005326 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005327 return Feature == "msp430";
5328 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005329 void getGCCRegNames(const char * const *&Names,
5330 unsigned &NumNames) const override;
5331 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5332 unsigned &NumAliases) const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005333 // No aliases.
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005334 Aliases = nullptr;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005335 NumAliases = 0;
5336 }
Stephen Hines176edba2014-12-01 14:53:08 -08005337 bool
5338 validateAsmConstraint(const char *&Name,
5339 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov174219b2009-10-15 23:17:13 +00005340 // No target constraints for now.
5341 return false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005342 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005343 const char *getClobbers() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005344 // FIXME: Is this really right?
5345 return "";
5346 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005347 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005348 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00005349 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00005350 }
5351 };
5352
5353 const char * const MSP430TargetInfo::GCCRegNames[] = {
5354 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5355 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5356 };
5357
5358 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5359 unsigned &NumNames) const {
5360 Names = GCCRegNames;
5361 NumNames = llvm::array_lengthof(GCCRegNames);
5362 }
5363}
5364
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00005365namespace {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005366
Mike Stump25cf7602009-09-09 15:08:12 +00005367 // LLVM and Clang cannot be used directly to output native binaries for
5368 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005369 // type and alignment information.
Mike Stump25cf7602009-09-09 15:08:12 +00005370 //
5371 // TCE uses the llvm bitcode as input and uses it for generating customized
5372 // target processor and program binary. TCE co-design environment is
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005373 // publicly available in http://tce.cs.tut.fi
5374
Eli Friedman209f5bb2011-10-07 19:51:42 +00005375 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5376 3, // opencl_global
5377 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00005378 5, // opencl_constant
5379 0, // cuda_device
5380 0, // cuda_constant
5381 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00005382 };
5383
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005384 class TCETargetInfo : public TargetInfo{
5385 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005386 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005387 TLSSupported = false;
5388 IntWidth = 32;
5389 LongWidth = LongLongWidth = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005390 PointerWidth = 32;
5391 IntAlign = 32;
5392 LongAlign = LongLongAlign = 32;
5393 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005394 SuitableAlign = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005395 SizeType = UnsignedInt;
5396 IntMaxType = SignedLong;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005397 IntPtrType = SignedInt;
5398 PtrDiffType = SignedInt;
5399 FloatWidth = 32;
5400 FloatAlign = 32;
5401 DoubleWidth = 32;
5402 DoubleAlign = 32;
5403 LongDoubleWidth = 32;
5404 LongDoubleAlign = 32;
5405 FloatFormat = &llvm::APFloat::IEEEsingle;
5406 DoubleFormat = &llvm::APFloat::IEEEsingle;
5407 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Stephen Hines651f13c2014-04-23 16:59:28 -07005408 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5409 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00005410 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00005411 UseAddrSpaceMapMangling = true;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005412 }
5413
Stephen Hines651f13c2014-04-23 16:59:28 -07005414 void getTargetDefines(const LangOptions &Opts,
5415 MacroBuilder &Builder) const override {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00005416 DefineStd(Builder, "tce", Opts);
5417 Builder.defineMacro("__TCE__");
5418 Builder.defineMacro("__TCE_V1__");
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005419 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005420 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00005421 return Feature == "tce";
5422 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005423
5424 void getTargetBuiltins(const Builtin::Info *&Records,
5425 unsigned &NumRecords) const override {}
5426 const char *getClobbers() const override {
Daniel Dunbar2e967de2009-08-24 09:54:37 +00005427 return "";
5428 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005429 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005430 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005431 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005432 void getGCCRegNames(const char * const *&Names,
5433 unsigned &NumNames) const override {}
5434 bool validateAsmConstraint(const char *&Name,
5435 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005436 return true;
5437 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005438 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5439 unsigned &NumAliases) const override {}
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00005440 };
5441}
5442
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005443namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005444class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005445 virtual void setDescriptionString() = 0;
5446
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005447 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005448 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005449 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005450 bool IsMicromips;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005451 bool IsNan2008;
Simon Atanasyand96e3152013-04-14 14:07:30 +00005452 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005453 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00005454 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005455 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005456 enum DspRevEnum {
5457 NoDSP, DSP1, DSP2
5458 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00005459 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005460
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005461protected:
Akira Hatanaka550ed202013-10-29 19:00:35 +00005462 bool HasFP64;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005463 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005464
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005465public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005466 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5467 const std::string &CPUStr)
5468 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005469 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005470 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005471
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005472 bool isNaN2008Default() const {
5473 return CPU == "mips32r6" || CPU == "mips64r6";
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005474 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005475
5476 bool isFP64Default() const {
5477 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5478 }
5479
5480 StringRef getABI() const override { return ABI; }
5481 bool setCPU(const std::string &Name) override {
5482 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5483 getTriple().getArch() == llvm::Triple::mipsel;
5484 CPU = Name;
5485 return llvm::StringSwitch<bool>(Name)
5486 .Case("mips1", IsMips32)
5487 .Case("mips2", IsMips32)
5488 .Case("mips3", true)
5489 .Case("mips4", true)
5490 .Case("mips5", true)
5491 .Case("mips32", IsMips32)
5492 .Case("mips32r2", IsMips32)
5493 .Case("mips32r6", IsMips32)
5494 .Case("mips64", true)
5495 .Case("mips64r2", true)
5496 .Case("mips64r6", true)
5497 .Case("octeon", true)
5498 .Default(false);
5499 }
5500 const std::string& getCPU() const { return CPU; }
Stephen Hines651f13c2014-04-23 16:59:28 -07005501 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5502 // The backend enables certain ABI's by default according to the
5503 // architecture.
5504 // Disable both possible defaults so that we don't end up with multiple
5505 // ABI's selected and trigger an assertion.
5506 Features["o32"] = false;
5507 Features["n64"] = false;
5508
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005509 Features[ABI] = true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005510 if (CPU == "octeon")
5511 Features["mips64r2"] = Features["cnmips"] = true;
5512 else
5513 Features[CPU] = true;
Eric Christopher03cc0ef2010-03-02 02:41:08 +00005514 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005515
Stephen Hines651f13c2014-04-23 16:59:28 -07005516 void getTargetDefines(const LangOptions &Opts,
5517 MacroBuilder &Builder) const override {
5518 Builder.defineMacro("__mips__");
Simon Atanasyand4935a02012-08-29 19:14:58 +00005519 Builder.defineMacro("_mips");
Stephen Hines651f13c2014-04-23 16:59:28 -07005520 if (Opts.GNUMode)
5521 Builder.defineMacro("mips");
5522
Simon Atanasyand4935a02012-08-29 19:14:58 +00005523 Builder.defineMacro("__REGISTER_PREFIX__", "");
5524
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005525 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005526 case HardFloat:
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005527 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005528 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005529 case SoftFloat:
5530 Builder.defineMacro("__mips_soft_float", Twine(1));
5531 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00005532 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005533
Simon Atanasyand96e3152013-04-14 14:07:30 +00005534 if (IsSingleFloat)
5535 Builder.defineMacro("__mips_single_float", Twine(1));
5536
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005537 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5538 Builder.defineMacro("_MIPS_FPSET",
5539 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5540
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005541 if (IsMips16)
5542 Builder.defineMacro("__mips16", Twine(1));
5543
Simon Atanasyan321ae792013-04-14 14:07:51 +00005544 if (IsMicromips)
5545 Builder.defineMacro("__mips_micromips", Twine(1));
5546
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005547 if (IsNan2008)
5548 Builder.defineMacro("__mips_nan2008", Twine(1));
5549
Simon Atanasyana1b62272012-07-05 20:16:22 +00005550 switch (DspRev) {
5551 default:
5552 break;
5553 case DSP1:
5554 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5555 Builder.defineMacro("__mips_dsp", Twine(1));
5556 break;
5557 case DSP2:
5558 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5559 Builder.defineMacro("__mips_dspr2", Twine(1));
5560 Builder.defineMacro("__mips_dsp", Twine(1));
5561 break;
5562 }
Simon Atanasyan90913892012-04-05 19:28:31 +00005563
Jack Carterc613b672013-08-12 17:20:29 +00005564 if (HasMSA)
5565 Builder.defineMacro("__mips_msa", Twine(1));
5566
Simon Atanasyan90913892012-04-05 19:28:31 +00005567 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5568 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5569 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00005570
5571 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5572 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005573 }
5574
Stephen Hines651f13c2014-04-23 16:59:28 -07005575 void getTargetBuiltins(const Builtin::Info *&Records,
5576 unsigned &NumRecords) const override {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005577 Records = BuiltinInfo;
5578 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005579 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005580 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka550ed202013-10-29 19:00:35 +00005581 return llvm::StringSwitch<bool>(Feature)
5582 .Case("mips", true)
5583 .Case("fp64", HasFP64)
5584 .Default(false);
Douglas Gregore727d212012-01-30 06:38:25 +00005585 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005586 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00005587 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005588 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005589 void getGCCRegNames(const char * const *&Names,
5590 unsigned &NumNames) const override {
Daniel Sanders838f9332013-11-12 12:56:01 +00005591 static const char *const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00005592 // CPU register names
5593 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005594 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5595 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5596 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005597 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5598 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005599 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5600 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5601 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5602 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00005603 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005604 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders838f9332013-11-12 12:56:01 +00005605 "$fcc5","$fcc6","$fcc7",
5606 // MSA register names
5607 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5608 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5609 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5610 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5611 // MSA control register names
5612 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5613 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005614 };
5615 Names = GCCRegNames;
5616 NumNames = llvm::array_lengthof(GCCRegNames);
5617 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005618 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5619 unsigned &NumAliases) const override = 0;
5620 bool validateAsmConstraint(const char *&Name,
5621 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005622 switch (*Name) {
5623 default:
Douglas Gregora95cba92011-11-02 20:52:01 +00005624 return false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005625 case 'r': // CPU registers.
5626 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Stephen Hines176edba2014-12-01 14:53:08 -08005627 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005628 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00005629 case 'c': // $25 for indirect jumps
5630 case 'l': // lo register
5631 case 'x': // hilo register pair
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005632 Info.setAllowsRegister();
5633 return true;
Jack Carter97102302013-03-05 19:10:54 +00005634 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00005635 Info.setAllowsMemory();
5636 return true;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005637 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005638 }
5639
Stephen Hines651f13c2014-04-23 16:59:28 -07005640 const char *getClobbers() const override {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005641 // FIXME: Implement!
5642 return "";
5643 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005644
Stephen Hines651f13c2014-04-23 16:59:28 -07005645 bool handleTargetFeatures(std::vector<std::string> &Features,
5646 DiagnosticsEngine &Diags) override {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005647 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005648 IsMicromips = false;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005649 IsNan2008 = isNaN2008Default();
Simon Atanasyand96e3152013-04-14 14:07:30 +00005650 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005651 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005652 DspRev = NoDSP;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005653 HasFP64 = isFP64Default();
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005654
5655 for (std::vector<std::string>::iterator it = Features.begin(),
5656 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005657 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00005658 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005659 else if (*it == "+soft-float")
5660 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00005661 else if (*it == "+mips16")
5662 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00005663 else if (*it == "+micromips")
5664 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00005665 else if (*it == "+dsp")
5666 DspRev = std::max(DspRev, DSP1);
5667 else if (*it == "+dspr2")
5668 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00005669 else if (*it == "+msa")
5670 HasMSA = true;
Simon Atanasyanddb2ad22013-10-18 13:13:53 +00005671 else if (*it == "+fp64")
5672 HasFP64 = true;
5673 else if (*it == "-fp64")
5674 HasFP64 = false;
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005675 else if (*it == "+nan2008")
5676 IsNan2008 = true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005677 else if (*it == "-nan2008")
5678 IsNan2008 = false;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005679 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005680
Simon Atanasyanfc12c4a2013-09-24 09:09:16 +00005681 // Remove front-end specific options.
Simon Atanasyanbbd99162012-07-05 15:32:46 +00005682 std::vector<std::string>::iterator it =
5683 std::find(Features.begin(), Features.end(), "+soft-float");
5684 if (it != Features.end())
5685 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00005686
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005687 setDescriptionString();
5688
Rafael Espindola5389b842013-08-21 21:59:03 +00005689 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005690 }
Logan Chiena8f7a972013-02-23 04:24:36 +00005691
Stephen Hines651f13c2014-04-23 16:59:28 -07005692 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chiena8f7a972013-02-23 04:24:36 +00005693 if (RegNo == 0) return 4;
5694 if (RegNo == 1) return 5;
5695 return -1;
5696 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005697
5698 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005699};
5700
Simon Atanasyanfbf70052012-06-28 18:23:16 +00005701const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5702#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5703#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5704 ALL_LANGUAGES },
5705#include "clang/Basic/BuiltinsMips.def"
5706};
5707
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005708class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005709public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005710 Mips32TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07005711 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005712 SizeType = UnsignedInt;
5713 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005714 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanakaa044ad92011-11-05 01:48:34 +00005715 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005716 bool setABI(const std::string &Name) override {
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005717 if (Name == "o32" || Name == "eabi") {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005718 ABI = Name;
5719 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005720 }
5721 return false;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005722 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005723 void getTargetDefines(const LangOptions &Opts,
5724 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005725 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Douglas Gregorb7bcfe82011-11-09 15:17:16 +00005726
Stephen Hines651f13c2014-04-23 16:59:28 -07005727 Builder.defineMacro("__mips", "32");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005728 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5729
5730 const std::string& CPUStr = getCPU();
5731 if (CPUStr == "mips32")
5732 Builder.defineMacro("__mips_isa_rev", "1");
5733 else if (CPUStr == "mips32r2")
5734 Builder.defineMacro("__mips_isa_rev", "2");
Stephen Hines651f13c2014-04-23 16:59:28 -07005735
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005736 if (ABI == "o32") {
5737 Builder.defineMacro("__mips_o32");
5738 Builder.defineMacro("_ABIO32", "1");
5739 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5740 }
5741 else if (ABI == "eabi")
5742 Builder.defineMacro("__mips_eabi");
5743 else
David Blaikieb219cfc2011-09-23 05:06:16 +00005744 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005745 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005746 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5747 unsigned &NumAliases) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005748 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5749 { { "at" }, "$1" },
5750 { { "v0" }, "$2" },
5751 { { "v1" }, "$3" },
5752 { { "a0" }, "$4" },
5753 { { "a1" }, "$5" },
5754 { { "a2" }, "$6" },
5755 { { "a3" }, "$7" },
5756 { { "t0" }, "$8" },
5757 { { "t1" }, "$9" },
5758 { { "t2" }, "$10" },
5759 { { "t3" }, "$11" },
5760 { { "t4" }, "$12" },
5761 { { "t5" }, "$13" },
5762 { { "t6" }, "$14" },
5763 { { "t7" }, "$15" },
5764 { { "s0" }, "$16" },
5765 { { "s1" }, "$17" },
5766 { { "s2" }, "$18" },
5767 { { "s3" }, "$19" },
5768 { { "s4" }, "$20" },
5769 { { "s5" }, "$21" },
5770 { { "s6" }, "$22" },
5771 { { "s7" }, "$23" },
5772 { { "t8" }, "$24" },
5773 { { "t9" }, "$25" },
5774 { { "k0" }, "$26" },
5775 { { "k1" }, "$27" },
5776 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005777 { { "sp","$sp" }, "$29" },
5778 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005779 { { "ra" }, "$31" }
5780 };
5781 Aliases = GCCRegAliases;
5782 NumAliases = llvm::array_lengthof(GCCRegAliases);
5783 }
5784};
5785
5786class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005787 void setDescriptionString() override {
5788 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005789 }
5790
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005791public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005792 Mips32EBTargetInfo(const llvm::Triple &Triple)
5793 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005794 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005795 void getTargetDefines(const LangOptions &Opts,
5796 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005797 DefineStd(Builder, "MIPSEB", Opts);
5798 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005799 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005800 }
5801};
5802
5803class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005804 void setDescriptionString() override {
5805 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005806 }
5807
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005808public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005809 Mips32ELTargetInfo(const llvm::Triple &Triple)
5810 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005811 BigEndian = false;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005812 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005813 void getTargetDefines(const LangOptions &Opts,
5814 MacroBuilder &Builder) const override {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005815 DefineStd(Builder, "MIPSEL", Opts);
5816 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005817 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00005818 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00005819};
5820
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005821class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005822public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005823 Mips64TargetInfoBase(const llvm::Triple &Triple)
Stephen Hines651f13c2014-04-23 16:59:28 -07005824 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanaka12507592011-10-22 00:07:27 +00005825 LongDoubleWidth = LongDoubleAlign = 128;
5826 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00005827 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5828 LongDoubleWidth = LongDoubleAlign = 64;
5829 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5830 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005831 setN64ABITypes();
Nick Lewycky7ec59c72011-12-16 22:34:14 +00005832 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00005833 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanaka12507592011-10-22 00:07:27 +00005834 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005835
5836 void setN64ABITypes() {
5837 LongWidth = LongAlign = 64;
5838 PointerWidth = PointerAlign = 64;
5839 SizeType = UnsignedLong;
5840 PtrDiffType = SignedLong;
5841 }
5842
5843 void setN32ABITypes() {
5844 LongWidth = LongAlign = 32;
5845 PointerWidth = PointerAlign = 32;
5846 SizeType = UnsignedInt;
5847 PtrDiffType = SignedInt;
5848 }
5849
Stephen Hines651f13c2014-04-23 16:59:28 -07005850 bool setABI(const std::string &Name) override {
Akira Hatanaka12507592011-10-22 00:07:27 +00005851 if (Name == "n32") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005852 setN32ABITypes();
Simon Atanasyane9616a42013-02-27 14:55:49 +00005853 ABI = Name;
5854 return true;
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005855 }
5856 if (Name == "n64") {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005857 setN64ABITypes();
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005858 ABI = Name;
Simon Atanasyane9616a42013-02-27 14:55:49 +00005859 return true;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005860 }
5861 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005862 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005863
Stephen Hines651f13c2014-04-23 16:59:28 -07005864 void getTargetDefines(const LangOptions &Opts,
5865 MacroBuilder &Builder) const override {
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005866 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00005867
Stephen Hines651f13c2014-04-23 16:59:28 -07005868 Builder.defineMacro("__mips", "64");
Simon Atanasyan600a5132012-08-29 20:50:11 +00005869 Builder.defineMacro("__mips64");
5870 Builder.defineMacro("__mips64__");
Stephen Hinesc568f1e2014-07-21 00:47:37 -07005871 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5872
5873 const std::string& CPUStr = getCPU();
5874 if (CPUStr == "mips64")
5875 Builder.defineMacro("__mips_isa_rev", "1");
5876 else if (CPUStr == "mips64r2")
5877 Builder.defineMacro("__mips_isa_rev", "2");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005878
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005879 if (ABI == "n32") {
5880 Builder.defineMacro("__mips_n32");
5881 Builder.defineMacro("_ABIN32", "2");
5882 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5883 }
5884 else if (ABI == "n64") {
5885 Builder.defineMacro("__mips_n64");
5886 Builder.defineMacro("_ABI64", "3");
5887 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5888 }
5889 else
5890 llvm_unreachable("Invalid ABI for Mips64.");
5891 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005892 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5893 unsigned &NumAliases) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005894 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5895 { { "at" }, "$1" },
5896 { { "v0" }, "$2" },
5897 { { "v1" }, "$3" },
5898 { { "a0" }, "$4" },
5899 { { "a1" }, "$5" },
5900 { { "a2" }, "$6" },
5901 { { "a3" }, "$7" },
5902 { { "a4" }, "$8" },
5903 { { "a5" }, "$9" },
5904 { { "a6" }, "$10" },
5905 { { "a7" }, "$11" },
5906 { { "t0" }, "$12" },
5907 { { "t1" }, "$13" },
5908 { { "t2" }, "$14" },
5909 { { "t3" }, "$15" },
5910 { { "s0" }, "$16" },
5911 { { "s1" }, "$17" },
5912 { { "s2" }, "$18" },
5913 { { "s3" }, "$19" },
5914 { { "s4" }, "$20" },
5915 { { "s5" }, "$21" },
5916 { { "s6" }, "$22" },
5917 { { "s7" }, "$23" },
5918 { { "t8" }, "$24" },
5919 { { "t9" }, "$25" },
5920 { { "k0" }, "$26" },
5921 { { "k1" }, "$27" },
5922 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00005923 { { "sp","$sp" }, "$29" },
5924 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005925 { { "ra" }, "$31" }
5926 };
5927 Aliases = GCCRegAliases;
5928 NumAliases = llvm::array_lengthof(GCCRegAliases);
5929 }
Stephen Hines6bcf27b2014-05-29 04:14:42 -07005930
5931 bool hasInt128Type() const override { return true; }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005932};
5933
5934class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005935 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005936 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07005937 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 +00005938 else
Stephen Hines651f13c2014-04-23 16:59:28 -07005939 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005940
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005941 }
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005942
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005943public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005944 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005945 : Mips64TargetInfoBase(Triple) {}
Stephen Hines651f13c2014-04-23 16:59:28 -07005946 void getTargetDefines(const LangOptions &Opts,
5947 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005948 DefineStd(Builder, "MIPSEB", Opts);
5949 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005950 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005951 }
5952};
5953
5954class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Stephen Hines651f13c2014-04-23 16:59:28 -07005955 void setDescriptionString() override {
Akira Hatanaka4d1c2362013-10-29 18:30:33 +00005956 if (ABI == "n32")
Stephen Hines651f13c2014-04-23 16:59:28 -07005957 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 +00005958 else
Stephen Hines651f13c2014-04-23 16:59:28 -07005959 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005960 }
5961public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005962 Mips64ELTargetInfo(const llvm::Triple &Triple)
5963 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005964 // Default ABI is n64.
5965 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005966 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005967 void getTargetDefines(const LangOptions &Opts,
5968 MacroBuilder &Builder) const override {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005969 DefineStd(Builder, "MIPSEL", Opts);
5970 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005971 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005972 }
5973};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005974} // end anonymous namespace.
5975
Ivan Krasinef05abd2011-08-24 20:22:22 +00005976namespace {
5977class PNaClTargetInfo : public TargetInfo {
5978public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005979 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005980 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005981 this->UserLabelPrefix = "";
5982 this->LongAlign = 32;
5983 this->LongWidth = 32;
5984 this->PointerAlign = 32;
5985 this->PointerWidth = 32;
5986 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005987 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005988 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005989 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005990 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005991 this->SizeType = TargetInfo::UnsignedInt;
5992 this->PtrDiffType = TargetInfo::SignedInt;
5993 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00005994 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00005995 }
5996
Stephen Hines651f13c2014-04-23 16:59:28 -07005997 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005998 }
Stephen Hines651f13c2014-04-23 16:59:28 -07005999 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006000 Builder.defineMacro("__le32__");
6001 Builder.defineMacro("__pnacl__");
6002 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006003 void getTargetDefines(const LangOptions &Opts,
6004 MacroBuilder &Builder) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006005 getArchDefines(Opts, Builder);
6006 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006007 bool hasFeature(StringRef Feature) const override {
Douglas Gregore727d212012-01-30 06:38:25 +00006008 return Feature == "pnacl";
6009 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006010 void getTargetBuiltins(const Builtin::Info *&Records,
6011 unsigned &NumRecords) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006012 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006013 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Ingec5613b22012-06-16 03:34:49 +00006014 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006015 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006016 void getGCCRegNames(const char * const *&Names,
6017 unsigned &NumNames) const override;
6018 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6019 unsigned &NumAliases) const override;
6020 bool validateAsmConstraint(const char *&Name,
6021 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006022 return false;
6023 }
6024
Stephen Hines651f13c2014-04-23 16:59:28 -07006025 const char *getClobbers() const override {
Ivan Krasinef05abd2011-08-24 20:22:22 +00006026 return "";
6027 }
6028};
6029
6030void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6031 unsigned &NumNames) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006032 Names = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006033 NumNames = 0;
6034}
6035
6036void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6037 unsigned &NumAliases) const {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006038 Aliases = nullptr;
Ivan Krasinef05abd2011-08-24 20:22:22 +00006039 NumAliases = 0;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006040}
6041} // end anonymous namespace.
6042
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006043namespace {
Stephen Hines176edba2014-12-01 14:53:08 -08006044class Le64TargetInfo : public TargetInfo {
6045 static const Builtin::Info BuiltinInfo[];
6046
6047public:
6048 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6049 BigEndian = false;
6050 NoAsmVariants = true;
6051 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6052 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6053 DescriptionString =
6054 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6055 }
6056
6057 void getTargetDefines(const LangOptions &Opts,
6058 MacroBuilder &Builder) const override {
6059 DefineStd(Builder, "unix", Opts);
6060 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6061 Builder.defineMacro("__ELF__");
6062 }
6063 void getTargetBuiltins(const Builtin::Info *&Records,
6064 unsigned &NumRecords) const override {
6065 Records = BuiltinInfo;
6066 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6067 }
6068 BuiltinVaListKind getBuiltinVaListKind() const override {
6069 return TargetInfo::PNaClABIBuiltinVaList;
6070 }
6071 const char *getClobbers() const override { return ""; }
6072 void getGCCRegNames(const char *const *&Names,
6073 unsigned &NumNames) const override {
6074 Names = nullptr;
6075 NumNames = 0;
6076 }
6077 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6078 unsigned &NumAliases) const override {
6079 Aliases = nullptr;
6080 NumAliases = 0;
6081 }
6082 bool validateAsmConstraint(const char *&Name,
6083 TargetInfo::ConstraintInfo &Info) const override {
6084 return false;
6085 }
6086
6087 bool hasProtectedVisibility() const override { return false; }
6088};
6089} // end anonymous namespace.
6090
6091const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6092#define BUILTIN(ID, TYPE, ATTRS) \
6093 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6094#include "clang/Basic/BuiltinsLe64.def"
6095};
6096
6097namespace {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006098 static const unsigned SPIRAddrSpaceMap[] = {
6099 1, // opencl_global
6100 3, // opencl_local
6101 2, // opencl_constant
6102 0, // cuda_device
6103 0, // cuda_constant
6104 0 // cuda_shared
6105 };
6106 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006107 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006108 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006109 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6110 "SPIR target must use unknown OS");
6111 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6112 "SPIR target must use unknown environment type");
6113 BigEndian = false;
6114 TLSSupported = false;
6115 LongWidth = LongAlign = 64;
6116 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed1eef8522013-09-13 12:04:22 +00006117 UseAddrSpaceMapMangling = true;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006118 // Define available target features
6119 // These must be defined in sorted order!
6120 NoAsmVariants = true;
6121 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006122 void getTargetDefines(const LangOptions &Opts,
6123 MacroBuilder &Builder) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006124 DefineStd(Builder, "SPIR", Opts);
6125 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006126 bool hasFeature(StringRef Feature) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006127 return Feature == "spir";
6128 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006129
6130 void getTargetBuiltins(const Builtin::Info *&Records,
6131 unsigned &NumRecords) const override {}
6132 const char *getClobbers() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006133 return "";
6134 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006135 void getGCCRegNames(const char * const *&Names,
6136 unsigned &NumNames) const override {}
Stephen Hines176edba2014-12-01 14:53:08 -08006137 bool
6138 validateAsmConstraint(const char *&Name,
6139 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006140 return true;
6141 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006142 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6143 unsigned &NumAliases) const override {}
6144 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006145 return TargetInfo::VoidPtrBuiltinVaList;
6146 }
6147 };
6148
6149
6150 class SPIR32TargetInfo : public SPIRTargetInfo {
6151 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006152 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006153 PointerWidth = PointerAlign = 32;
6154 SizeType = TargetInfo::UnsignedInt;
6155 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6156 DescriptionString
Stephen Hines651f13c2014-04-23 16:59:28 -07006157 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6158 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00006159 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006160 void getTargetDefines(const LangOptions &Opts,
6161 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00006162 DefineStd(Builder, "SPIR32", Opts);
6163 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006164 };
6165
6166 class SPIR64TargetInfo : public SPIRTargetInfo {
6167 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006168 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006169 PointerWidth = PointerAlign = 64;
6170 SizeType = TargetInfo::UnsignedLong;
6171 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Stephen Hines651f13c2014-04-23 16:59:28 -07006172 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6173 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00006174 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006175 void getTargetDefines(const LangOptions &Opts,
6176 MacroBuilder &Builder) const override {
Guy Benyeif3ddf632013-03-07 13:06:10 +00006177 DefineStd(Builder, "SPIR64", Opts);
6178 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006179 };
6180}
6181
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006182namespace {
6183class XCoreTargetInfo : public TargetInfo {
6184 static const Builtin::Info BuiltinInfo[];
6185public:
6186 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6187 BigEndian = false;
6188 NoAsmVariants = true;
6189 LongLongAlign = 32;
6190 SuitableAlign = 32;
6191 DoubleAlign = LongDoubleAlign = 32;
Robert Lytton18162192013-11-12 10:09:30 +00006192 SizeType = UnsignedInt;
6193 PtrDiffType = SignedInt;
6194 IntPtrType = SignedInt;
6195 WCharType = UnsignedChar;
6196 WIntType = UnsignedInt;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006197 UseZeroLengthBitfieldAlignment = true;
Stephen Hines651f13c2014-04-23 16:59:28 -07006198 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
6199 "-f64:32-a:0:32-n32";
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006200 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006201 void getTargetDefines(const LangOptions &Opts,
6202 MacroBuilder &Builder) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006203 Builder.defineMacro("__XS1B__");
6204 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006205 void getTargetBuiltins(const Builtin::Info *&Records,
6206 unsigned &NumRecords) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006207 Records = BuiltinInfo;
6208 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6209 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006210 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006211 return TargetInfo::VoidPtrBuiltinVaList;
6212 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006213 const char *getClobbers() const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006214 return "";
6215 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006216 void getGCCRegNames(const char * const *&Names,
6217 unsigned &NumNames) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006218 static const char * const GCCRegNames[] = {
6219 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6220 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6221 };
6222 Names = GCCRegNames;
6223 NumNames = llvm::array_lengthof(GCCRegNames);
6224 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006225 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6226 unsigned &NumAliases) const override {
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006227 Aliases = nullptr;
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006228 NumAliases = 0;
6229 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006230 bool validateAsmConstraint(const char *&Name,
6231 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006232 return false;
6233 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006234 int getEHDataRegisterNumber(unsigned RegNo) const override {
6235 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6236 return (RegNo < 2)? RegNo : -1;
6237 }
Robert Lytton5f15f4d2013-08-13 09:43:10 +00006238};
6239
6240const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6241#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6242#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6243 ALL_LANGUAGES },
6244#include "clang/Basic/BuiltinsXCore.def"
6245};
6246} // end anonymous namespace.
6247
Ivan Krasinef05abd2011-08-24 20:22:22 +00006248
Chris Lattner4b009652007-07-25 00:24:17 +00006249//===----------------------------------------------------------------------===//
6250// Driver code
6251//===----------------------------------------------------------------------===//
6252
Benjamin Kramer9df08232013-06-29 16:37:14 +00006253static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006254 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006255
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006256 switch (Triple.getArch()) {
6257 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006258 return nullptr;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006259
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006260 case llvm::Triple::xcore:
6261 return new XCoreTargetInfo(Triple);
6262
6263 case llvm::Triple::hexagon:
6264 return new HexagonTargetInfo(Triple);
6265
6266 case llvm::Triple::aarch64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006267 if (Triple.isOSDarwin())
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006268 return new DarwinAArch64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006269
6270 switch (os) {
Stephen Hines176edba2014-12-01 14:53:08 -08006271 case llvm::Triple::FreeBSD:
6272 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006273 case llvm::Triple::Linux:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006274 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
6275 case llvm::Triple::NetBSD:
6276 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006277 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006278 return new AArch64leTargetInfo(Triple);
6279 }
6280
Stephen Hines651f13c2014-04-23 16:59:28 -07006281 case llvm::Triple::aarch64_be:
6282 switch (os) {
Stephen Hines176edba2014-12-01 14:53:08 -08006283 case llvm::Triple::FreeBSD:
6284 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006285 case llvm::Triple::Linux:
6286 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6287 case llvm::Triple::NetBSD:
6288 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6289 default:
6290 return new AArch64beTargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00006291 }
6292
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006293 case llvm::Triple::arm:
Daniel Dunbar3f361b52009-09-11 01:14:50 +00006294 case llvm::Triple::thumb:
Stephen Hines651f13c2014-04-23 16:59:28 -07006295 if (Triple.isOSBinFormatMachO())
6296 return new DarwinARMTargetInfo(Triple);
6297
6298 switch (os) {
6299 case llvm::Triple::Linux:
6300 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
6301 case llvm::Triple::FreeBSD:
6302 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
6303 case llvm::Triple::NetBSD:
6304 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
6305 case llvm::Triple::OpenBSD:
6306 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
6307 case llvm::Triple::Bitrig:
6308 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
6309 case llvm::Triple::RTEMS:
6310 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
6311 case llvm::Triple::NaCl:
6312 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006313 case llvm::Triple::Win32:
6314 switch (Triple.getEnvironment()) {
6315 default:
6316 return new ARMleTargetInfo(Triple);
6317 case llvm::Triple::Itanium:
6318 return new ItaniumWindowsARMleTargetInfo(Triple);
6319 case llvm::Triple::MSVC:
6320 return new MicrosoftARMleTargetInfo(Triple);
6321 }
Stephen Hines651f13c2014-04-23 16:59:28 -07006322 default:
6323 return new ARMleTargetInfo(Triple);
6324 }
6325
6326 case llvm::Triple::armeb:
6327 case llvm::Triple::thumbeb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006328 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006329 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006330
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006331 switch (os) {
Rafael Espindolad16a2202010-06-10 00:46:51 +00006332 case llvm::Triple::Linux:
Stephen Hines651f13c2014-04-23 16:59:28 -07006333 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006334 case llvm::Triple::FreeBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006335 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006336 case llvm::Triple::NetBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006337 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006338 case llvm::Triple::OpenBSD:
Stephen Hines651f13c2014-04-23 16:59:28 -07006339 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006340 case llvm::Triple::Bitrig:
Stephen Hines651f13c2014-04-23 16:59:28 -07006341 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006342 case llvm::Triple::RTEMS:
Stephen Hines651f13c2014-04-23 16:59:28 -07006343 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006344 case llvm::Triple::NaCl:
Stephen Hines651f13c2014-04-23 16:59:28 -07006345 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006346 default:
Stephen Hines651f13c2014-04-23 16:59:28 -07006347 return new ARMbeTargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006348 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006349
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006350 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006351 return new MSP430TargetInfo(Triple);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00006352
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006353 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006354 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006355 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006356 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006357 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006358 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006359 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006360 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006361 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006362 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006363 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006364 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00006365 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006366
6367 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006368 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006369 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006370 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006371 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006372 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006373 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006374 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006375 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006376 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicbbac9aa2013-09-21 01:27:01 +00006377 case llvm::Triple::NaCl:
6378 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006379 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006380 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00006381 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00006382
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006383 case llvm::Triple::mips64:
6384 switch (os) {
6385 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006386 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006387 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006388 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006389 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006390 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006391 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006392 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006393 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006394 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006395 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006396 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006397 }
6398
6399 case llvm::Triple::mips64el:
6400 switch (os) {
6401 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006402 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006403 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006404 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006405 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006406 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006407 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006408 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006409 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006410 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006411 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006412 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00006413 }
6414
Ivan Krasinef05abd2011-08-24 20:22:22 +00006415 case llvm::Triple::le32:
6416 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00006417 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006418 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00006419 default:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006420 return nullptr;
Chris Lattnere03ae302010-02-16 18:14:57 +00006421 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00006422
Stephen Hines176edba2014-12-01 14:53:08 -08006423 case llvm::Triple::le64:
6424 return new Le64TargetInfo(Triple);
6425
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006426 case llvm::Triple::ppc:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006427 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006428 return new DarwinPPC32TargetInfo(Triple);
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00006429 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006430 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006431 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00006432 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006433 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006434 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006435 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006436 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006437 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006438 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006439 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006440 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006441 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006442 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006443
6444 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006445 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006446 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006447 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006448 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006449 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006450 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006451 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006452 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006453 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006454 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006455 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006456 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006457 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006458 }
Daniel Dunbard58c03f2009-11-15 06:48:46 +00006459
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00006460 case llvm::Triple::ppc64le:
6461 switch (os) {
6462 case llvm::Triple::Linux:
6463 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6464 default:
6465 return new PPC64TargetInfo(Triple);
Reid Spencer5f016e22007-07-11 17:01:13 +00006466 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006467
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006468 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006469 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00006470 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006471 return new NVPTX64TargetInfo(Triple);
Chris Lattner2c026472010-03-06 21:21:27 +00006472
Eli Friedman6505a292012-10-12 23:32:00 +00006473 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006474 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00006475
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006476 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006477 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00006478 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006479 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006480 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006481 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006482 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006483 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00006484 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006485 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006486 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006487 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006488 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006489 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00006490 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006491
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006492 case llvm::Triple::sparcv9:
6493 switch (os) {
6494 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006495 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006496 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006497 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006498 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006499 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006500 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006501 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006502 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006503 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006504 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006505 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00006506 }
6507
Ulrich Weigandb8409212013-05-06 16:26:41 +00006508 case llvm::Triple::systemz:
6509 switch (os) {
6510 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006511 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006512 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006513 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00006514 }
6515
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006516 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006517 return new TCETargetInfo(Triple);
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00006518
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006519 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006520 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006521 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006522
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006523 switch (os) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006524 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006525 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006526 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006527 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006528 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006529 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006530 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006531 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006532 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006533 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006534 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006535 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006536 case llvm::Triple::KFreeBSD:
6537 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner6f4bed52010-07-07 16:01:42 +00006538 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006539 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006540 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006541 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006542 case llvm::Triple::Win32: {
6543 switch (Triple.getEnvironment()) {
6544 default:
6545 return new X86_32TargetInfo(Triple);
6546 case llvm::Triple::Cygnus:
6547 return new CygwinX86_32TargetInfo(Triple);
6548 case llvm::Triple::GNU:
6549 return new MinGWX86_32TargetInfo(Triple);
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006550 case llvm::Triple::Itanium:
Stephen Hines651f13c2014-04-23 16:59:28 -07006551 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006552 return new MicrosoftX86_32TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006553 }
6554 }
Chris Lattnerf853e732010-04-11 19:29:39 +00006555 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006556 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00006557 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006558 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00006559 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006560 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006561 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006562 return new X86_32TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006563 }
6564
6565 case llvm::Triple::x86_64:
Stephen Hines651f13c2014-04-23 16:59:28 -07006566 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramer9df08232013-06-29 16:37:14 +00006567 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00006568
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006569 switch (os) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006570 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006571 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner1eac0812010-01-09 05:41:14 +00006572 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006573 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006574 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006575 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006576 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006577 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00006578 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006579 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006580 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006581 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00006582 case llvm::Triple::KFreeBSD:
6583 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006584 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006585 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006586 case llvm::Triple::Win32: {
6587 switch (Triple.getEnvironment()) {
6588 default:
6589 return new X86_64TargetInfo(Triple);
6590 case llvm::Triple::GNU:
6591 return new MinGWX86_64TargetInfo(Triple);
6592 case llvm::Triple::MSVC:
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006593 return new MicrosoftX86_64TargetInfo(Triple);
Stephen Hines651f13c2014-04-23 16:59:28 -07006594 }
6595 }
Eli Bendersky441d9f72012-12-04 18:38:10 +00006596 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006597 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006598 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00006599 return new X86_64TargetInfo(Triple);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006600 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006601
6602 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006603 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006604 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006605 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006606 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006607 }
6608 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006609 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00006610 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006611 return nullptr;
Benjamin Kramer9df08232013-06-29 16:37:14 +00006612 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00006613 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00006614 }
Chris Lattner4b009652007-07-25 00:24:17 +00006615}
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006616
6617/// CreateTargetInfo - Return the target info object for the specified target
6618/// triple.
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006619TargetInfo *
6620TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6621 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregor49a87542012-11-16 04:24:59 +00006622 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006623
6624 // Construct the target
Stephen Hines651f13c2014-04-23 16:59:28 -07006625 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006626 if (!Target) {
6627 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006628 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006629 }
Stephen Hinesc568f1e2014-07-21 00:47:37 -07006630 Target->TargetOpts = Opts;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006631
Daniel Dunbar33b40752009-12-18 18:42:37 +00006632 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006633 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6634 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006635 return nullptr;
Daniel Dunbar33b40752009-12-18 18:42:37 +00006636 }
6637
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006638 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00006639 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6640 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006641 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006642 }
6643
Rafael Espindola5389b842013-08-21 21:59:03 +00006644 // Set the fp math unit.
6645 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6646 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006647 return nullptr;
Rafael Espindola5389b842013-08-21 21:59:03 +00006648 }
6649
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006650 // Compute the default target features, we need the target to handle this
6651 // because features may have dependencies on one another.
6652 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00006653 Target->getDefaultFeatures(Features);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006654
6655 // Apply the user specified deltas.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006656 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6657 I < N; ++I) {
6658 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006659 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00006660 bool Enabled = Name[0] == '+';
6661 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006662 }
6663
6664 // Add the features to the compile options.
6665 //
6666 // FIXME: If we are completely confident that we have the right set, we only
6667 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00006668 Opts->Features.clear();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006669 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6670 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00006671 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3d11ced2013-10-16 21:26:26 +00006672 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Stephen Hines6bcf27b2014-05-29 04:14:42 -07006673 return nullptr;
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006674
Stephen Hines651f13c2014-04-23 16:59:28 -07006675 return Target.release();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00006676}