blob: 4d0a833d23da61b7b0de00e6f017cf2d363aca21 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikova7c47172009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenekbbced582007-12-12 18:05:32 +000011// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth103b71c2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman25531262008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar77659342009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner4c28b1c2009-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 Lattner797c3c42009-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 Kramer48725082010-01-09 18:20:57 +000031#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000032using namespace clang;
33
Reid Spencer5f016e22007-07-11 17:01:13 +000034//===----------------------------------------------------------------------===//
35// Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
Chris Lattnerca45cff2009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner5f9e2722011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000044
Chris Lattnerca45cff2009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramera9992772010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000049
Chris Lattnerca45cff2009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000052
Chris Lattnerca45cff2009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000055}
56
Benjamin Kramer448f68d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattnerd29b6302008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000068
Torok Edwin5f6c1942009-06-30 17:10:35 +000069namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000072protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000075public:
Douglas Gregora3844922009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000081 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000082
83};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000085
Chris Lattner797c3c42009-08-10 19:03:04 +000086
Daniel Dunbar21ae3192010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Benjamin Kramera9992772010-01-09 17:55:51 +000091 Builder.defineMacro("__APPLE_CC__", "5621");
92 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 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.
Will Dietz4f45bc02013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000098
John McCall098df7f2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000102
John McCallf85e1932011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000108
John McCallf85e1932011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000113 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000114
Eli Friedman2de4fee2009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000117 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000122
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000131 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000132
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000141 // Set the appropriate OS version define.
Bob Wilson48b68a02012-01-31 23:52:58 +0000142 if (Triple.getOS() == llvm::Triple::IOS) {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
152 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000157 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000159 char Str[5];
160 Str[0] = '0' + (Maj / 10);
161 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000162 Str[2] = '0' + std::min(Min, 9U);
163 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000164 Str[4] = '\0';
165 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000166 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000167
168 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000169}
Reid Spencer5f016e22007-07-11 17:01:13 +0000170
Chris Lattner797c3c42009-08-10 19:03:04 +0000171namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000172template<typename Target>
173class DarwinTargetInfo : public OSTargetInfo<Target> {
174protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000175 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000176 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000177 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000178 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000179 }
Mike Stump1eb44332009-09-09 15:08:12 +0000180
Torok Edwin5f6c1942009-06-30 17:10:35 +0000181public:
182 DarwinTargetInfo(const std::string& triple) :
183 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000184 llvm::Triple T = llvm::Triple(triple);
185 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000186 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000187 }
188
Chris Lattner5f9e2722011-07-23 10:55:15 +0000189 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000190 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000191 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000192 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000193 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000194 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000195 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000196 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000197
Anders Carlsson18af3682010-06-08 22:47:50 +0000198 virtual const char *getStaticInitSectionSpecifier() const {
199 // FIXME: We should return 0 when building kexts.
200 return "__TEXT,__StaticInit,regular,pure_instructions";
201 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000202
John McCall41887602012-01-29 01:20:30 +0000203 /// Darwin does not support protected visibility. Darwin's "default"
204 /// is very similar to ELF's "protected"; Darwin requires a "weak"
205 /// attribute on declarations that can be dynamically replaced.
206 virtual bool hasProtectedVisibility() const {
207 return false;
208 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000209};
210
Chris Lattner797c3c42009-08-10 19:03:04 +0000211
Torok Edwin5f6c1942009-06-30 17:10:35 +0000212// DragonFlyBSD Target
213template<typename Target>
214class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
215protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000216 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000217 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000218 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000219 Builder.defineMacro("__DragonFly__");
220 Builder.defineMacro("__DragonFly_cc_version", "100001");
221 Builder.defineMacro("__ELF__");
222 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
223 Builder.defineMacro("__tune_i386__");
224 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000225 }
226public:
Mike Stump1eb44332009-09-09 15:08:12 +0000227 DragonFlyBSDTargetInfo(const std::string &triple)
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000228 : OSTargetInfo<Target>(triple) {
229 this->UserLabelPrefix = "";
230
231 llvm::Triple Triple(triple);
232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
239 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000247 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer474202f2011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000253
Benjamin Kramer474202f2011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000259 }
260public:
Mike Stump1eb44332009-09-09 15:08:12 +0000261 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000262 : OSTargetInfo<Target>(triple) {
263 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000264
265 llvm::Triple Triple(triple);
266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 case llvm::Triple::mips:
273 case llvm::Triple::mipsel:
274 case llvm::Triple::ppc:
275 case llvm::Triple::ppc64:
276 this->MCountName = "_mcount";
277 break;
278 case llvm::Triple::arm:
279 this->MCountName = "__mcount";
280 break;
281 }
282
Duncan Sands1e90faf2009-07-08 13:55:08 +0000283 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000284};
285
Chris Lattner38e317d2010-07-07 16:01:42 +0000286// Minix Target
287template<typename Target>
288class MinixTargetInfo : public OSTargetInfo<Target> {
289protected:
290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291 MacroBuilder &Builder) const {
292 // Minix defines
293
294 Builder.defineMacro("__minix", "3");
295 Builder.defineMacro("_EM_WSIZE", "4");
296 Builder.defineMacro("_EM_PSIZE", "4");
297 Builder.defineMacro("_EM_SSIZE", "2");
298 Builder.defineMacro("_EM_LSIZE", "4");
299 Builder.defineMacro("_EM_FSIZE", "4");
300 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000301 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000302 DefineStd(Builder, "unix", Opts);
303 }
304public:
305 MinixTargetInfo(const std::string &triple)
306 : OSTargetInfo<Target>(triple) {
307 this->UserLabelPrefix = "";
308 }
309};
310
Torok Edwin5f6c1942009-06-30 17:10:35 +0000311// Linux target
312template<typename Target>
313class LinuxTargetInfo : public OSTargetInfo<Target> {
314protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000315 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000316 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000317 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000318 DefineStd(Builder, "unix", Opts);
319 DefineStd(Builder, "linux", Opts);
320 Builder.defineMacro("__gnu_linux__");
321 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000322 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000323 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000324 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000325 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000326 if (Opts.CPlusPlus)
327 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000328 }
329public:
Mike Stump1eb44332009-09-09 15:08:12 +0000330 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000331 : OSTargetInfo<Target>(triple) {
332 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000333 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000334 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000335
336 virtual const char *getStaticInitSectionSpecifier() const {
337 return ".text.startup";
338 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000339};
340
Chris Lattnerb62bb282009-07-13 20:29:08 +0000341// NetBSD Target
342template<typename Target>
343class NetBSDTargetInfo : public OSTargetInfo<Target> {
344protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000345 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000346 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000347 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000348 Builder.defineMacro("__NetBSD__");
349 Builder.defineMacro("__unix__");
350 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000351 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000352 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000353 }
354public:
Mike Stump1eb44332009-09-09 15:08:12 +0000355 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000356 : OSTargetInfo<Target>(triple) {
357 this->UserLabelPrefix = "";
358 }
359};
360
Torok Edwin5f6c1942009-06-30 17:10:35 +0000361// OpenBSD Target
362template<typename Target>
363class OpenBSDTargetInfo : public OSTargetInfo<Target> {
364protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000365 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000366 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000367 // OpenBSD defines; list based off of gcc output
368
Benjamin Kramera9992772010-01-09 17:55:51 +0000369 Builder.defineMacro("__OpenBSD__");
370 DefineStd(Builder, "unix", Opts);
371 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000372 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000373 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000374 }
375public:
Mike Stump1eb44332009-09-09 15:08:12 +0000376 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000377 : OSTargetInfo<Target>(triple) {
378 this->UserLabelPrefix = "";
Hans Wennborge48667f2012-08-01 18:53:19 +0000379 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000380
381 llvm::Triple Triple(triple);
382 switch (Triple.getArch()) {
383 default:
384 case llvm::Triple::x86:
385 case llvm::Triple::x86_64:
386 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000387 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000388 this->MCountName = "__mcount";
389 break;
390 case llvm::Triple::mips64:
391 case llvm::Triple::mips64el:
392 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000393 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000394 this->MCountName = "_mcount";
395 break;
396 }
397 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000398};
399
Eli Friedman42f74f22012-08-08 23:57:20 +0000400// Bitrig Target
401template<typename Target>
402class BitrigTargetInfo : public OSTargetInfo<Target> {
403protected:
404 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
405 MacroBuilder &Builder) const {
406 // Bitrig defines; list based off of gcc output
407
408 Builder.defineMacro("__Bitrig__");
409 DefineStd(Builder, "unix", Opts);
410 Builder.defineMacro("__ELF__");
411 if (Opts.POSIXThreads)
412 Builder.defineMacro("_REENTRANT");
413 }
414public:
415 BitrigTargetInfo(const std::string &triple)
416 : OSTargetInfo<Target>(triple) {
417 this->UserLabelPrefix = "";
418 this->TLSSupported = false;
419 this->MCountName = "__mcount";
420 }
421};
422
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000423// PSP Target
424template<typename Target>
425class PSPTargetInfo : public OSTargetInfo<Target> {
426protected:
427 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000428 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000429 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000430 Builder.defineMacro("PSP");
431 Builder.defineMacro("_PSP");
432 Builder.defineMacro("__psp__");
433 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000434 }
435public:
436 PSPTargetInfo(const std::string& triple)
437 : OSTargetInfo<Target>(triple) {
438 this->UserLabelPrefix = "";
439 }
440};
441
John Thompson3f6918a2009-11-19 17:18:50 +0000442// PS3 PPU Target
443template<typename Target>
444class PS3PPUTargetInfo : public OSTargetInfo<Target> {
445protected:
446 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000447 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000448 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000449 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000450 Builder.defineMacro("__PPU__");
451 Builder.defineMacro("__CELLOS_LV2__");
452 Builder.defineMacro("__ELF__");
453 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000454 Builder.defineMacro("_ARCH_PPC64");
455 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000456 }
457public:
458 PS3PPUTargetInfo(const std::string& triple)
459 : OSTargetInfo<Target>(triple) {
460 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000461 this->LongWidth = this->LongAlign = 32;
462 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000463 this->IntMaxType = TargetInfo::SignedLongLong;
464 this->UIntMaxType = TargetInfo::UnsignedLongLong;
465 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000466 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000467 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewycky99520702011-12-16 22:32:39 +0000468 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000469 }
470};
471
472// FIXME: Need a real SPU target.
473// PS3 SPU Target
474template<typename Target>
475class PS3SPUTargetInfo : public OSTargetInfo<Target> {
476protected:
477 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000478 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000479 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000480 Builder.defineMacro("__SPU__");
481 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000482 }
483public:
484 PS3SPUTargetInfo(const std::string& triple)
485 : OSTargetInfo<Target>(triple) {
486 this->UserLabelPrefix = "";
487 }
488};
489
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000490// AuroraUX target
491template<typename Target>
492class AuroraUXTargetInfo : public OSTargetInfo<Target> {
493protected:
494 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000495 MacroBuilder &Builder) const {
496 DefineStd(Builder, "sun", Opts);
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 Builder.defineMacro("__svr4__");
500 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000501 }
502public:
503 AuroraUXTargetInfo(const std::string& triple)
504 : OSTargetInfo<Target>(triple) {
505 this->UserLabelPrefix = "";
506 this->WCharType = this->SignedLong;
507 // FIXME: WIntType should be SignedLong
508 }
509};
510
Torok Edwin5f6c1942009-06-30 17:10:35 +0000511// Solaris target
512template<typename Target>
513class SolarisTargetInfo : public OSTargetInfo<Target> {
514protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000515 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000516 MacroBuilder &Builder) const {
517 DefineStd(Builder, "sun", Opts);
518 DefineStd(Builder, "unix", Opts);
519 Builder.defineMacro("__ELF__");
520 Builder.defineMacro("__svr4__");
521 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000522 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
523 // newer, but to 500 for everything else. feature_test.h has a check to
524 // ensure that you are not using C99 with an old version of X/Open or C89
525 // with a new version.
526 if (Opts.C99 || Opts.C11)
527 Builder.defineMacro("_XOPEN_SOURCE", "600");
528 else
529 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000530 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000531 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000532 Builder.defineMacro("_LARGEFILE_SOURCE");
533 Builder.defineMacro("_LARGEFILE64_SOURCE");
534 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000535 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000536 }
537public:
Mike Stump1eb44332009-09-09 15:08:12 +0000538 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000539 : OSTargetInfo<Target>(triple) {
540 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000541 this->WCharType = this->SignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000542 // FIXME: WIntType should be SignedLong
543 }
544};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000545
546// Windows target
547template<typename Target>
548class WindowsTargetInfo : public OSTargetInfo<Target> {
549protected:
550 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000552 Builder.defineMacro("_WIN32");
553 }
554 void getVisualStudioDefines(const LangOptions &Opts,
555 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000556 if (Opts.CPlusPlus) {
557 if (Opts.RTTI)
558 Builder.defineMacro("_CPPRTTI");
559
560 if (Opts.Exceptions)
561 Builder.defineMacro("_CPPUNWIND");
562 }
563
564 if (!Opts.CharIsSigned)
565 Builder.defineMacro("_CHAR_UNSIGNED");
566
567 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
568 // but it works for now.
569 if (Opts.POSIXThreads)
570 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000571
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000572 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000573 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000574
Francois Pichet62ec1f22011-09-17 17:15:52 +0000575 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000576 Builder.defineMacro("_MSC_EXTENSIONS");
577
Richard Smith80ad52f2013-01-02 11:42:31 +0000578 if (Opts.CPlusPlus11) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000579 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
580 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
581 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
582 }
583 }
584
585 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000586 }
587
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000588public:
589 WindowsTargetInfo(const std::string &triple)
590 : OSTargetInfo<Target>(triple) {}
591};
592
Derek Schuff7da46f92012-10-11 16:55:58 +0000593template <typename Target>
594class NaClTargetInfo : public OSTargetInfo<Target> {
595 protected:
596 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597 MacroBuilder &Builder) const {
598 if (Opts.POSIXThreads)
599 Builder.defineMacro("_REENTRANT");
600 if (Opts.CPlusPlus)
601 Builder.defineMacro("_GNU_SOURCE");
602
603 DefineStd(Builder, "unix", Opts);
604 Builder.defineMacro("__ELF__");
605 Builder.defineMacro("__native_client__");
606 }
607 public:
608 NaClTargetInfo(const std::string &triple)
609 : OSTargetInfo<Target>(triple) {
610 this->UserLabelPrefix = "";
611 this->LongAlign = 32;
612 this->LongWidth = 32;
613 this->PointerAlign = 32;
614 this->PointerWidth = 32;
615 this->IntMaxType = TargetInfo::SignedLongLong;
616 this->UIntMaxType = TargetInfo::UnsignedLongLong;
617 this->Int64Type = TargetInfo::SignedLongLong;
618 this->DoubleAlign = 64;
619 this->LongDoubleWidth = 64;
620 this->LongDoubleAlign = 64;
621 this->SizeType = TargetInfo::UnsignedInt;
622 this->PtrDiffType = TargetInfo::SignedInt;
623 this->IntPtrType = TargetInfo::SignedInt;
624 this->RegParmMax = 2;
625 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
626 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
627 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
628 }
Derek Schuff263366f2012-10-16 22:30:41 +0000629 virtual typename Target::CallingConvCheckResult checkCallingConvention(
630 CallingConv CC) const {
631 return CC == CC_PnaclCall ? Target::CCCR_OK :
632 Target::checkCallingConvention(CC);
633 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000634};
Mike Stump1eb44332009-09-09 15:08:12 +0000635} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000636
Chris Lattnerd29b6302008-10-05 21:50:58 +0000637//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000638// Specific target implementations.
639//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000640
Eli Friedmane4277982008-08-20 23:11:40 +0000641namespace {
642// PPC abstract base class
643class PPCTargetInfo : public TargetInfo {
644 static const Builtin::Info BuiltinInfo[];
645 static const char * const GCCRegNames[];
646 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000647 std::string CPU;
Eli Friedmane4277982008-08-20 23:11:40 +0000648public:
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000649 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
650 LongDoubleWidth = LongDoubleAlign = 128;
651 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
652 }
Eli Friedman15b91762009-06-05 07:05:05 +0000653
Hal Finkel39d5fa12012-07-03 16:51:04 +0000654 /// \brief Flags for architecture specific defines.
655 typedef enum {
656 ArchDefineNone = 0,
657 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
658 ArchDefinePpcgr = 1 << 1,
659 ArchDefinePpcsq = 1 << 2,
660 ArchDefine440 = 1 << 3,
661 ArchDefine603 = 1 << 4,
662 ArchDefine604 = 1 << 5,
663 ArchDefinePwr4 = 1 << 6,
664 ArchDefinePwr6 = 1 << 7
665 } ArchDefineTypes;
666
Hal Finkel02a84272012-06-11 22:35:19 +0000667 virtual bool setCPU(const std::string &Name) {
668 bool CPUKnown = llvm::StringSwitch<bool>(Name)
669 .Case("generic", true)
670 .Case("440", true)
671 .Case("450", true)
672 .Case("601", true)
673 .Case("602", true)
674 .Case("603", true)
675 .Case("603e", true)
676 .Case("603ev", true)
677 .Case("604", true)
678 .Case("604e", true)
679 .Case("620", true)
680 .Case("g3", true)
681 .Case("7400", true)
682 .Case("g4", true)
683 .Case("7450", true)
684 .Case("g4+", true)
685 .Case("750", true)
686 .Case("970", true)
687 .Case("g5", true)
688 .Case("a2", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000689 .Case("e500mc", true)
690 .Case("e5500", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000691 .Case("pwr6", true)
692 .Case("pwr7", true)
693 .Case("ppc", true)
694 .Case("ppc64", true)
695 .Default(false);
696
697 if (CPUKnown)
698 CPU = Name;
699
700 return CPUKnown;
701 }
702
Eli Friedmane4277982008-08-20 23:11:40 +0000703 virtual void getTargetBuiltins(const Builtin::Info *&Records,
704 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000705 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000706 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000707 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000708
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000709 virtual bool isCLZForZeroUndef() const { return false; }
710
Chris Lattner33328642009-03-20 15:52:06 +0000711 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000712 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000713
Bill Schmidt199402b2013-02-01 02:14:03 +0000714 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
715
716 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
717 StringRef Name,
718 bool Enabled) const;
719
Douglas Gregore727d212012-01-30 06:38:25 +0000720 virtual bool hasFeature(StringRef Feature) const;
721
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000722 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000723 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000724 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000725 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000726 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000727 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000728 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000729 default: return false;
730 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000731 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000732 case 'b': // Base register
733 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000734 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000735 break;
736 // FIXME: The following are added to allow parsing.
737 // I just took a guess at what the actions should be.
738 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000739 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000740 case 'v': // Altivec vector register
741 Info.setAllowsRegister();
742 break;
743 case 'w':
744 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000745 case 'd':// VSX vector register to hold vector double data
746 case 'f':// VSX vector register to hold vector float data
747 case 's':// VSX vector register to hold scalar float data
748 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000749 break;
750 default:
751 return false;
752 }
753 Info.setAllowsRegister();
754 Name++; // Skip over 'w'.
755 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000756 case 'h': // `MQ', `CTR', or `LINK' register
757 case 'q': // `MQ' register
758 case 'c': // `CTR' register
759 case 'l': // `LINK' register
760 case 'x': // `CR' register (condition register) number 0
761 case 'y': // `CR' register (condition register)
762 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000763 Info.setAllowsRegister();
764 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000765 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000766 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000767 // (use `L' instead for SImode constants)
768 case 'K': // Unsigned 16-bit constant
769 case 'L': // Signed 16-bit constant shifted left 16 bits
770 case 'M': // Constant larger than 31
771 case 'N': // Exact power of 2
772 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000773 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000774 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000775 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000776 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000777 break;
778 case 'm': // Memory operand. Note that on PowerPC targets, m can
779 // include addresses that update the base register. It
780 // is therefore only safe to use `m' in an asm statement
781 // if that asm statement accesses the operand exactly once.
782 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000783 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000784 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000785 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000786 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000787 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
788 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000789 // register to be updated.
790 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000791 if (Name[1] != 's')
792 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000793 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000794 // include any automodification of the base register. Unlike
795 // `m', this constraint can be used in asm statements that
796 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000797 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000798 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000799 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000800 break;
801 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000802 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000803 case 'Z': // Memory operand that is an indexed or indirect from a
804 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000805 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000806 Info.setAllowsMemory();
807 Info.setAllowsRegister();
808 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000809 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000810 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000811 // register (`p' is preferable for asm statements)
812 case 'S': // Constant suitable as a 64-bit mask operand
813 case 'T': // Constant suitable as a 32-bit mask operand
814 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000815 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000816 // instructions
817 case 'W': // Vector constant that does not require memory
818 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000819 break;
820 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000821 }
John Thompson8e6065a2010-06-24 22:44:13 +0000822 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000823 }
Eli Friedmane4277982008-08-20 23:11:40 +0000824 virtual const char *getClobbers() const {
825 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000826 }
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000827 int getEHDataRegisterNumber(unsigned RegNo) const {
828 if (RegNo == 0) return 3;
829 if (RegNo == 1) return 4;
830 return -1;
831 }
Eli Friedmane4277982008-08-20 23:11:40 +0000832};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000833
Eli Friedmane4277982008-08-20 23:11:40 +0000834const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000835#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000836#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000837 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000838#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000839};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000840
841
Chris Lattnerc0f59212009-03-02 22:27:17 +0000842/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
843/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000844void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000845 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000846 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000847 Builder.defineMacro("__ppc__");
848 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000849 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000850 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000851 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000852 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnere03ae302010-02-16 18:14:57 +0000853 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000854 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000855 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000856 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000857 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000858
Chris Lattnerc0f59212009-03-02 22:27:17 +0000859 // Target properties.
Hans Wennborg5e601dc2012-08-02 13:45:48 +0000860 if (getTriple().getOS() != llvm::Triple::NetBSD &&
861 getTriple().getOS() != llvm::Triple::OpenBSD)
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000862 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000863 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000864
Chris Lattnerc0f59212009-03-02 22:27:17 +0000865 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000866 Builder.defineMacro("__NATURAL_ALIGNMENT__");
867 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000868
Chris Lattnerc0f59212009-03-02 22:27:17 +0000869 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000870 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000871
John Thompson3f6918a2009-11-19 17:18:50 +0000872 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000873 Builder.defineMacro("__VEC__", "10206");
874 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000875 }
Hal Finkel02a84272012-06-11 22:35:19 +0000876
877 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000878 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
879 .Case("440", ArchDefineName)
880 .Case("450", ArchDefineName | ArchDefine440)
881 .Case("601", ArchDefineName)
882 .Case("602", ArchDefineName | ArchDefinePpcgr)
883 .Case("603", ArchDefineName | ArchDefinePpcgr)
884 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
885 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
886 .Case("604", ArchDefineName | ArchDefinePpcgr)
887 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
888 .Case("620", ArchDefineName | ArchDefinePpcgr)
889 .Case("7400", ArchDefineName | ArchDefinePpcgr)
890 .Case("7450", ArchDefineName | ArchDefinePpcgr)
891 .Case("750", ArchDefineName | ArchDefinePpcgr)
892 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
893 | ArchDefinePpcsq)
894 .Case("pwr6", ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
895 .Case("pwr7", ArchDefineName | ArchDefinePwr6 | ArchDefinePpcgr
896 | ArchDefinePpcsq)
897 .Default(ArchDefineNone);
898
899 if (defs & ArchDefineName)
900 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
901 if (defs & ArchDefinePpcgr)
902 Builder.defineMacro("_ARCH_PPCGR");
903 if (defs & ArchDefinePpcsq)
904 Builder.defineMacro("_ARCH_PPCSQ");
905 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +0000906 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +0000907 if (defs & ArchDefine603)
908 Builder.defineMacro("_ARCH_603");
909 if (defs & ArchDefine604)
910 Builder.defineMacro("_ARCH_604");
911 if (defs & (ArchDefinePwr4 | ArchDefinePwr6))
912 Builder.defineMacro("_ARCH_PWR4");
913 if (defs & ArchDefinePwr6) {
914 Builder.defineMacro("_ARCH_PWR5");
Hal Finkel02a84272012-06-11 22:35:19 +0000915 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt199402b2013-02-01 02:14:03 +0000916 }
917}
918
919void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
920 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
921 .Case("7400", true)
922 .Case("g4", true)
923 .Case("7450", true)
924 .Case("g4+", true)
925 .Case("970", true)
926 .Case("g5", true)
927 .Case("pwr6", true)
928 .Case("pwr7", true)
929 .Case("ppc64", true)
930 .Default(false);
931}
932
933bool PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
934 StringRef Name,
935 bool Enabled) const {
936 if (Name == "altivec") {
937 Features[Name] = Enabled;
938 return true;
Hal Finkel02a84272012-06-11 22:35:19 +0000939 }
Bill Schmidt199402b2013-02-01 02:14:03 +0000940
941 return false;
Chris Lattnerc0f59212009-03-02 22:27:17 +0000942}
943
Douglas Gregore727d212012-01-30 06:38:25 +0000944bool PPCTargetInfo::hasFeature(StringRef Feature) const {
945 return Feature == "powerpc";
946}
Chris Lattner393ff042008-04-21 18:56:49 +0000947
Douglas Gregore727d212012-01-30 06:38:25 +0000948
Eli Friedmane4277982008-08-20 23:11:40 +0000949const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000950 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
951 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
952 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
953 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
954 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
955 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
956 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
957 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000958 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000959 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000960 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000961 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
962 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
963 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
964 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000965 "vrsave", "vscr",
966 "spe_acc", "spefscr",
967 "sfp"
968};
Reid Spencer5f016e22007-07-11 17:01:13 +0000969
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000970void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000971 unsigned &NumNames) const {
972 Names = GCCRegNames;
973 NumNames = llvm::array_lengthof(GCCRegNames);
974}
Reid Spencer5f016e22007-07-11 17:01:13 +0000975
Eli Friedmane4277982008-08-20 23:11:40 +0000976const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
977 // While some of these aliases do map to different registers
978 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000979 { { "0" }, "r0" },
980 { { "1"}, "r1" },
981 { { "2" }, "r2" },
982 { { "3" }, "r3" },
983 { { "4" }, "r4" },
984 { { "5" }, "r5" },
985 { { "6" }, "r6" },
986 { { "7" }, "r7" },
987 { { "8" }, "r8" },
988 { { "9" }, "r9" },
989 { { "10" }, "r10" },
990 { { "11" }, "r11" },
991 { { "12" }, "r12" },
992 { { "13" }, "r13" },
993 { { "14" }, "r14" },
994 { { "15" }, "r15" },
995 { { "16" }, "r16" },
996 { { "17" }, "r17" },
997 { { "18" }, "r18" },
998 { { "19" }, "r19" },
999 { { "20" }, "r20" },
1000 { { "21" }, "r21" },
1001 { { "22" }, "r22" },
1002 { { "23" }, "r23" },
1003 { { "24" }, "r24" },
1004 { { "25" }, "r25" },
1005 { { "26" }, "r26" },
1006 { { "27" }, "r27" },
1007 { { "28" }, "r28" },
1008 { { "29" }, "r29" },
1009 { { "30" }, "r30" },
1010 { { "31" }, "r31" },
1011 { { "fr0" }, "f0" },
1012 { { "fr1" }, "f1" },
1013 { { "fr2" }, "f2" },
1014 { { "fr3" }, "f3" },
1015 { { "fr4" }, "f4" },
1016 { { "fr5" }, "f5" },
1017 { { "fr6" }, "f6" },
1018 { { "fr7" }, "f7" },
1019 { { "fr8" }, "f8" },
1020 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +00001021 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001022 { { "fr11" }, "f11" },
1023 { { "fr12" }, "f12" },
1024 { { "fr13" }, "f13" },
1025 { { "fr14" }, "f14" },
1026 { { "fr15" }, "f15" },
1027 { { "fr16" }, "f16" },
1028 { { "fr17" }, "f17" },
1029 { { "fr18" }, "f18" },
1030 { { "fr19" }, "f19" },
1031 { { "fr20" }, "f20" },
1032 { { "fr21" }, "f21" },
1033 { { "fr22" }, "f22" },
1034 { { "fr23" }, "f23" },
1035 { { "fr24" }, "f24" },
1036 { { "fr25" }, "f25" },
1037 { { "fr26" }, "f26" },
1038 { { "fr27" }, "f27" },
1039 { { "fr28" }, "f28" },
1040 { { "fr29" }, "f29" },
1041 { { "fr30" }, "f30" },
1042 { { "fr31" }, "f31" },
1043 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +00001044};
1045
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001046void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +00001047 unsigned &NumAliases) const {
1048 Aliases = GCCRegAliases;
1049 NumAliases = llvm::array_lengthof(GCCRegAliases);
1050}
1051} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001052
1053namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001054class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001055public:
Chris Lattnere03ae302010-02-16 18:14:57 +00001056 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001057 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00001058 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +00001059
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001060 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001061 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001062 case llvm::Triple::FreeBSD:
1063 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001064 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001065 PtrDiffType = SignedInt;
1066 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001067 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001068 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001069 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001070 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001071
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001072 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1073 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001074 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001075 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001076
1077 // PPC32 supports atomics up to 4 bytes.
1078 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001079 }
1080
Meador Ingec5613b22012-06-16 03:34:49 +00001081 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001082 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001083 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001084 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001085};
1086} // end anonymous namespace.
1087
1088namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001089class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001090public:
Eli Friedmane4277982008-08-20 23:11:40 +00001091 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001092 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001093 IntMaxType = SignedLong;
1094 UIntMaxType = UnsignedLong;
1095 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001096
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001097 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1098 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001099 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001100 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1101 "i64:64:64-f32:32:32-f64:64:64-f128:64:64-"
1102 "v128:128:128-n32:64";
1103 } else
1104 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1105 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1106 "v128:128:128-n32:64";
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001107
1108 // PPC64 supports atomics up to 8 bytes.
1109 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerf291b102008-05-09 06:17:04 +00001110 }
Meador Ingec5613b22012-06-16 03:34:49 +00001111 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1112 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001113 }
Eli Friedmane4277982008-08-20 23:11:40 +00001114};
1115} // end anonymous namespace.
1116
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001117
1118namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001119class DarwinPPC32TargetInfo :
1120 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001121public:
Roman Divackyc81f2a22011-01-06 08:27:10 +00001122 DarwinPPC32TargetInfo(const std::string& triple)
1123 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001124 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001125 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001126 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001127 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001128 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1129 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001130 }
Meador Ingec5613b22012-06-16 03:34:49 +00001131 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1132 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001133 }
1134};
1135
1136class DarwinPPC64TargetInfo :
1137 public DarwinTargetInfo<PPC64TargetInfo> {
1138public:
1139 DarwinPPC64TargetInfo(const std::string& triple)
1140 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1141 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001142 SuitableAlign = 128;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001143 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1144 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001145 }
1146};
1147} // end anonymous namespace.
1148
Reid Spencer5f016e22007-07-11 17:01:13 +00001149namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001150 static const unsigned NVPTXAddrSpaceMap[] = {
1151 1, // opencl_global
1152 3, // opencl_local
1153 4, // opencl_constant
1154 1, // cuda_device
1155 4, // cuda_constant
1156 3, // cuda_shared
1157 };
1158 class NVPTXTargetInfo : public TargetInfo {
1159 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001160 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00001161 std::vector<StringRef> AvailableFeatures;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001162 public:
1163 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1164 BigEndian = false;
1165 TLSSupported = false;
1166 LongWidth = LongAlign = 64;
1167 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001168 // Define available target features
1169 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001170 NoAsmVariants = true;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001171 }
1172 virtual void getTargetDefines(const LangOptions &Opts,
1173 MacroBuilder &Builder) const {
1174 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001175 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001176 }
1177 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1178 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001179 Records = BuiltinInfo;
1180 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001181 }
1182 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001183 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001184 }
1185
1186 virtual void getGCCRegNames(const char * const *&Names,
1187 unsigned &NumNames) const;
1188 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1189 unsigned &NumAliases) const {
1190 // No aliases.
1191 Aliases = 0;
1192 NumAliases = 0;
1193 }
1194 virtual bool validateAsmConstraint(const char *&Name,
1195 TargetInfo::ConstraintInfo &info) const {
1196 // FIXME: implement
1197 return true;
1198 }
1199 virtual const char *getClobbers() const {
1200 // FIXME: Is this really right?
1201 return "";
1202 }
Meador Ingec5613b22012-06-16 03:34:49 +00001203 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001204 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001205 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001206 }
1207 virtual bool setCPU(const std::string &Name) {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001208 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001209 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001210 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1211 StringRef Name,
1212 bool Enabled) const;
1213 };
1214
1215 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1216#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1217#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1218 ALL_LANGUAGES },
1219#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001220 };
1221
1222 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1223 "r0"
1224 };
1225
1226 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1227 unsigned &NumNames) const {
1228 Names = GCCRegNames;
1229 NumNames = llvm::array_lengthof(GCCRegNames);
1230 }
1231
Justin Holewinski2c585b92012-05-24 17:43:12 +00001232 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1233 StringRef Name,
1234 bool Enabled) const {
1235 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1236 Name)) {
1237 Features[Name] = Enabled;
1238 return true;
1239 } else {
1240 return false;
1241 }
1242 }
1243
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001244 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1245 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001246 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001247 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001248 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001249 DescriptionString
1250 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1251 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1252 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001253 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001254 };
1255
1256 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1257 public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00001258 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001259 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001260 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001261 DescriptionString
1262 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1263 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1264 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001265 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001266 };
1267}
1268
1269namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001270
1271static const unsigned R600AddrSpaceMap[] = {
1272 1, // opencl_global
1273 3, // opencl_local
1274 2, // opencl_constant
1275 1, // cuda_device
1276 2, // cuda_constant
1277 3 // cuda_shared
1278};
1279
1280class R600TargetInfo : public TargetInfo {
1281public:
1282 R600TargetInfo(const std::string& triple) : TargetInfo(triple) {
1283 DescriptionString =
1284 "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16"
1285 "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:32:32"
1286 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64"
1287 "-v96:128:128-v128:128:128-v192:256:256-v256:256:256"
1288 "-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1289 "-n8:16:32:64";
1290 AddrSpaceMap = &R600AddrSpaceMap;
1291 }
1292
1293 virtual const char * getClobbers() const {
1294 return "";
1295 }
1296
1297 virtual void getGCCRegNames(const char * const *&Names,
1298 unsigned &numNames) const {
1299 Names = NULL;
1300 numNames = 0;
1301 }
1302
1303 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1304 unsigned &NumAliases) const {
1305 Aliases = NULL;
1306 NumAliases = 0;
1307 }
1308
1309 virtual bool validateAsmConstraint(const char *&Name,
1310 TargetInfo::ConstraintInfo &info) const {
1311 return true;
1312 }
1313
1314 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1315 unsigned &NumRecords) const {
1316 Records = NULL;
1317 NumRecords = 0;
1318 }
1319
1320
1321 virtual void getTargetDefines(const LangOptions &Opts,
1322 MacroBuilder &Builder) const {
1323 Builder.defineMacro("__R600__");
1324 }
1325
1326 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1327 return TargetInfo::CharPtrBuiltinVaList;
1328 }
1329
1330};
1331
1332} // end anonymous namespace
1333
1334namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001335// MBlaze abstract base class
1336class MBlazeTargetInfo : public TargetInfo {
1337 static const char * const GCCRegNames[];
1338 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1339
1340public:
1341 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001342 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001343 }
1344
1345 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1346 unsigned &NumRecords) const {
1347 // FIXME: Implement.
1348 Records = 0;
1349 NumRecords = 0;
1350 }
1351
1352 virtual void getTargetDefines(const LangOptions &Opts,
1353 MacroBuilder &Builder) const;
1354
Douglas Gregore727d212012-01-30 06:38:25 +00001355 virtual bool hasFeature(StringRef Feature) const {
1356 return Feature == "mblaze";
1357 }
1358
Meador Ingec5613b22012-06-16 03:34:49 +00001359 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1360 return TargetInfo::CharPtrBuiltinVaList;
Chris Lattner9cbeb632010-03-06 21:21:27 +00001361 }
1362 virtual const char *getTargetPrefix() const {
1363 return "mblaze";
1364 }
1365 virtual void getGCCRegNames(const char * const *&Names,
1366 unsigned &NumNames) const;
1367 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1368 unsigned &NumAliases) const;
1369 virtual bool validateAsmConstraint(const char *&Name,
1370 TargetInfo::ConstraintInfo &Info) const {
1371 switch (*Name) {
1372 default: return false;
1373 case 'O': // Zero
1374 return true;
1375 case 'b': // Base register
1376 case 'f': // Floating point register
1377 Info.setAllowsRegister();
1378 return true;
1379 }
1380 }
1381 virtual const char *getClobbers() const {
1382 return "";
1383 }
1384};
1385
1386/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1387/// #defines that are not tied to a specific subtarget.
1388void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1389 MacroBuilder &Builder) const {
1390 // Target identification.
1391 Builder.defineMacro("__microblaze__");
1392 Builder.defineMacro("_ARCH_MICROBLAZE");
1393 Builder.defineMacro("__MICROBLAZE__");
1394
1395 // Target properties.
1396 Builder.defineMacro("_BIG_ENDIAN");
1397 Builder.defineMacro("__BIG_ENDIAN__");
1398
1399 // Subtarget options.
1400 Builder.defineMacro("__REGISTER_PREFIX__", "");
1401}
1402
1403
1404const char * const MBlazeTargetInfo::GCCRegNames[] = {
1405 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1406 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1407 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1408 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1409 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1410 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1411 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1412 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1413 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1414 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1415};
1416
1417void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1418 unsigned &NumNames) const {
1419 Names = GCCRegNames;
1420 NumNames = llvm::array_lengthof(GCCRegNames);
1421}
1422
1423const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1424 { {"f0"}, "r0" },
1425 { {"f1"}, "r1" },
1426 { {"f2"}, "r2" },
1427 { {"f3"}, "r3" },
1428 { {"f4"}, "r4" },
1429 { {"f5"}, "r5" },
1430 { {"f6"}, "r6" },
1431 { {"f7"}, "r7" },
1432 { {"f8"}, "r8" },
1433 { {"f9"}, "r9" },
1434 { {"f10"}, "r10" },
1435 { {"f11"}, "r11" },
1436 { {"f12"}, "r12" },
1437 { {"f13"}, "r13" },
1438 { {"f14"}, "r14" },
1439 { {"f15"}, "r15" },
1440 { {"f16"}, "r16" },
1441 { {"f17"}, "r17" },
1442 { {"f18"}, "r18" },
1443 { {"f19"}, "r19" },
1444 { {"f20"}, "r20" },
1445 { {"f21"}, "r21" },
1446 { {"f22"}, "r22" },
1447 { {"f23"}, "r23" },
1448 { {"f24"}, "r24" },
1449 { {"f25"}, "r25" },
1450 { {"f26"}, "r26" },
1451 { {"f27"}, "r27" },
1452 { {"f28"}, "r28" },
1453 { {"f29"}, "r29" },
1454 { {"f30"}, "r30" },
1455 { {"f31"}, "r31" },
1456};
1457
1458void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1459 unsigned &NumAliases) const {
1460 Aliases = GCCRegAliases;
1461 NumAliases = llvm::array_lengthof(GCCRegAliases);
1462}
1463} // end anonymous namespace.
1464
1465namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001466// Namespace for x86 abstract base class
1467const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001468#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001469#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001470 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001471#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001472};
Eli Friedman61538a72008-05-20 14:21:01 +00001473
Nuno Lopes2550d702009-12-23 17:49:57 +00001474static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001475 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1476 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001477 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001478 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1479 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1480 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001481 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001482 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1483 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001484};
1485
Eric Christophercfd323d2011-06-21 00:05:20 +00001486const TargetInfo::AddlRegName AddlRegNames[] = {
1487 { { "al", "ah", "eax", "rax" }, 0 },
1488 { { "bl", "bh", "ebx", "rbx" }, 3 },
1489 { { "cl", "ch", "ecx", "rcx" }, 2 },
1490 { { "dl", "dh", "edx", "rdx" }, 1 },
1491 { { "esi", "rsi" }, 4 },
1492 { { "edi", "rdi" }, 5 },
1493 { { "esp", "rsp" }, 7 },
1494 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001495};
1496
1497// X86 target abstract base class; x86-32 and x86-64 are very close, so
1498// most of the implementation can be shared.
1499class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001500 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001501 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001502 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001503 enum MMX3DNowEnum {
1504 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1505 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001506
Eric Christophereea12d12010-04-02 23:50:19 +00001507 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001508 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001509 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001510 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001511 bool HasBMI;
1512 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001513 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001514 bool HasRTM;
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00001515 bool HasSSE4a;
Craig Topper6a511e12011-12-30 07:33:42 +00001516 bool HasFMA4;
Craig Topper2ae95072012-06-03 21:46:30 +00001517 bool HasFMA;
Craig Topperb6af69e2012-06-09 22:24:14 +00001518 bool HasXOP;
Manman Ren146e5a42012-10-11 00:59:55 +00001519 bool HasF16C;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001520
Chandler Carruth499d9722011-09-28 08:55:34 +00001521 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1522 ///
1523 /// Each enumeration represents a particular CPU supported by Clang. These
1524 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1525 enum CPUKind {
1526 CK_Generic,
1527
1528 /// \name i386
1529 /// i386-generation processors.
1530 //@{
1531 CK_i386,
1532 //@}
1533
1534 /// \name i486
1535 /// i486-generation processors.
1536 //@{
1537 CK_i486,
1538 CK_WinChipC6,
1539 CK_WinChip2,
1540 CK_C3,
1541 //@}
1542
1543 /// \name i586
1544 /// i586-generation processors, P5 microarchitecture based.
1545 //@{
1546 CK_i586,
1547 CK_Pentium,
1548 CK_PentiumMMX,
1549 //@}
1550
1551 /// \name i686
1552 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1553 //@{
1554 CK_i686,
1555 CK_PentiumPro,
1556 CK_Pentium2,
1557 CK_Pentium3,
1558 CK_Pentium3M,
1559 CK_PentiumM,
1560 CK_C3_2,
1561
1562 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1563 /// Clang however has some logic to suport this.
1564 // FIXME: Warn, deprecate, and potentially remove this.
1565 CK_Yonah,
1566 //@}
1567
1568 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001569 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001570 //@{
1571 CK_Pentium4,
1572 CK_Pentium4M,
1573 CK_Prescott,
1574 CK_Nocona,
1575 //@}
1576
1577 /// \name Core
1578 /// Core microarchitecture based processors.
1579 //@{
1580 CK_Core2,
1581
1582 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1583 /// codename which GCC no longer accepts as an option to -march, but Clang
1584 /// has some logic for recognizing it.
1585 // FIXME: Warn, deprecate, and potentially remove this.
1586 CK_Penryn,
1587 //@}
1588
1589 /// \name Atom
1590 /// Atom processors
1591 //@{
1592 CK_Atom,
1593 //@}
1594
1595 /// \name Nehalem
1596 /// Nehalem microarchitecture based processors.
1597 //@{
1598 CK_Corei7,
1599 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001600 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001601 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001602 //@}
1603
1604 /// \name K6
1605 /// K6 architecture processors.
1606 //@{
1607 CK_K6,
1608 CK_K6_2,
1609 CK_K6_3,
1610 //@}
1611
1612 /// \name K7
1613 /// K7 architecture processors.
1614 //@{
1615 CK_Athlon,
1616 CK_AthlonThunderbird,
1617 CK_Athlon4,
1618 CK_AthlonXP,
1619 CK_AthlonMP,
1620 //@}
1621
1622 /// \name K8
1623 /// K8 architecture processors.
1624 //@{
1625 CK_Athlon64,
1626 CK_Athlon64SSE3,
1627 CK_AthlonFX,
1628 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001629 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001630 CK_Opteron,
1631 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001632 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001633 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001634
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001635 /// \name Bobcat
1636 /// Bobcat architecture processors.
1637 //@{
1638 CK_BTVER1,
1639 //@}
1640
1641 /// \name Bulldozer
1642 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001643 //@{
1644 CK_BDVER1,
1645 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001646 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001647
Chandler Carruth499d9722011-09-28 08:55:34 +00001648 /// This specification is deprecated and will be removed in the future.
1649 /// Users should prefer \see CK_K8.
1650 // FIXME: Warn on this when the CPU is set to it.
1651 CK_x86_64,
1652 //@}
1653
1654 /// \name Geode
1655 /// Geode processors.
1656 //@{
1657 CK_Geode
1658 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001659 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001660
Eli Friedman618234a2008-08-20 02:34:37 +00001661public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001662 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001663 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Benjamin Kramer84f30802012-07-07 09:39:18 +00001664 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
Michael Liao463eb892012-11-10 05:17:46 +00001665 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false),
1666 HasSSE4a(false), HasFMA4(false), HasFMA(false), HasXOP(false),
1667 HasF16C(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001668 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001669 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001670 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001671 virtual unsigned getFloatEvalMethod() const {
1672 // X87 evaluates with 80 bits "long double" precision.
1673 return SSELevel == NoSSE ? 2 : 0;
1674 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001675 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1676 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001677 Records = BuiltinInfo;
1678 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001679 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001680 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001681 unsigned &NumNames) const {
1682 Names = GCCRegNames;
1683 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001684 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001685 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001686 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001687 Aliases = 0;
1688 NumAliases = 0;
1689 }
1690 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopher825d3862012-11-14 22:08:59 +00001691 unsigned &NumNames) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001692 Names = AddlRegNames;
1693 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001694 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001695 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001696 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001697 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001698 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001699 return "~{dirflag},~{fpsr},~{flags}";
1700 }
Chris Lattner33328642009-03-20 15:52:06 +00001701 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001702 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001703 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001704 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001705 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001706 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001707 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001708 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001709 virtual const char* getABI() const {
Derek Schuffbabaf312012-10-11 15:52:22 +00001710 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001711 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001712 else if (getTriple().getArch() == llvm::Triple::x86 &&
1713 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001714 return "no-mmx";
1715 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001716 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001717 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001718 CPU = llvm::StringSwitch<CPUKind>(Name)
1719 .Case("i386", CK_i386)
1720 .Case("i486", CK_i486)
1721 .Case("winchip-c6", CK_WinChipC6)
1722 .Case("winchip2", CK_WinChip2)
1723 .Case("c3", CK_C3)
1724 .Case("i586", CK_i586)
1725 .Case("pentium", CK_Pentium)
1726 .Case("pentium-mmx", CK_PentiumMMX)
1727 .Case("i686", CK_i686)
1728 .Case("pentiumpro", CK_PentiumPro)
1729 .Case("pentium2", CK_Pentium2)
1730 .Case("pentium3", CK_Pentium3)
1731 .Case("pentium3m", CK_Pentium3M)
1732 .Case("pentium-m", CK_PentiumM)
1733 .Case("c3-2", CK_C3_2)
1734 .Case("yonah", CK_Yonah)
1735 .Case("pentium4", CK_Pentium4)
1736 .Case("pentium4m", CK_Pentium4M)
1737 .Case("prescott", CK_Prescott)
1738 .Case("nocona", CK_Nocona)
1739 .Case("core2", CK_Core2)
1740 .Case("penryn", CK_Penryn)
1741 .Case("atom", CK_Atom)
1742 .Case("corei7", CK_Corei7)
1743 .Case("corei7-avx", CK_Corei7AVX)
1744 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001745 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001746 .Case("k6", CK_K6)
1747 .Case("k6-2", CK_K6_2)
1748 .Case("k6-3", CK_K6_3)
1749 .Case("athlon", CK_Athlon)
1750 .Case("athlon-tbird", CK_AthlonThunderbird)
1751 .Case("athlon-4", CK_Athlon4)
1752 .Case("athlon-xp", CK_AthlonXP)
1753 .Case("athlon-mp", CK_AthlonMP)
1754 .Case("athlon64", CK_Athlon64)
1755 .Case("athlon64-sse3", CK_Athlon64SSE3)
1756 .Case("athlon-fx", CK_AthlonFX)
1757 .Case("k8", CK_K8)
1758 .Case("k8-sse3", CK_K8SSE3)
1759 .Case("opteron", CK_Opteron)
1760 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001761 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001762 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001763 .Case("bdver1", CK_BDVER1)
1764 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001765 .Case("x86-64", CK_x86_64)
1766 .Case("geode", CK_Geode)
1767 .Default(CK_Generic);
1768
Chandler Carruth26a39142011-09-28 09:45:08 +00001769 // Perform any per-CPU checks necessary to determine if this CPU is
1770 // acceptable.
1771 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1772 // invalid without explaining *why*.
1773 switch (CPU) {
1774 case CK_Generic:
1775 // No processor selected!
1776 return false;
1777
1778 case CK_i386:
1779 case CK_i486:
1780 case CK_WinChipC6:
1781 case CK_WinChip2:
1782 case CK_C3:
1783 case CK_i586:
1784 case CK_Pentium:
1785 case CK_PentiumMMX:
1786 case CK_i686:
1787 case CK_PentiumPro:
1788 case CK_Pentium2:
1789 case CK_Pentium3:
1790 case CK_Pentium3M:
1791 case CK_PentiumM:
1792 case CK_Yonah:
1793 case CK_C3_2:
1794 case CK_Pentium4:
1795 case CK_Pentium4M:
1796 case CK_Prescott:
1797 case CK_K6:
1798 case CK_K6_2:
1799 case CK_K6_3:
1800 case CK_Athlon:
1801 case CK_AthlonThunderbird:
1802 case CK_Athlon4:
1803 case CK_AthlonXP:
1804 case CK_AthlonMP:
1805 case CK_Geode:
1806 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001807 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001808 return false;
1809
1810 // Fallthrough
1811 case CK_Nocona:
1812 case CK_Core2:
1813 case CK_Penryn:
1814 case CK_Atom:
1815 case CK_Corei7:
1816 case CK_Corei7AVX:
1817 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001818 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001819 case CK_Athlon64:
1820 case CK_Athlon64SSE3:
1821 case CK_AthlonFX:
1822 case CK_K8:
1823 case CK_K8SSE3:
1824 case CK_Opteron:
1825 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001826 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001827 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001828 case CK_BDVER1:
1829 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001830 case CK_x86_64:
1831 return true;
1832 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001833 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001834 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00001835
1836 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1837 // We accept all non-ARM calling conventions
1838 return (CC == CC_X86ThisCall ||
1839 CC == CC_X86FastCall ||
1840 CC == CC_X86StdCall ||
1841 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00001842 CC == CC_X86Pascal ||
1843 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001844 }
1845
Aaron Ballmanfff32482012-12-09 17:45:41 +00001846 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1847 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001848 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001849};
Chris Lattner3daed522009-03-02 22:20:04 +00001850
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001851void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001852 // FIXME: This should not be here.
1853 Features["3dnow"] = false;
1854 Features["3dnowa"] = false;
1855 Features["mmx"] = false;
1856 Features["sse"] = false;
1857 Features["sse2"] = false;
1858 Features["sse3"] = false;
1859 Features["ssse3"] = false;
1860 Features["sse41"] = false;
1861 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001862 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001863 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00001864 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001865 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001866 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001867 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001868 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001869 Features["bmi"] = false;
1870 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001871 Features["popcnt"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00001872 Features["rtm"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001873 Features["fma4"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00001874 Features["fma"] = false;
Craig Topperb6af69e2012-06-09 22:24:14 +00001875 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00001876 Features["f16c"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001877
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001878 // FIXME: This *really* should not be here.
1879
1880 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00001881 if (getTriple().getArch() == llvm::Triple::x86_64)
Eli Friedman612db2a2012-11-17 01:16:19 +00001882 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001883
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001884 switch (CPU) {
1885 case CK_Generic:
1886 case CK_i386:
1887 case CK_i486:
1888 case CK_i586:
1889 case CK_Pentium:
1890 case CK_i686:
1891 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001892 break;
1893 case CK_PentiumMMX:
1894 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001895 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001896 break;
1897 case CK_Pentium3:
1898 case CK_Pentium3M:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001899 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001900 break;
1901 case CK_PentiumM:
1902 case CK_Pentium4:
1903 case CK_Pentium4M:
1904 case CK_x86_64:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001905 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001906 break;
1907 case CK_Yonah:
1908 case CK_Prescott:
1909 case CK_Nocona:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001910 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001911 break;
1912 case CK_Core2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001913 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001914 break;
1915 case CK_Penryn:
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001916 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001917 break;
1918 case CK_Atom:
Chandler Carruth49defe62011-09-28 10:36:46 +00001919 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001920 break;
1921 case CK_Corei7:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001922 setFeatureEnabled(Features, "sse4", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001923 break;
1924 case CK_Corei7AVX:
Benjamin Kramer84f30802012-07-07 09:39:18 +00001925 setFeatureEnabled(Features, "avx", true);
1926 setFeatureEnabled(Features, "aes", true);
1927 setFeatureEnabled(Features, "pclmul", true);
1928 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001929 case CK_CoreAVXi:
Craig Topperfd936302012-04-26 07:31:30 +00001930 setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001931 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00001932 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00001933 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00001934 setFeatureEnabled(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001935 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001936 case CK_CoreAVX2:
Craig Topperfd936302012-04-26 07:31:30 +00001937 setFeatureEnabled(Features, "avx2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001938 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00001939 setFeatureEnabled(Features, "pclmul", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001940 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00001941 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00001942 setFeatureEnabled(Features, "f16c", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001943 setFeatureEnabled(Features, "bmi", true);
1944 setFeatureEnabled(Features, "bmi2", true);
Michael Liao463eb892012-11-10 05:17:46 +00001945 setFeatureEnabled(Features, "rtm", true);
Craig Topper2ae95072012-06-03 21:46:30 +00001946 setFeatureEnabled(Features, "fma", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001947 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001948 case CK_K6:
1949 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001950 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001951 break;
1952 case CK_K6_2:
1953 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001954 case CK_WinChip2:
1955 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001956 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001957 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001958 case CK_Athlon:
1959 case CK_AthlonThunderbird:
1960 case CK_Geode:
1961 setFeatureEnabled(Features, "3dnowa", true);
1962 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001963 case CK_Athlon4:
1964 case CK_AthlonXP:
1965 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001966 setFeatureEnabled(Features, "sse", true);
1967 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001968 break;
1969 case CK_K8:
1970 case CK_Opteron:
1971 case CK_Athlon64:
1972 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001973 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001974 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001975 break;
1976 case CK_K8SSE3:
1977 case CK_OpteronSSE3:
1978 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001979 setFeatureEnabled(Features, "sse3", true);
1980 setFeatureEnabled(Features, "3dnowa", true);
1981 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001982 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001983 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001984 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001985 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00001986 setFeatureEnabled(Features, "lzcnt", true);
1987 setFeatureEnabled(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001988 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001989 case CK_BTVER1:
1990 setFeatureEnabled(Features, "ssse3", true);
1991 setFeatureEnabled(Features, "sse4a", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00001992 setFeatureEnabled(Features, "lzcnt", true);
1993 setFeatureEnabled(Features, "popcnt", true);
Craig Topper90ea0362012-05-30 05:54:54 +00001994 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001995 case CK_BDVER1:
Craig Topperb6af69e2012-06-09 22:24:14 +00001996 setFeatureEnabled(Features, "xop", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00001997 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001998 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00001999 setFeatureEnabled(Features, "pclmul", true);
Eli Friedmanf5824992012-11-26 21:57:28 +00002000 break;
Eli Friedmanfaf35382012-11-17 01:43:10 +00002001 case CK_BDVER2:
2002 setFeatureEnabled(Features, "xop", true);
2003 setFeatureEnabled(Features, "lzcnt", true);
2004 setFeatureEnabled(Features, "aes", true);
2005 setFeatureEnabled(Features, "pclmul", true);
2006 setFeatureEnabled(Features, "bmi", true);
2007 setFeatureEnabled(Features, "fma", true);
2008 setFeatureEnabled(Features, "f16c", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002009 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002010 case CK_C3_2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002011 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002012 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002013 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002014}
2015
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002016bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00002017 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002018 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002019 // FIXME: This *really* should not be here. We need some way of translating
2020 // options into llvm subtarget features.
2021 if (!Features.count(Name) &&
Benjamin Kramer84f30802012-07-07 09:39:18 +00002022 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
2023 Name != "rdrnd"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002024 return false;
2025
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002026 // FIXME: this should probably use a switch with fall through.
2027
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002028 if (Enabled) {
2029 if (Name == "mmx")
2030 Features["mmx"] = true;
2031 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002032 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002033 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002034 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002035 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002036 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2037 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002038 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002039 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002040 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002041 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002042 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002043 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2044 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00002045 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002046 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00002047 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002048 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002049 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002050 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002051 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00002052 else if (Name == "aes")
Craig Toppera7463c32012-06-03 21:56:22 +00002053 Features["sse"] = Features["sse2"] = Features["aes"] = true;
Craig Topper3c0bc152012-05-31 05:18:48 +00002054 else if (Name == "pclmul")
Craig Toppera7463c32012-06-03 21:56:22 +00002055 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002056 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002057 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2058 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002059 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00002060 else if (Name == "avx2")
2061 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2062 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00002063 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper2ae95072012-06-03 21:46:30 +00002064 else if (Name == "fma")
2065 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2066 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2067 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00002068 else if (Name == "fma4")
Eli Friedman612db2a2012-11-17 01:16:19 +00002069 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002070 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002071 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2072 Features["fma4"] = true;
Craig Topperb6af69e2012-06-09 22:24:14 +00002073 else if (Name == "xop")
Eli Friedman612db2a2012-11-17 01:16:19 +00002074 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002075 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2076 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2077 Features["fma4"] = Features["xop"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00002078 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00002079 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper90ea0362012-05-30 05:54:54 +00002080 Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002081 else if (Name == "lzcnt")
2082 Features["lzcnt"] = true;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002083 else if (Name == "rdrnd")
2084 Features["rdrand"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00002085 else if (Name == "bmi")
2086 Features["bmi"] = true;
2087 else if (Name == "bmi2")
2088 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00002089 else if (Name == "popcnt")
2090 Features["popcnt"] = true;
Manman Ren146e5a42012-10-11 00:59:55 +00002091 else if (Name == "f16c")
2092 Features["f16c"] = true;
Michael Liao463eb892012-11-10 05:17:46 +00002093 else if (Name == "rtm")
2094 Features["rtm"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002095 } else {
2096 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002097 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002098 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00002099 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00002100 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002101 Features["sse4a"] = Features["avx"] = Features["avx2"] =
2102 Features["fma"] = Features["fma4"] = Features["aes"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002103 Features["pclmul"] = Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002104 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00002105 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Toppera7463c32012-06-03 21:56:22 +00002106 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002107 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002108 Features["fma4"] = Features["aes"] = Features["pclmul"] =
2109 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002110 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00002111 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper31380fb2012-06-03 22:23:42 +00002112 Features["sse42"] = Features["sse4a"] = Features["avx"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002113 Features["avx2"] = Features["fma"] = Features["fma4"] =
2114 Features["xop"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002115 else if (Name == "ssse3")
Craig Topper31380fb2012-06-03 22:23:42 +00002116 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2117 Features["avx"] = Features["avx2"] = Features["fma"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00002118 else if (Name == "sse4" || Name == "sse4.1")
Craig Topper31380fb2012-06-03 22:23:42 +00002119 Features["sse41"] = Features["sse42"] = Features["avx"] =
2120 Features["avx2"] = Features["fma"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00002121 else if (Name == "sse4.2")
Craig Topper31380fb2012-06-03 22:23:42 +00002122 Features["sse42"] = Features["avx"] = Features["avx2"] =
2123 Features["fma"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002124 else if (Name == "3dnow")
2125 Features["3dnow"] = Features["3dnowa"] = false;
2126 else if (Name == "3dnowa")
2127 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00002128 else if (Name == "aes")
2129 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00002130 else if (Name == "pclmul")
2131 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00002132 else if (Name == "avx")
Craig Topper2ae95072012-06-03 21:46:30 +00002133 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperb6af69e2012-06-09 22:24:14 +00002134 Features["fma4"] = Features["xop"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00002135 else if (Name == "avx2")
2136 Features["avx2"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00002137 else if (Name == "fma")
2138 Features["fma"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00002139 else if (Name == "sse4a")
Craig Topperb6af69e2012-06-09 22:24:14 +00002140 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002141 else if (Name == "lzcnt")
2142 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00002143 else if (Name == "rdrnd")
2144 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00002145 else if (Name == "bmi")
2146 Features["bmi"] = false;
2147 else if (Name == "bmi2")
2148 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00002149 else if (Name == "popcnt")
2150 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00002151 else if (Name == "fma4")
Craig Topperb6af69e2012-06-09 22:24:14 +00002152 Features["fma4"] = Features["xop"] = false;
2153 else if (Name == "xop")
2154 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00002155 else if (Name == "f16c")
2156 Features["f16c"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00002157 else if (Name == "rtm")
2158 Features["rtm"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002159 }
2160
2161 return true;
2162}
2163
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002164/// HandleTargetOptions - Perform initialization based on the user
2165/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002166void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002167 // Remember the maximum enabled sselevel.
2168 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2169 // Ignore disabled features.
2170 if (Features[i][0] == '-')
2171 continue;
2172
Benjamin Kramer713575a2012-03-05 15:10:44 +00002173 StringRef Feature = StringRef(Features[i]).substr(1);
2174
2175 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00002176 HasAES = true;
2177 continue;
2178 }
2179
Craig Topper3c0bc152012-05-31 05:18:48 +00002180 if (Feature == "pclmul") {
2181 HasPCLMUL = true;
2182 continue;
2183 }
2184
Benjamin Kramer713575a2012-03-05 15:10:44 +00002185 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002186 HasLZCNT = true;
2187 continue;
2188 }
2189
Benjamin Kramer84f30802012-07-07 09:39:18 +00002190 if (Feature == "rdrand") {
2191 HasRDRND = true;
2192 continue;
2193 }
2194
Benjamin Kramer713575a2012-03-05 15:10:44 +00002195 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002196 HasBMI = true;
2197 continue;
2198 }
2199
Benjamin Kramer713575a2012-03-05 15:10:44 +00002200 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002201 HasBMI2 = true;
2202 continue;
2203 }
2204
Benjamin Kramer713575a2012-03-05 15:10:44 +00002205 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002206 HasPOPCNT = true;
2207 continue;
2208 }
2209
Michael Liao463eb892012-11-10 05:17:46 +00002210 if (Feature == "rtm") {
2211 HasRTM = true;
2212 continue;
2213 }
2214
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002215 if (Feature == "sse4a") {
2216 HasSSE4a = true;
2217 continue;
2218 }
2219
Benjamin Kramer713575a2012-03-05 15:10:44 +00002220 if (Feature == "fma4") {
Craig Topper6a511e12011-12-30 07:33:42 +00002221 HasFMA4 = true;
2222 continue;
2223 }
2224
Craig Topper2ae95072012-06-03 21:46:30 +00002225 if (Feature == "fma") {
2226 HasFMA = true;
2227 continue;
2228 }
2229
Craig Topperb6af69e2012-06-09 22:24:14 +00002230 if (Feature == "xop") {
2231 HasXOP = true;
2232 continue;
2233 }
2234
Manman Ren146e5a42012-10-11 00:59:55 +00002235 if (Feature == "f16c") {
2236 HasF16C = true;
2237 continue;
2238 }
2239
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002240 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002241 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper05fe4b52012-01-09 09:19:09 +00002242 .Case("avx2", AVX2)
2243 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002244 .Case("sse42", SSE42)
2245 .Case("sse41", SSE41)
2246 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00002247 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002248 .Case("sse2", SSE2)
2249 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002250 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002251 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002252
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002253 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002254 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002255 .Case("3dnowa", AMD3DNowAthlon)
2256 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002257 .Case("mmx", MMX)
2258 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002259
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002260 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002261 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002262
2263 // Don't tell the backend if we're turning off mmx; it will end up disabling
2264 // SSE, which we don't want.
2265 std::vector<std::string>::iterator it;
2266 it = std::find(Features.begin(), Features.end(), "-mmx");
2267 if (it != Features.end())
2268 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00002269}
Chris Lattnerc0f59212009-03-02 22:27:17 +00002270
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002271/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2272/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00002273void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002274 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002275 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002276 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002277 Builder.defineMacro("__amd64__");
2278 Builder.defineMacro("__amd64");
2279 Builder.defineMacro("__x86_64");
2280 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002281 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002282 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002283 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002284
Chris Lattnerc0f59212009-03-02 22:27:17 +00002285 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002286 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2287 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002288 switch (CPU) {
2289 case CK_Generic:
2290 break;
2291 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002292 // The rest are coming from the i386 define above.
2293 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002294 break;
2295 case CK_i486:
2296 case CK_WinChipC6:
2297 case CK_WinChip2:
2298 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002299 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002300 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002301 case CK_PentiumMMX:
2302 Builder.defineMacro("__pentium_mmx__");
2303 Builder.defineMacro("__tune_pentium_mmx__");
2304 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002305 case CK_i586:
2306 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002307 defineCPUMacros(Builder, "i586");
2308 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002309 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002310 case CK_Pentium3:
2311 case CK_Pentium3M:
2312 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002313 Builder.defineMacro("__tune_pentium3__");
2314 // Fallthrough
2315 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002316 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002317 Builder.defineMacro("__tune_pentium2__");
2318 // Fallthrough
2319 case CK_PentiumPro:
2320 Builder.defineMacro("__tune_i686__");
2321 Builder.defineMacro("__tune_pentiumpro__");
2322 // Fallthrough
2323 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002324 Builder.defineMacro("__i686");
2325 Builder.defineMacro("__i686__");
2326 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2327 Builder.defineMacro("__pentiumpro");
2328 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002329 break;
2330 case CK_Pentium4:
2331 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002332 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002333 break;
2334 case CK_Yonah:
2335 case CK_Prescott:
2336 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002337 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002338 break;
2339 case CK_Core2:
2340 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002341 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002342 break;
2343 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002344 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002345 break;
2346 case CK_Corei7:
2347 case CK_Corei7AVX:
2348 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002349 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002350 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002351 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002352 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002353 Builder.defineMacro("__k6_2__");
2354 Builder.defineMacro("__tune_k6_2__");
2355 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002356 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002357 if (CPU != CK_K6_2) { // In case of fallthrough
2358 // FIXME: GCC may be enabling these in cases where some other k6
2359 // architecture is specified but -m3dnow is explicitly provided. The
2360 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002361 Builder.defineMacro("__k6_3__");
2362 Builder.defineMacro("__tune_k6_3__");
2363 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002364 // Fallthrough
2365 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002366 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002367 break;
2368 case CK_Athlon:
2369 case CK_AthlonThunderbird:
2370 case CK_Athlon4:
2371 case CK_AthlonXP:
2372 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002373 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002374 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002375 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002376 Builder.defineMacro("__tune_athlon_sse__");
2377 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002378 break;
2379 case CK_K8:
2380 case CK_K8SSE3:
2381 case CK_x86_64:
2382 case CK_Opteron:
2383 case CK_OpteronSSE3:
2384 case CK_Athlon64:
2385 case CK_Athlon64SSE3:
2386 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002387 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002388 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002389 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002390 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002391 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002392 case CK_BTVER1:
2393 defineCPUMacros(Builder, "btver1");
2394 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002395 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002396 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002397 break;
2398 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002399 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002400 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002401 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002402 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002403 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002404 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002405
Chandler Carruth88c75b02011-09-28 09:54:07 +00002406 // Target properties.
2407 Builder.defineMacro("__LITTLE_ENDIAN__");
2408 Builder.defineMacro("__REGISTER_PREFIX__", "");
2409
Chris Lattner54175442009-04-19 17:32:33 +00002410 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2411 // functions in glibc header files that use FP Stack inline asm which the
2412 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002413 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002414
Chandler Carruth88c75b02011-09-28 09:54:07 +00002415 if (HasAES)
2416 Builder.defineMacro("__AES__");
2417
Craig Topper3c0bc152012-05-31 05:18:48 +00002418 if (HasPCLMUL)
2419 Builder.defineMacro("__PCLMUL__");
2420
Craig Topper31ceea02011-12-25 05:06:45 +00002421 if (HasLZCNT)
2422 Builder.defineMacro("__LZCNT__");
2423
Benjamin Kramer84f30802012-07-07 09:39:18 +00002424 if (HasRDRND)
2425 Builder.defineMacro("__RDRND__");
2426
Craig Topper31ceea02011-12-25 05:06:45 +00002427 if (HasBMI)
2428 Builder.defineMacro("__BMI__");
2429
2430 if (HasBMI2)
2431 Builder.defineMacro("__BMI2__");
2432
Craig Toppere14e08b2011-12-29 16:10:46 +00002433 if (HasPOPCNT)
2434 Builder.defineMacro("__POPCNT__");
2435
Michael Liao463eb892012-11-10 05:17:46 +00002436 if (HasRTM)
2437 Builder.defineMacro("__RTM__");
2438
Benjamin Kramer4dfa5ad2012-05-29 17:48:39 +00002439 if (HasSSE4a)
2440 Builder.defineMacro("__SSE4A__");
2441
Craig Topper6a511e12011-12-30 07:33:42 +00002442 if (HasFMA4)
2443 Builder.defineMacro("__FMA4__");
2444
Craig Topper2ae95072012-06-03 21:46:30 +00002445 if (HasFMA)
2446 Builder.defineMacro("__FMA__");
2447
Craig Topperb6af69e2012-06-09 22:24:14 +00002448 if (HasXOP)
2449 Builder.defineMacro("__XOP__");
2450
Manman Ren146e5a42012-10-11 00:59:55 +00002451 if (HasF16C)
2452 Builder.defineMacro("__F16C__");
2453
Chris Lattner84f0ea82009-03-02 22:40:39 +00002454 // Each case falls through to the previous one here.
2455 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002456 case AVX2:
2457 Builder.defineMacro("__AVX2__");
2458 case AVX:
2459 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002460 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002461 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002462 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002463 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002464 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002465 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002466 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002467 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002468 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002469 Builder.defineMacro("__SSE2__");
2470 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002471 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002472 Builder.defineMacro("__SSE__");
2473 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002474 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002475 break;
2476 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002477
Derek Schuffbabaf312012-10-11 15:52:22 +00002478 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002479 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002480 case AVX2:
2481 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002482 case SSE42:
2483 case SSE41:
2484 case SSSE3:
2485 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002486 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002487 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002488 break;
2489 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002490 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002491 break;
2492 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002493 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002494 }
2495 }
2496
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002497 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002498 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002499 case AMD3DNowAthlon:
2500 Builder.defineMacro("__3dNOW_A__");
2501 case AMD3DNow:
2502 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002503 case MMX:
2504 Builder.defineMacro("__MMX__");
2505 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002506 break;
2507 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002508}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002509
Douglas Gregore727d212012-01-30 06:38:25 +00002510bool X86TargetInfo::hasFeature(StringRef Feature) const {
2511 return llvm::StringSwitch<bool>(Feature)
2512 .Case("aes", HasAES)
2513 .Case("avx", SSELevel >= AVX)
2514 .Case("avx2", SSELevel >= AVX2)
2515 .Case("bmi", HasBMI)
2516 .Case("bmi2", HasBMI2)
Craig Topper2ae95072012-06-03 21:46:30 +00002517 .Case("fma", HasFMA)
Douglas Gregore727d212012-01-30 06:38:25 +00002518 .Case("fma4", HasFMA4)
2519 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002520 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002521 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2522 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2523 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002524 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002525 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002526 .Case("rtm", HasRTM)
Douglas Gregore727d212012-01-30 06:38:25 +00002527 .Case("sse", SSELevel >= SSE1)
2528 .Case("sse2", SSELevel >= SSE2)
2529 .Case("sse3", SSELevel >= SSE3)
2530 .Case("ssse3", SSELevel >= SSSE3)
2531 .Case("sse41", SSELevel >= SSE41)
2532 .Case("sse42", SSELevel >= SSE42)
Craig Topper3c0bc152012-05-31 05:18:48 +00002533 .Case("sse4a", HasSSE4a)
Douglas Gregore727d212012-01-30 06:38:25 +00002534 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002535 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2536 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Craig Topperb6af69e2012-06-09 22:24:14 +00002537 .Case("xop", HasXOP)
Manman Ren146e5a42012-10-11 00:59:55 +00002538 .Case("f16c", HasF16C)
Douglas Gregore727d212012-01-30 06:38:25 +00002539 .Default(false);
2540}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002541
Eli Friedman618234a2008-08-20 02:34:37 +00002542bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002543X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002544 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002545 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002546 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002547 case 'Y': // first letter of a pair:
2548 switch (*(Name+1)) {
2549 default: return false;
2550 case '0': // First SSE register.
2551 case 't': // Any SSE register, when SSE2 is enabled.
2552 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2553 case 'm': // any MMX register, when inter-unit moves enabled.
2554 break; // falls through to setAllowsRegister.
2555 }
Eli Friedman618234a2008-08-20 02:34:37 +00002556 case 'a': // eax.
2557 case 'b': // ebx.
2558 case 'c': // ecx.
2559 case 'd': // edx.
2560 case 'S': // esi.
2561 case 'D': // edi.
2562 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002563 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002564 case 't': // top of floating point stack.
2565 case 'u': // second from top of floating point stack.
2566 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002567 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002568 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002569 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002570 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2571 case 'l': // "Index" registers: any general register that can be used as an
2572 // index in a base+index memory access.
2573 Info.setAllowsRegister();
2574 return true;
2575 case 'C': // SSE floating point constant.
2576 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002577 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002578 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002579 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002580 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002581 return true;
2582 }
2583}
2584
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002585
Eli Friedman618234a2008-08-20 02:34:37 +00002586std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002587X86TargetInfo::convertConstraint(const char *&Constraint) const {
2588 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002589 case 'a': return std::string("{ax}");
2590 case 'b': return std::string("{bx}");
2591 case 'c': return std::string("{cx}");
2592 case 'd': return std::string("{dx}");
2593 case 'S': return std::string("{si}");
2594 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002595 case 'p': // address
2596 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002597 case 't': // top of floating point stack.
2598 return std::string("{st}");
2599 case 'u': // second from top of floating point stack.
2600 return std::string("{st(1)}"); // second from top of floating point stack.
2601 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002602 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002603 }
2604}
Eli Friedman618234a2008-08-20 02:34:37 +00002605} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002606
2607namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002608// X86-32 generic target
2609class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002610public:
Eli Friedman618234a2008-08-20 02:34:37 +00002611 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2612 DoubleAlign = LongLongAlign = 32;
2613 LongDoubleWidth = 96;
2614 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002615 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002616 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2617 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002618 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002619 SizeType = UnsignedInt;
2620 PtrDiffType = SignedInt;
2621 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002622 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002623
2624 // Use fpret for all types.
2625 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2626 (1 << TargetInfo::Double) |
2627 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002628
2629 // x86-32 has atomics up to 8 bytes
2630 // FIXME: Check that we actually have cmpxchg8b before setting
2631 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2632 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002633 }
Meador Ingec5613b22012-06-16 03:34:49 +00002634 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2635 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman618234a2008-08-20 02:34:37 +00002636 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002637
Chris Lattner21fb98e2009-09-23 06:06:36 +00002638 int getEHDataRegisterNumber(unsigned RegNo) const {
2639 if (RegNo == 0) return 0;
2640 if (RegNo == 1) return 2;
2641 return -1;
2642 }
Bill Wendling68fd6082012-11-12 06:42:51 +00002643 virtual bool validateInputSize(StringRef Constraint,
2644 unsigned Size) const {
2645 switch (Constraint[0]) {
2646 default: break;
2647 case 'a':
2648 case 'b':
2649 case 'c':
2650 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00002651 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00002652 }
2653
2654 return true;
2655 }
Eli Friedman618234a2008-08-20 02:34:37 +00002656};
2657} // end anonymous namespace
2658
2659namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002660class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2661public:
2662 NetBSDI386TargetInfo(const std::string &triple) :
2663 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2664 }
2665
2666 virtual unsigned getFloatEvalMethod() const {
2667 // NetBSD defaults to "double" rounding
2668 return 1;
2669 }
2670};
2671} // end anonymous namespace
2672
2673namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002674class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2675public:
2676 OpenBSDI386TargetInfo(const std::string& triple) :
2677 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2678 SizeType = UnsignedLong;
2679 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002680 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002681 }
2682};
2683} // end anonymous namespace
2684
2685namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00002686class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2687public:
2688 BitrigI386TargetInfo(const std::string& triple) :
2689 BitrigTargetInfo<X86_32TargetInfo>(triple) {
2690 SizeType = UnsignedLong;
2691 IntPtrType = SignedLong;
2692 PtrDiffType = SignedLong;
2693 }
2694};
2695} // end anonymous namespace
2696
2697namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002698class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002699public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002700 DarwinI386TargetInfo(const std::string& triple) :
2701 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002702 LongDoubleWidth = 128;
2703 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002704 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00002705 MaxVectorAlign = 256;
Eli Friedman1afabd92009-03-29 20:31:09 +00002706 SizeType = UnsignedLong;
2707 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002708 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2709 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002710 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002711 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002712 }
2713
Eli Friedman618234a2008-08-20 02:34:37 +00002714};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002715} // end anonymous namespace
2716
2717namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002718// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002719class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002720public:
2721 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002722 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002723 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002724 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002725 DoubleAlign = LongLongAlign = 64;
2726 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovb3814412009-12-19 02:05:07 +00002727 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002728 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002729 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002730 virtual void getTargetDefines(const LangOptions &Opts,
2731 MacroBuilder &Builder) const {
2732 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2733 }
2734};
2735} // end anonymous namespace
2736
2737namespace {
2738
2739// x86-32 Windows Visual Studio target
2740class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2741public:
2742 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2743 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002744 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002745 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2746 }
2747 virtual void getTargetDefines(const LangOptions &Opts,
2748 MacroBuilder &Builder) const {
2749 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2750 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2751 // The value of the following reflects processor type.
2752 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2753 // We lost the original triple, so we use the default.
2754 Builder.defineMacro("_M_IX86", "600");
2755 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002756};
2757} // end anonymous namespace
2758
2759namespace {
2760// x86-32 MinGW target
2761class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2762public:
2763 MinGWX86_32TargetInfo(const std::string& triple)
2764 : WindowsX86_32TargetInfo(triple) {
2765 }
2766 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002767 MacroBuilder &Builder) const {
2768 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002769 DefineStd(Builder, "WIN32", Opts);
2770 DefineStd(Builder, "WINNT", Opts);
2771 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002772 Builder.defineMacro("__MSVCRT__");
2773 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002774
2775 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2776 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002777 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002778 // Provide "as-is" __declspec.
2779 Builder.defineMacro("__declspec", "__declspec");
2780 else
2781 // Provide alias of __attribute__ like mingw32-gcc.
2782 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002783 }
2784};
2785} // end anonymous namespace
2786
2787namespace {
2788// x86-32 Cygwin target
2789class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2790public:
2791 CygwinX86_32TargetInfo(const std::string& triple)
2792 : X86_32TargetInfo(triple) {
2793 TLSSupported = false;
2794 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002795 DoubleAlign = LongLongAlign = 64;
2796 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2797 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002798 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002799 }
2800 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002801 MacroBuilder &Builder) const {
2802 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00002803 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002804 Builder.defineMacro("__CYGWIN__");
2805 Builder.defineMacro("__CYGWIN32__");
2806 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002807 if (Opts.CPlusPlus)
2808 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002809 }
Eli Friedman29a30502008-08-21 01:40:19 +00002810};
2811} // end anonymous namespace
2812
2813namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002814// x86-32 Haiku target
2815class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2816public:
2817 HaikuX86_32TargetInfo(const std::string& triple)
2818 : X86_32TargetInfo(triple) {
2819 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002820 IntPtrType = SignedLong;
2821 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00002822 ProcessIDType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002823 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00002824 this->TLSSupported = false;
Eli Friedmana7e68452010-08-22 01:00:03 +00002825 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002826 virtual void getTargetDefines(const LangOptions &Opts,
2827 MacroBuilder &Builder) const {
2828 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2829 Builder.defineMacro("__INTEL__");
2830 Builder.defineMacro("__HAIKU__");
2831 }
2832};
2833} // end anonymous namespace
2834
Douglas Gregordca52262011-07-01 22:41:14 +00002835// RTEMS Target
2836template<typename Target>
2837class RTEMSTargetInfo : public OSTargetInfo<Target> {
2838protected:
2839 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2840 MacroBuilder &Builder) const {
2841 // RTEMS defines; list based off of gcc output
2842
Douglas Gregordca52262011-07-01 22:41:14 +00002843 Builder.defineMacro("__rtems__");
2844 Builder.defineMacro("__ELF__");
2845 }
2846public:
2847 RTEMSTargetInfo(const std::string &triple)
2848 : OSTargetInfo<Target>(triple) {
2849 this->UserLabelPrefix = "";
2850
2851 llvm::Triple Triple(triple);
2852 switch (Triple.getArch()) {
2853 default:
2854 case llvm::Triple::x86:
2855 // this->MCountName = ".mcount";
2856 break;
2857 case llvm::Triple::mips:
2858 case llvm::Triple::mipsel:
2859 case llvm::Triple::ppc:
2860 case llvm::Triple::ppc64:
2861 // this->MCountName = "_mcount";
2862 break;
2863 case llvm::Triple::arm:
2864 // this->MCountName = "__mcount";
2865 break;
2866 }
2867
2868 }
2869};
2870
2871namespace {
2872// x86-32 RTEMS target
2873class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2874public:
2875 RTEMSX86_32TargetInfo(const std::string& triple)
2876 : X86_32TargetInfo(triple) {
2877 SizeType = UnsignedLong;
2878 IntPtrType = SignedLong;
2879 PtrDiffType = SignedLong;
2880 this->UserLabelPrefix = "";
2881 }
2882 virtual void getTargetDefines(const LangOptions &Opts,
2883 MacroBuilder &Builder) const {
2884 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2885 Builder.defineMacro("__INTEL__");
2886 Builder.defineMacro("__rtems__");
2887 }
2888};
2889} // end anonymous namespace
2890
Chris Lattner86ed3a32010-04-11 19:29:39 +00002891namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002892// x86-64 generic target
2893class X86_64TargetInfo : public X86TargetInfo {
2894public:
Chris Lattner33328642009-03-20 15:52:06 +00002895 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002896 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002897 LongDoubleWidth = 128;
2898 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002899 LargeArrayMinWidth = 128;
2900 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002901 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002902 IntMaxType = SignedLong;
2903 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002904 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002905 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002906
Eli Friedmaned855cb2008-08-21 00:13:15 +00002907 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2908 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002909 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002910
2911 // Use fpret only for long double.
2912 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002913
Anders Carlssoneea64802011-10-31 16:27:11 +00002914 // Use fp2ret for _Complex long double.
2915 ComplexLongDoubleUsesFP2Ret = true;
2916
Eli Friedman2be46072011-10-14 20:59:01 +00002917 // x86-64 has atomics up to 16 bytes.
2918 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2919 // on CPUs with cmpxchg16b
2920 MaxAtomicPromoteWidth = 128;
2921 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002922 }
Meador Ingec5613b22012-06-16 03:34:49 +00002923 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2924 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson3346ae62007-11-24 23:38:12 +00002925 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002926
Chris Lattner21fb98e2009-09-23 06:06:36 +00002927 int getEHDataRegisterNumber(unsigned RegNo) const {
2928 if (RegNo == 0) return 0;
2929 if (RegNo == 1) return 1;
2930 return -1;
2931 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00002932
2933 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Guy Benyei7266cf62013-01-10 10:41:05 +00002934 return (CC == CC_Default ||
2935 CC == CC_C ||
2936 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002937 }
2938
Aaron Ballmanfff32482012-12-09 17:45:41 +00002939 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
2940 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00002941 }
2942
Eli Friedman618234a2008-08-20 02:34:37 +00002943};
2944} // end anonymous namespace
2945
2946namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002947// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002948class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002949public:
2950 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002951 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002952 TLSSupported = false;
2953 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002954 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002955 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002956 IntMaxType = SignedLongLong;
2957 UIntMaxType = UnsignedLongLong;
2958 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002959 SizeType = UnsignedLongLong;
2960 PtrDiffType = SignedLongLong;
2961 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002962 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002963 }
2964 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002965 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002966 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002967 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002968 }
Meador Ingec5613b22012-06-16 03:34:49 +00002969 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2970 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002971 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002972};
2973} // end anonymous namespace
2974
2975namespace {
2976// x86-64 Windows Visual Studio target
2977class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2978public:
2979 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2980 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002981 LongDoubleWidth = LongDoubleAlign = 64;
2982 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002983 }
2984 virtual void getTargetDefines(const LangOptions &Opts,
2985 MacroBuilder &Builder) const {
2986 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2987 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002988 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002989 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002990 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002991};
2992} // end anonymous namespace
2993
2994namespace {
2995// x86-64 MinGW target
2996class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2997public:
2998 MinGWX86_64TargetInfo(const std::string& triple)
2999 : WindowsX86_64TargetInfo(triple) {
3000 }
3001 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003002 MacroBuilder &Builder) const {
3003 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003004 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00003005 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00003006 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00003007 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003008
3009 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3010 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003011 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003012 // Provide "as-is" __declspec.
3013 Builder.defineMacro("__declspec", "__declspec");
3014 else
3015 // Provide alias of __attribute__ like mingw32-gcc.
3016 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003017 }
3018};
3019} // end anonymous namespace
3020
3021namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003022class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3023public:
Mike Stump1eb44332009-09-09 15:08:12 +00003024 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003025 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
3026 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003027 MaxVectorAlign = 256;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003028 }
3029};
3030} // end anonymous namespace
3031
3032namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003033class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3034public:
Mike Stump1eb44332009-09-09 15:08:12 +00003035 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00003036 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
3037 IntMaxType = SignedLongLong;
3038 UIntMaxType = UnsignedLongLong;
3039 Int64Type = SignedLongLong;
3040 }
3041};
3042} // end anonymous namespace
3043
3044namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003045class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3046public:
3047 BitrigX86_64TargetInfo(const std::string& triple)
3048 : BitrigTargetInfo<X86_64TargetInfo>(triple) {
3049 IntMaxType = SignedLongLong;
3050 UIntMaxType = UnsignedLongLong;
3051 Int64Type = SignedLongLong;
3052 }
3053};
Tim Northoverc264e162013-01-31 12:13:10 +00003054}
3055
3056namespace {
3057class AArch64TargetInfo : public TargetInfo {
3058 static const char * const GCCRegNames[];
3059 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3060public:
3061 AArch64TargetInfo(const std::string& triple) : TargetInfo(triple) {
3062 BigEndian = false;
3063 LongWidth = LongAlign = 64;
3064 LongDoubleWidth = LongDoubleAlign = 128;
3065 PointerWidth = PointerAlign = 64;
3066 SuitableAlign = 128;
3067 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3068 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3069 "f128:128:128-n32:64-S128";
3070
3071 WCharType = UnsignedInt;
3072 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3073
3074 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3075 }
3076 virtual void getTargetDefines(const LangOptions &Opts,
3077 MacroBuilder &Builder) const {
3078 // GCC defines theses currently
3079 Builder.defineMacro("__aarch64__");
3080 Builder.defineMacro("__AARCH64EL__");
3081
3082 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3083
3084 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3085 // which was intended to be compatible with a 64-bit implementation. They
3086 // will need updating when a real 64-bit ACLE exists. Particularly pressing
3087 // instances are: __AARCH_ISA_A32, __AARCH_ISA_T32, __ARCH_PCS.
3088 Builder.defineMacro("__AARCH_ACLE", "101");
3089 Builder.defineMacro("__AARCH", "8");
3090 Builder.defineMacro("__AARCH_PROFILE", "'A'");
3091
3092 Builder.defineMacro("__AARCH_FEATURE_UNALIGNED");
3093 Builder.defineMacro("__AARCH_FEATURE_CLZ");
3094 Builder.defineMacro("__AARCH_FEATURE_FMA");
3095
3096 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3097 // 128-bit LDXP present, at which point this becomes 0x1f.
3098 Builder.defineMacro("__AARCH_FEATURE_LDREX", "0xf");
3099
3100 // 0xe implies support for half, single and double precision operations.
3101 Builder.defineMacro("__AARCH_FP", "0xe");
3102
3103 // PCS specifies this for SysV variants, which is all we support. Other ABIs
3104 // may choose __AARCH_FP16_FORMAT_ALTERNATIVE.
3105 Builder.defineMacro("__AARCH_FP16_FORMAT_IEEE");
3106
3107 if (Opts.FastMath || Opts.FiniteMathOnly)
3108 Builder.defineMacro("__AARCH_FP_FAST");
3109
3110 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
3111 Builder.defineMacro("__AARCH_FP_FENV_ROUNDING");
3112
3113 Builder.defineMacro("__AARCH_SIZEOF_WCHAR_T",
3114 Opts.ShortWChar ? "2" : "4");
3115
3116 Builder.defineMacro("__AARCH_SIZEOF_MINIMAL_ENUM",
3117 Opts.ShortEnums ? "1" : "4");
3118
3119 if (BigEndian)
3120 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3121 }
3122 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3123 unsigned &NumRecords) const {
3124 Records = 0;
3125 NumRecords = 0;
3126 }
3127 virtual bool hasFeature(StringRef Feature) const {
3128 return Feature == "aarch64";
3129 }
3130 virtual void getGCCRegNames(const char * const *&Names,
3131 unsigned &NumNames) const;
3132 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3133 unsigned &NumAliases) const;
3134
3135 virtual bool isCLZForZeroUndef() const { return false; }
3136
3137 virtual bool validateAsmConstraint(const char *&Name,
3138 TargetInfo::ConstraintInfo &Info) const {
3139 switch (*Name) {
3140 default: return false;
3141 case 'w': // An FP/SIMD vector register
3142 Info.setAllowsRegister();
3143 return true;
3144 case 'I': // Constant that can be used with an ADD instruction
3145 case 'J': // Constant that can be used with a SUB instruction
3146 case 'K': // Constant that can be used with a 32-bit logical instruction
3147 case 'L': // Constant that can be used with a 64-bit logical instruction
3148 case 'M': // Constant that can be used as a 32-bit MOV immediate
3149 case 'N': // Constant that can be used as a 64-bit MOV immediate
3150 case 'Y': // Floating point constant zero
3151 case 'Z': // Integer constant zero
3152 return true;
3153 case 'Q': // A memory reference with base register and no offset
3154 Info.setAllowsMemory();
3155 return true;
3156 case 'S': // A symbolic address
3157 Info.setAllowsRegister();
3158 return true;
3159 case 'U':
3160 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3161 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3162 // Usa: An absolute symbolic address
3163 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3164 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3165 }
3166 }
3167
3168 virtual const char *getClobbers() const {
3169 // There are no AArch64 clobbers shared by all asm statements.
3170 return "";
3171 }
3172
3173 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3174 return TargetInfo::AArch64ABIBuiltinVaList;
3175 }
3176};
3177
3178const char * const AArch64TargetInfo::GCCRegNames[] = {
3179 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3180 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3181 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3182 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3183
3184 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3185 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3186 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3187 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3188
3189 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3190 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3191 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3192 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3193
3194 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3195 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3196 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3197 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3198
3199 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3200 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3201 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3202 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3203
3204 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3205 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3206 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3207 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3208
3209 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3210 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3211 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3212 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3213};
3214
3215void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3216 unsigned &NumNames) const {
3217 Names = GCCRegNames;
3218 NumNames = llvm::array_lengthof(GCCRegNames);
3219}
3220
3221const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3222 { { "x16" }, "ip0"},
3223 { { "x17" }, "ip1"},
3224 { { "x29" }, "fp" },
3225 { { "x30" }, "lr" }
3226};
3227
3228void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3229 unsigned &NumAliases) const {
3230 Aliases = GCCRegAliases;
3231 NumAliases = llvm::array_lengthof(GCCRegAliases);
3232
3233}
Eli Friedman42f74f22012-08-08 23:57:20 +00003234} // end anonymous namespace
3235
3236namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00003237class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003238 // Possible FPU choices.
3239 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003240 VFP2FPU = (1 << 0),
3241 VFP3FPU = (1 << 1),
3242 VFP4FPU = (1 << 2),
3243 NeonFPU = (1 << 3)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003244 };
3245
3246 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003247 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003248 }
3249
3250 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3251 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003252
Daniel Dunbareac7c532009-12-18 18:42:37 +00003253 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003254
Bob Wilsoncfaab002012-09-29 23:52:52 +00003255 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003256
Logan Chieneae5a8202012-10-10 06:56:20 +00003257 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003258 unsigned IsThumb : 1;
3259
3260 // Initialized via features.
3261 unsigned SoftFloat : 1;
3262 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003263
Chris Lattner2752c012010-03-03 19:03:45 +00003264 static const Builtin::Info BuiltinInfo[];
3265
Chris Lattner393ff042008-04-21 18:56:49 +00003266public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003267 ARMTargetInfo(const std::string &TripleStr)
Logan Chieneae5a8202012-10-10 06:56:20 +00003268 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true)
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003269 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003270 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003271 SizeType = UnsignedInt;
3272 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003273 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3274 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003275
Chris Lattner9bffb072010-04-23 16:29:58 +00003276 // {} in inline assembly are neon specifiers, not assembly variant
3277 // specifiers.
3278 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003279
Daniel Dunbareac7c532009-12-18 18:42:37 +00003280 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003281 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003282 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003283 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3284 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003285 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3286 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003287 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003288 } else {
3289 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3290 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003291 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003292 }
John McCallee79a4c2010-08-21 22:46:04 +00003293
3294 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003295 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003296
3297 // ARM has atomics up to 8 bytes
3298 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
3299 MaxAtomicPromoteWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003300
3301 // Do force alignment of members that follow zero length bitfields. If
3302 // the alignment of the zero-length bitfield is greater than the member
3303 // that follows it, `bar', `bar' will be aligned as the type of the
3304 // zero length bitfield.
3305 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003306 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003307 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003308 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003309 ABI = Name;
3310
Daniel Dunbara2a41612009-09-14 00:02:24 +00003311 // The defaults (above) are for AAPCS, check if we need to change them.
3312 //
3313 // FIXME: We need support for -meabi... we could just mangle it into the
3314 // name.
3315 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003316 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003317 // size_t is unsigned int on FreeBSD.
3318 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3319 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003320
James Molloya6d81f92011-11-23 13:35:08 +00003321 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3322 WCharType = SignedInt;
3323
Daniel Dunbar684de632010-04-22 16:14:54 +00003324 // Do not respect the alignment of bit-field types when laying out
3325 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3326 UseBitFieldTypeAlignment = false;
3327
Chad Rosier61a62212011-08-04 01:21:14 +00003328 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003329 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3330 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003331 ZeroLengthBitfieldBoundary = 32;
3332
Logan Chieneae5a8202012-10-10 06:56:20 +00003333 IsAAPCS = false;
3334
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003335 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003336 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3337 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003338 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson949fd1a2011-06-29 16:09:20 +00003339 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003340 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003341 } else {
3342 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00003343 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003344 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003345 }
3346
Chad Rosier9f1210c2011-07-26 07:03:04 +00003347 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003348 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003349 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003350 // FIXME: Enumerated types are variable width in straight AAPCS.
3351 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003352 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003353 } else
3354 return false;
3355
3356 return true;
3357 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003358
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003359 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003360 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3361 Features["vfp2"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003362 else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3363 CPU == "cortex-a9" || CPU == "cortex-a9-mp")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003364 Features["neon"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003365 else if (CPU == "swift") {
3366 Features["vfp4"] = true;
3367 Features["neon"] = true;
3368 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003369 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003370
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003371 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00003372 StringRef Name,
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003373 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00003374 if (Name == "soft-float" || Name == "soft-float-abi" ||
Bob Wilsoncfaab002012-09-29 23:52:52 +00003375 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" ||
3376 Name == "d16" || Name == "neonfp") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003377 Features[Name] = Enabled;
3378 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003379 return false;
3380
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003381 return true;
3382 }
3383
3384 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003385 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003386 SoftFloat = SoftFloatABI = false;
3387 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3388 if (Features[i] == "+soft-float")
3389 SoftFloat = true;
3390 else if (Features[i] == "+soft-float-abi")
3391 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003392 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003393 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003394 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003395 FPU |= VFP3FPU;
3396 else if (Features[i] == "+vfp4")
3397 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003398 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003399 FPU |= NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003400 }
3401
3402 // Remove front-end specific options which the backend handles differently.
3403 std::vector<std::string>::iterator it;
3404 it = std::find(Features.begin(), Features.end(), "+soft-float");
3405 if (it != Features.end())
3406 Features.erase(it);
3407 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3408 if (it != Features.end())
3409 Features.erase(it);
3410 }
3411
Douglas Gregore727d212012-01-30 06:38:25 +00003412 virtual bool hasFeature(StringRef Feature) const {
3413 return llvm::StringSwitch<bool>(Feature)
3414 .Case("arm", true)
3415 .Case("softfloat", SoftFloat)
3416 .Case("thumb", IsThumb)
3417 .Case("neon", FPU == NeonFPU && !SoftFloat &&
3418 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3419 .Default(false);
3420 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003421 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003422 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003423 return llvm::StringSwitch<const char*>(Name)
3424 .Cases("arm8", "arm810", "4")
3425 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3426 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3427 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3428 .Case("ep9312", "4T")
3429 .Cases("arm10tdmi", "arm1020t", "5T")
3430 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3431 .Case("arm926ej-s", "5TEJ")
3432 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3433 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003434 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003435 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003436 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003437 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Quentin Colombet74632aa2012-11-29 23:15:27 +00003438 .Cases("cortex-a5", "cortex-a8", "cortex-a9", "cortex-a15", "7A")
Quentin Colombetab137512012-12-21 17:57:47 +00003439 .Case("cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003440 .Case("cortex-a9-mp", "7F")
3441 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003442 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003443 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003444 .Default(0);
3445 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003446 static const char *getCPUProfile(StringRef Name) {
3447 return llvm::StringSwitch<const char*>(Name)
3448 .Cases("cortex-a8", "cortex-a9", "A")
3449 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Quentin Colombetab137512012-12-21 17:57:47 +00003450 .Case("cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003451 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003452 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003453 virtual bool setCPU(const std::string &Name) {
3454 if (!getCPUDefineSuffix(Name))
3455 return false;
3456
3457 CPU = Name;
3458 return true;
3459 }
Chris Lattner33328642009-03-20 15:52:06 +00003460 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003461 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003462 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003463 Builder.defineMacro("__arm");
3464 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003465
Chris Lattnerc0f59212009-03-02 22:27:17 +00003466 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003467 Builder.defineMacro("__ARMEL__");
3468 Builder.defineMacro("__LITTLE_ENDIAN__");
3469 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003470
Chris Lattner5f9e2722011-07-23 10:55:15 +00003471 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003472 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003473 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3474 StringRef CPUProfile = getCPUProfile(CPU);
3475 if (!CPUProfile.empty())
3476 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3477
Mike Stump437bb4b2009-04-08 02:07:04 +00003478 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003479
Daniel Dunbareac7c532009-12-18 18:42:37 +00003480 // FIXME: It's more complicated than this and we don't really support
3481 // interworking.
3482 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003483 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003484
David Tweedb16abb12012-10-25 13:33:01 +00003485 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003486 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003487 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003488 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003489 Builder.defineMacro("__ARM_PCS", "1");
3490
David Tweedb16abb12012-10-25 13:33:01 +00003491 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003492 Builder.defineMacro("__ARM_PCS_VFP", "1");
3493 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003494
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003495 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003496 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003497
3498 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003499 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003500
Bob Wilson84f95cf2011-05-13 18:56:03 +00003501 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003502 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003503 Builder.defineMacro("__THUMBEL__");
3504 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003505 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003506 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003507 }
3508
3509 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003510 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003511
Bob Wilsoncfaab002012-09-29 23:52:52 +00003512 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003513 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003514 if (FPU & VFP2FPU)
3515 Builder.defineMacro("__ARM_VFPV2__");
3516 if (FPU & VFP3FPU)
3517 Builder.defineMacro("__ARM_VFPV3__");
3518 if (FPU & VFP4FPU)
3519 Builder.defineMacro("__ARM_VFPV4__");
3520 }
3521
Daniel Dunbara91320b2009-12-21 23:28:17 +00003522 // This only gets set when Neon instructions are actually available, unlike
3523 // the VFP define, hence the soft float and arch check. This is subtly
3524 // different from gcc, we follow the intent which was that it should be set
3525 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003526 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003527 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00003528 }
3529 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3530 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003531 Records = BuiltinInfo;
3532 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003533 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003534 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003535 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003536 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003537 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003538 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003539 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003540 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003541 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003542 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003543 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003544 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003545 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003546 case 'l': // r0-r7
3547 case 'h': // r8-r15
3548 case 'w': // VFP Floating point register single precision
3549 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003550 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003551 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003552 case 'Q': // A memory address that is a single base register.
3553 Info.setAllowsMemory();
3554 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003555 case 'U': // a memory reference...
3556 switch (Name[1]) {
3557 case 'q': // ...ARMV4 ldrsb
3558 case 'v': // ...VFP load/store (reg+constant offset)
3559 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003560 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003561 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003562 case 'n': // valid address for Neon doubleword vector load/store
3563 case 'm': // valid address for Neon element and structure load/store
3564 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003565 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003566 Info.setAllowsMemory();
3567 Name++;
3568 return true;
3569 }
Nate Begemanad487f42008-04-22 05:03:19 +00003570 }
Chris Lattner393ff042008-04-21 18:56:49 +00003571 return false;
3572 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003573 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003574 std::string R;
3575 switch (*Constraint) {
3576 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003577 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003578 Constraint++;
3579 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003580 case 'p': // 'p' should be translated to 'r' by default.
3581 R = std::string("r");
3582 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003583 default:
3584 return std::string(1, *Constraint);
3585 }
3586 return R;
3587 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00003588 virtual bool validateConstraintModifier(StringRef Constraint,
3589 const char Modifier,
3590 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003591 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00003592 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003593
Bill Wendling50d46ca2012-10-25 23:28:48 +00003594 // Strip off constraint modifiers.
3595 while (Constraint[0] == '=' ||
3596 Constraint[0] == '+' ||
3597 Constraint[0] == '&')
3598 Constraint = Constraint.substr(1);
3599
3600 switch (Constraint[0]) {
3601 default: break;
3602 case 'r': {
3603 switch (Modifier) {
3604 default:
Bill Wendling6e6330c2012-11-30 23:46:56 +00003605 return isInOut || (isOutput && Size >= 32) ||
3606 (!isOutput && !isInOut && Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00003607 case 'q':
3608 // A register of size 32 cannot fit a vector type.
3609 return false;
3610 }
3611 }
3612 }
3613
3614 return true;
3615 }
Chris Lattner393ff042008-04-21 18:56:49 +00003616 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00003617 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00003618 return "";
3619 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003620
3621 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3622 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3623 }
Chris Lattner393ff042008-04-21 18:56:49 +00003624};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003625
3626const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003627 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003628 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003629 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3630
3631 // Float registers
3632 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3633 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3634 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003635 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003636
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003637 // Double registers
3638 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3639 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00003640 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3641 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003642
3643 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00003644 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3645 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003646};
3647
3648void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003649 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003650 Names = GCCRegNames;
3651 NumNames = llvm::array_lengthof(GCCRegNames);
3652}
3653
3654const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003655 { { "a1" }, "r0" },
3656 { { "a2" }, "r1" },
3657 { { "a3" }, "r2" },
3658 { { "a4" }, "r3" },
3659 { { "v1" }, "r4" },
3660 { { "v2" }, "r5" },
3661 { { "v3" }, "r6" },
3662 { { "v4" }, "r7" },
3663 { { "v5" }, "r8" },
3664 { { "v6", "rfp" }, "r9" },
3665 { { "sl" }, "r10" },
3666 { { "fp" }, "r11" },
3667 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003668 { { "r13" }, "sp" },
3669 { { "r14" }, "lr" },
3670 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003671 // The S, D and Q registers overlap, but aren't really aliases; we
3672 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003673};
3674
3675void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3676 unsigned &NumAliases) const {
3677 Aliases = GCCRegAliases;
3678 NumAliases = llvm::array_lengthof(GCCRegAliases);
3679}
Chris Lattner2752c012010-03-03 19:03:45 +00003680
3681const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00003682#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00003683#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00003684 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00003685#include "clang/Basic/BuiltinsARM.def"
3686};
Chris Lattner393ff042008-04-21 18:56:49 +00003687} // end anonymous namespace.
3688
Eli Friedmana9f54962008-08-20 07:44:10 +00003689namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00003690class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003691 public DarwinTargetInfo<ARMTargetInfo> {
3692protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00003693 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00003694 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00003695 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00003696 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003697
Torok Edwin5f6c1942009-06-30 17:10:35 +00003698public:
Mike Stump1eb44332009-09-09 15:08:12 +00003699 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003700 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3701 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00003702 // iOS always has 64-bit atomic instructions.
3703 // FIXME: This should be based off of the target features in ARMTargetInfo.
3704 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00003705
3706 // Darwin on iOS uses a variant of the ARM C++ ABI.
3707 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003708 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003709};
3710} // end anonymous namespace.
3711
Tony Linthicum96319392011-12-12 21:14:55 +00003712
3713namespace {
3714// Hexagon abstract base class
3715class HexagonTargetInfo : public TargetInfo {
3716 static const Builtin::Info BuiltinInfo[];
3717 static const char * const GCCRegNames[];
3718 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3719 std::string CPU;
3720public:
3721 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003722 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00003723 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00003724 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00003725 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00003726
3727 // {} in inline assembly are packet specifiers, not assembly variant
3728 // specifiers.
3729 NoAsmVariants = true;
3730 }
3731
3732 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3733 unsigned &NumRecords) const {
3734 Records = BuiltinInfo;
3735 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3736 }
3737
3738 virtual bool validateAsmConstraint(const char *&Name,
3739 TargetInfo::ConstraintInfo &Info) const {
3740 return true;
3741 }
3742
3743 virtual void getTargetDefines(const LangOptions &Opts,
3744 MacroBuilder &Builder) const;
3745
Douglas Gregore727d212012-01-30 06:38:25 +00003746 virtual bool hasFeature(StringRef Feature) const {
3747 return Feature == "hexagon";
3748 }
3749
Meador Ingec5613b22012-06-16 03:34:49 +00003750 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3751 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00003752 }
3753 virtual void getGCCRegNames(const char * const *&Names,
3754 unsigned &NumNames) const;
3755 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3756 unsigned &NumAliases) const;
3757 virtual const char *getClobbers() const {
3758 return "";
3759 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003760
3761 static const char *getHexagonCPUSuffix(StringRef Name) {
3762 return llvm::StringSwitch<const char*>(Name)
3763 .Case("hexagonv2", "2")
3764 .Case("hexagonv3", "3")
3765 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00003766 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00003767 .Default(0);
3768 }
3769
Tony Linthicum96319392011-12-12 21:14:55 +00003770 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00003771 if (!getHexagonCPUSuffix(Name))
3772 return false;
3773
Tony Linthicum96319392011-12-12 21:14:55 +00003774 CPU = Name;
3775 return true;
3776 }
3777};
3778
3779void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3780 MacroBuilder &Builder) const {
3781 Builder.defineMacro("qdsp6");
3782 Builder.defineMacro("__qdsp6", "1");
3783 Builder.defineMacro("__qdsp6__", "1");
3784
3785 Builder.defineMacro("hexagon");
3786 Builder.defineMacro("__hexagon", "1");
3787 Builder.defineMacro("__hexagon__", "1");
3788
3789 if(CPU == "hexagonv1") {
3790 Builder.defineMacro("__HEXAGON_V1__");
3791 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3792 if(Opts.HexagonQdsp6Compat) {
3793 Builder.defineMacro("__QDSP6_V1__");
3794 Builder.defineMacro("__QDSP6_ARCH__", "1");
3795 }
3796 }
3797 else if(CPU == "hexagonv2") {
3798 Builder.defineMacro("__HEXAGON_V2__");
3799 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3800 if(Opts.HexagonQdsp6Compat) {
3801 Builder.defineMacro("__QDSP6_V2__");
3802 Builder.defineMacro("__QDSP6_ARCH__", "2");
3803 }
3804 }
3805 else if(CPU == "hexagonv3") {
3806 Builder.defineMacro("__HEXAGON_V3__");
3807 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3808 if(Opts.HexagonQdsp6Compat) {
3809 Builder.defineMacro("__QDSP6_V3__");
3810 Builder.defineMacro("__QDSP6_ARCH__", "3");
3811 }
3812 }
3813 else if(CPU == "hexagonv4") {
3814 Builder.defineMacro("__HEXAGON_V4__");
3815 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3816 if(Opts.HexagonQdsp6Compat) {
3817 Builder.defineMacro("__QDSP6_V4__");
3818 Builder.defineMacro("__QDSP6_ARCH__", "4");
3819 }
3820 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00003821 else if(CPU == "hexagonv5") {
3822 Builder.defineMacro("__HEXAGON_V5__");
3823 Builder.defineMacro("__HEXAGON_ARCH__", "5");
3824 if(Opts.HexagonQdsp6Compat) {
3825 Builder.defineMacro("__QDSP6_V5__");
3826 Builder.defineMacro("__QDSP6_ARCH__", "5");
3827 }
3828 }
Tony Linthicum96319392011-12-12 21:14:55 +00003829}
3830
3831const char * const HexagonTargetInfo::GCCRegNames[] = {
3832 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3833 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3834 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3835 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3836 "p0", "p1", "p2", "p3",
3837 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3838};
3839
3840void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3841 unsigned &NumNames) const {
3842 Names = GCCRegNames;
3843 NumNames = llvm::array_lengthof(GCCRegNames);
3844}
3845
3846
3847const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3848 { { "sp" }, "r29" },
3849 { { "fp" }, "r30" },
3850 { { "lr" }, "r31" },
3851 };
3852
3853void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3854 unsigned &NumAliases) const {
3855 Aliases = GCCRegAliases;
3856 NumAliases = llvm::array_lengthof(GCCRegAliases);
3857}
3858
3859
3860const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3861#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3862#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3863 ALL_LANGUAGES },
3864#include "clang/Basic/BuiltinsHexagon.def"
3865};
3866}
3867
3868
Reid Spencer5f016e22007-07-11 17:01:13 +00003869namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00003870class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00003871 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3872 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003873 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00003874public:
Eli Friedman01b86682008-08-20 07:28:14 +00003875 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3876 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00003877 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00003878 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00003879 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003880 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00003881 StringRef Name,
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003882 bool Enabled) const {
3883 if (Name == "soft-float")
3884 Features[Name] = Enabled;
3885 else
3886 return false;
3887
3888 return true;
3889 }
3890 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3891 SoftFloat = false;
3892 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3893 if (Features[i] == "+soft-float")
3894 SoftFloat = true;
3895 }
Chris Lattner33328642009-03-20 15:52:06 +00003896 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003897 MacroBuilder &Builder) const {
3898 DefineStd(Builder, "sparc", Opts);
3899 Builder.defineMacro("__sparcv8");
3900 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003901
3902 if (SoftFloat)
3903 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003904 }
Douglas Gregore727d212012-01-30 06:38:25 +00003905
3906 virtual bool hasFeature(StringRef Feature) const {
3907 return llvm::StringSwitch<bool>(Feature)
3908 .Case("softfloat", SoftFloat)
3909 .Case("sparc", true)
3910 .Default(false);
3911 }
3912
Gabor Greif26658672008-02-21 16:29:08 +00003913 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3914 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003915 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003916 }
Meador Ingec5613b22012-06-16 03:34:49 +00003917 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3918 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00003919 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003920 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003921 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003922 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003923 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003924 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003925 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003926 // FIXME: Implement!
3927 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003928 }
3929 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003930 // FIXME: Implement!
3931 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003932 }
3933};
3934
Chris Lattnere957f532009-01-27 01:58:38 +00003935const char * const SparcV8TargetInfo::GCCRegNames[] = {
3936 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3937 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3938 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3939 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3940};
3941
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003942void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003943 unsigned &NumNames) const {
3944 Names = GCCRegNames;
3945 NumNames = llvm::array_lengthof(GCCRegNames);
3946}
3947
3948const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003949 { { "g0" }, "r0" },
3950 { { "g1" }, "r1" },
3951 { { "g2" }, "r2" },
3952 { { "g3" }, "r3" },
3953 { { "g4" }, "r4" },
3954 { { "g5" }, "r5" },
3955 { { "g6" }, "r6" },
3956 { { "g7" }, "r7" },
3957 { { "o0" }, "r8" },
3958 { { "o1" }, "r9" },
3959 { { "o2" }, "r10" },
3960 { { "o3" }, "r11" },
3961 { { "o4" }, "r12" },
3962 { { "o5" }, "r13" },
3963 { { "o6", "sp" }, "r14" },
3964 { { "o7" }, "r15" },
3965 { { "l0" }, "r16" },
3966 { { "l1" }, "r17" },
3967 { { "l2" }, "r18" },
3968 { { "l3" }, "r19" },
3969 { { "l4" }, "r20" },
3970 { { "l5" }, "r21" },
3971 { { "l6" }, "r22" },
3972 { { "l7" }, "r23" },
3973 { { "i0" }, "r24" },
3974 { { "i1" }, "r25" },
3975 { { "i2" }, "r26" },
3976 { { "i3" }, "r27" },
3977 { { "i4" }, "r28" },
3978 { { "i5" }, "r29" },
3979 { { "i6", "fp" }, "r30" },
3980 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003981};
3982
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003983void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003984 unsigned &NumAliases) const {
3985 Aliases = GCCRegAliases;
3986 NumAliases = llvm::array_lengthof(GCCRegAliases);
3987}
Gabor Greif26658672008-02-21 16:29:08 +00003988} // end anonymous namespace.
3989
Eli Friedman01b86682008-08-20 07:28:14 +00003990namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003991class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3992public:
3993 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3994 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3995 SizeType = UnsignedInt;
3996 PtrDiffType = SignedInt;
3997 }
3998};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003999class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004000public:
4001 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00004002 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004003 SizeType = UnsignedInt;
4004 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004005 }
4006};
4007} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004008
Chris Lattner2621fd12008-05-08 05:58:21 +00004009namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004010 class MSP430TargetInfo : public TargetInfo {
4011 static const char * const GCCRegNames[];
4012 public:
4013 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004014 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004015 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004016 IntWidth = 16; IntAlign = 16;
4017 LongWidth = 32; LongLongWidth = 64;
4018 LongAlign = LongLongAlign = 16;
4019 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004020 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004021 SizeType = UnsignedInt;
4022 IntMaxType = SignedLong;
4023 UIntMaxType = UnsignedLong;
4024 IntPtrType = SignedShort;
4025 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004026 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004027 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004028 }
4029 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004030 MacroBuilder &Builder) const {
4031 Builder.defineMacro("MSP430");
4032 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004033 // FIXME: defines for different 'flavours' of MCU
4034 }
4035 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4036 unsigned &NumRecords) const {
4037 // FIXME: Implement.
4038 Records = 0;
4039 NumRecords = 0;
4040 }
Douglas Gregore727d212012-01-30 06:38:25 +00004041 virtual bool hasFeature(StringRef Feature) const {
4042 return Feature == "msp430";
4043 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004044 virtual void getGCCRegNames(const char * const *&Names,
4045 unsigned &NumNames) const;
4046 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4047 unsigned &NumAliases) const {
4048 // No aliases.
4049 Aliases = 0;
4050 NumAliases = 0;
4051 }
4052 virtual bool validateAsmConstraint(const char *&Name,
4053 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004054 // No target constraints for now.
4055 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004056 }
4057 virtual const char *getClobbers() const {
4058 // FIXME: Is this really right?
4059 return "";
4060 }
Meador Ingec5613b22012-06-16 03:34:49 +00004061 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004062 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004063 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004064 }
4065 };
4066
4067 const char * const MSP430TargetInfo::GCCRegNames[] = {
4068 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4069 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4070 };
4071
4072 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4073 unsigned &NumNames) const {
4074 Names = GCCRegNames;
4075 NumNames = llvm::array_lengthof(GCCRegNames);
4076 }
4077}
4078
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004079namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004080
Mike Stump1eb44332009-09-09 15:08:12 +00004081 // LLVM and Clang cannot be used directly to output native binaries for
4082 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004083 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004084 //
4085 // TCE uses the llvm bitcode as input and uses it for generating customized
4086 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004087 // publicly available in http://tce.cs.tut.fi
4088
Eli Friedman209f5bb2011-10-07 19:51:42 +00004089 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4090 3, // opencl_global
4091 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004092 5, // opencl_constant
4093 0, // cuda_device
4094 0, // cuda_constant
4095 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004096 };
4097
Eli Friedmanb63decf2009-08-19 20:47:07 +00004098 class TCETargetInfo : public TargetInfo{
4099 public:
4100 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
4101 TLSSupported = false;
4102 IntWidth = 32;
4103 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004104 PointerWidth = 32;
4105 IntAlign = 32;
4106 LongAlign = LongLongAlign = 32;
4107 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004108 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004109 SizeType = UnsignedInt;
4110 IntMaxType = SignedLong;
4111 UIntMaxType = UnsignedLong;
4112 IntPtrType = SignedInt;
4113 PtrDiffType = SignedInt;
4114 FloatWidth = 32;
4115 FloatAlign = 32;
4116 DoubleWidth = 32;
4117 DoubleAlign = 32;
4118 LongDoubleWidth = 32;
4119 LongDoubleAlign = 32;
4120 FloatFormat = &llvm::APFloat::IEEEsingle;
4121 DoubleFormat = &llvm::APFloat::IEEEsingle;
4122 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004123 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4124 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004125 "f32:32:32-f64:32:32-v64:32:32-"
4126 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004127 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004128 }
4129
4130 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004131 MacroBuilder &Builder) const {
4132 DefineStd(Builder, "tce", Opts);
4133 Builder.defineMacro("__TCE__");
4134 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004135 }
Douglas Gregore727d212012-01-30 06:38:25 +00004136 virtual bool hasFeature(StringRef Feature) const {
4137 return Feature == "tce";
4138 }
4139
Eli Friedmanb63decf2009-08-19 20:47:07 +00004140 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4141 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004142 virtual const char *getClobbers() const {
4143 return "";
4144 }
Meador Ingec5613b22012-06-16 03:34:49 +00004145 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4146 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004147 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004148 virtual void getGCCRegNames(const char * const *&Names,
4149 unsigned &NumNames) const {}
4150 virtual bool validateAsmConstraint(const char *&Name,
4151 TargetInfo::ConstraintInfo &info) const {
4152 return true;
4153 }
4154 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4155 unsigned &NumAliases) const {}
4156 };
4157}
4158
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004159namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004160class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004161 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004162 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004163 bool IsMips16;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004164 enum MipsFloatABI {
4165 HardFloat, SingleFloat, SoftFloat
4166 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004167 enum DspRevEnum {
4168 NoDSP, DSP1, DSP2
4169 } DspRev;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004170
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004171protected:
4172 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004173
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004174public:
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004175 MipsTargetInfoBase(const std::string& triple,
4176 const std::string& ABIStr,
4177 const std::string& CPUStr)
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004178 : TargetInfo(triple),
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004179 CPU(CPUStr),
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004180 IsMips16(false),
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004181 FloatABI(HardFloat),
Simon Atanasyana1b62272012-07-05 20:16:22 +00004182 DspRev(NoDSP),
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004183 ABI(ABIStr)
4184 {}
4185
Eric Christophered734732010-03-02 02:41:08 +00004186 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004187 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004188 virtual bool setCPU(const std::string &Name) {
4189 CPU = Name;
4190 return true;
4191 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004192 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004193 Features[ABI] = true;
4194 Features[CPU] = true;
4195 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004196
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004197 virtual void getTargetDefines(const LangOptions &Opts,
4198 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004199 DefineStd(Builder, "mips", Opts);
4200 Builder.defineMacro("_mips");
4201 Builder.defineMacro("__REGISTER_PREFIX__", "");
4202
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004203 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004204 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004205 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004206 break;
4207 case SingleFloat:
4208 Builder.defineMacro("__mips_hard_float", Twine(1));
4209 Builder.defineMacro("__mips_single_float", Twine(1));
4210 break;
4211 case SoftFloat:
4212 Builder.defineMacro("__mips_soft_float", Twine(1));
4213 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004214 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004215
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004216 if (IsMips16)
4217 Builder.defineMacro("__mips16", Twine(1));
4218
Simon Atanasyana1b62272012-07-05 20:16:22 +00004219 switch (DspRev) {
4220 default:
4221 break;
4222 case DSP1:
4223 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4224 Builder.defineMacro("__mips_dsp", Twine(1));
4225 break;
4226 case DSP2:
4227 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4228 Builder.defineMacro("__mips_dspr2", Twine(1));
4229 Builder.defineMacro("__mips_dsp", Twine(1));
4230 break;
4231 }
4232
Simon Atanasyan90913892012-04-05 19:28:31 +00004233 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4234 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4235 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004236
4237 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4238 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004239 }
4240
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004241 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4242 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004243 Records = BuiltinInfo;
4244 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004245 }
Douglas Gregore727d212012-01-30 06:38:25 +00004246 virtual bool hasFeature(StringRef Feature) const {
4247 return Feature == "mips";
4248 }
Meador Ingec5613b22012-06-16 03:34:49 +00004249 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4250 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004251 }
4252 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004253 unsigned &NumNames) const {
4254 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004255 // CPU register names
4256 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004257 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4258 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4259 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004260 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4261 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004262 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4263 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4264 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4265 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004266 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004267 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4268 "$fcc5","$fcc6","$fcc7"
4269 };
4270 Names = GCCRegNames;
4271 NumNames = llvm::array_lengthof(GCCRegNames);
4272 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004273 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004274 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004275 virtual bool validateAsmConstraint(const char *&Name,
4276 TargetInfo::ConstraintInfo &Info) const {
4277 switch (*Name) {
4278 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004279 return false;
4280
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004281 case 'r': // CPU registers.
4282 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4283 case 'y': // Equivalent to "r", backwards compatibility only.
4284 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004285 case 'c': // $25 for indirect jumps
4286 case 'l': // lo register
4287 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004288 Info.setAllowsRegister();
4289 return true;
4290 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004291 }
4292
4293 virtual const char *getClobbers() const {
4294 // FIXME: Implement!
4295 return "";
4296 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004297
4298 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
4299 StringRef Name,
4300 bool Enabled) const {
Simon Atanasyan8b2a5d22012-04-18 12:00:11 +00004301 if (Name == "soft-float" || Name == "single-float" ||
4302 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
4303 Name == "mips32" || Name == "mips32r2" ||
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00004304 Name == "mips64" || Name == "mips64r2" ||
Simon Atanasyand797a852012-07-05 19:23:00 +00004305 Name == "mips16" || Name == "dsp" || Name == "dspr2") {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004306 Features[Name] = Enabled;
4307 return true;
4308 }
4309 return false;
4310 }
4311
4312 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004313 IsMips16 = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004314 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004315 DspRev = NoDSP;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004316
4317 for (std::vector<std::string>::iterator it = Features.begin(),
4318 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004319 if (*it == "+single-float")
4320 FloatABI = SingleFloat;
4321 else if (*it == "+soft-float")
4322 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004323 else if (*it == "+mips16")
4324 IsMips16 = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004325 else if (*it == "+dsp")
4326 DspRev = std::max(DspRev, DSP1);
4327 else if (*it == "+dspr2")
4328 DspRev = std::max(DspRev, DSP2);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004329 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004330
4331 // Remove front-end specific option.
4332 std::vector<std::string>::iterator it =
4333 std::find(Features.begin(), Features.end(), "+soft-float");
4334 if (it != Features.end())
4335 Features.erase(it);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004336 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004337};
4338
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004339const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4340#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4341#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4342 ALL_LANGUAGES },
4343#include "clang/Basic/BuiltinsMips.def"
4344};
4345
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004346class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004347public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004348 Mips32TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004349 MipsTargetInfoBase(triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004350 SizeType = UnsignedInt;
4351 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004352 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004353 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004354 virtual bool setABI(const std::string &Name) {
4355 if ((Name == "o32") || (Name == "eabi")) {
4356 ABI = Name;
4357 return true;
4358 } else
4359 return false;
4360 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004361 virtual void getTargetDefines(const LangOptions &Opts,
4362 MacroBuilder &Builder) const {
4363 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004364
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004365 if (ABI == "o32") {
4366 Builder.defineMacro("__mips_o32");
4367 Builder.defineMacro("_ABIO32", "1");
4368 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4369 }
4370 else if (ABI == "eabi")
4371 Builder.defineMacro("__mips_eabi");
4372 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004373 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004374 }
4375 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4376 unsigned &NumAliases) const {
4377 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4378 { { "at" }, "$1" },
4379 { { "v0" }, "$2" },
4380 { { "v1" }, "$3" },
4381 { { "a0" }, "$4" },
4382 { { "a1" }, "$5" },
4383 { { "a2" }, "$6" },
4384 { { "a3" }, "$7" },
4385 { { "t0" }, "$8" },
4386 { { "t1" }, "$9" },
4387 { { "t2" }, "$10" },
4388 { { "t3" }, "$11" },
4389 { { "t4" }, "$12" },
4390 { { "t5" }, "$13" },
4391 { { "t6" }, "$14" },
4392 { { "t7" }, "$15" },
4393 { { "s0" }, "$16" },
4394 { { "s1" }, "$17" },
4395 { { "s2" }, "$18" },
4396 { { "s3" }, "$19" },
4397 { { "s4" }, "$20" },
4398 { { "s5" }, "$21" },
4399 { { "s6" }, "$22" },
4400 { { "s7" }, "$23" },
4401 { { "t8" }, "$24" },
4402 { { "t9" }, "$25" },
4403 { { "k0" }, "$26" },
4404 { { "k1" }, "$27" },
4405 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004406 { { "sp","$sp" }, "$29" },
4407 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004408 { { "ra" }, "$31" }
4409 };
4410 Aliases = GCCRegAliases;
4411 NumAliases = llvm::array_lengthof(GCCRegAliases);
4412 }
4413};
4414
4415class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4416public:
4417 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
4418 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004419 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004420 }
4421 virtual void getTargetDefines(const LangOptions &Opts,
4422 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004423 DefineStd(Builder, "MIPSEB", Opts);
4424 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004425 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004426 }
4427};
4428
4429class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4430public:
4431 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004432 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004433 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004434 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004435 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004436 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004437 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004438 DefineStd(Builder, "MIPSEL", Opts);
4439 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004440 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004441 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004442};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004443
4444class Mips64TargetInfoBase : public MipsTargetInfoBase {
4445 virtual void SetDescriptionString(const std::string &Name) = 0;
4446public:
4447 Mips64TargetInfoBase(const std::string& triple) :
Simon Atanasyan10e1629d2012-04-12 19:59:24 +00004448 MipsTargetInfoBase(triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004449 LongWidth = LongAlign = 64;
4450 PointerWidth = PointerAlign = 64;
4451 LongDoubleWidth = LongDoubleAlign = 128;
4452 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00004453 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4454 LongDoubleWidth = LongDoubleAlign = 64;
4455 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4456 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004457 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004458 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004459 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004460 virtual bool setABI(const std::string &Name) {
4461 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004462
4463 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004464 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004465
4466 ABI = Name;
4467
4468 if (Name == "n32") {
4469 LongWidth = LongAlign = 32;
4470 PointerWidth = PointerAlign = 32;
4471 }
4472
4473 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004474 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004475 virtual void getTargetDefines(const LangOptions &Opts,
4476 MacroBuilder &Builder) const {
4477 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004478
Simon Atanasyan600a5132012-08-29 20:50:11 +00004479 Builder.defineMacro("__mips64");
4480 Builder.defineMacro("__mips64__");
4481
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004482 if (ABI == "n32") {
4483 Builder.defineMacro("__mips_n32");
4484 Builder.defineMacro("_ABIN32", "2");
4485 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4486 }
4487 else if (ABI == "n64") {
4488 Builder.defineMacro("__mips_n64");
4489 Builder.defineMacro("_ABI64", "3");
4490 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4491 }
4492 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004493 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004494 }
4495 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4496 unsigned &NumAliases) const {
4497 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4498 { { "at" }, "$1" },
4499 { { "v0" }, "$2" },
4500 { { "v1" }, "$3" },
4501 { { "a0" }, "$4" },
4502 { { "a1" }, "$5" },
4503 { { "a2" }, "$6" },
4504 { { "a3" }, "$7" },
4505 { { "a4" }, "$8" },
4506 { { "a5" }, "$9" },
4507 { { "a6" }, "$10" },
4508 { { "a7" }, "$11" },
4509 { { "t0" }, "$12" },
4510 { { "t1" }, "$13" },
4511 { { "t2" }, "$14" },
4512 { { "t3" }, "$15" },
4513 { { "s0" }, "$16" },
4514 { { "s1" }, "$17" },
4515 { { "s2" }, "$18" },
4516 { { "s3" }, "$19" },
4517 { { "s4" }, "$20" },
4518 { { "s5" }, "$21" },
4519 { { "s6" }, "$22" },
4520 { { "s7" }, "$23" },
4521 { { "t8" }, "$24" },
4522 { { "t9" }, "$25" },
4523 { { "k0" }, "$26" },
4524 { { "k1" }, "$27" },
4525 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004526 { { "sp","$sp" }, "$29" },
4527 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004528 { { "ra" }, "$31" }
4529 };
4530 Aliases = GCCRegAliases;
4531 NumAliases = llvm::array_lengthof(GCCRegAliases);
4532 }
4533};
4534
4535class Mips64EBTargetInfo : public Mips64TargetInfoBase {
4536 virtual void SetDescriptionString(const std::string &Name) {
4537 // Change DescriptionString only if ABI is n32.
4538 if (Name == "n32")
4539 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004540 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004541 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004542 }
4543public:
4544 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4545 // Default ABI is n64.
4546 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004547 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004548 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004549 }
4550 virtual void getTargetDefines(const LangOptions &Opts,
4551 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004552 DefineStd(Builder, "MIPSEB", Opts);
4553 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004554 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004555 }
4556};
4557
4558class Mips64ELTargetInfo : public Mips64TargetInfoBase {
4559 virtual void SetDescriptionString(const std::string &Name) {
4560 // Change DescriptionString only if ABI is n32.
4561 if (Name == "n32")
4562 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004563 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004564 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004565 }
4566public:
4567 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004568 // Default ABI is n64.
4569 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004570 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004571 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004572 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004573 }
4574 virtual void getTargetDefines(const LangOptions &Opts,
4575 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004576 DefineStd(Builder, "MIPSEL", Opts);
4577 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004578 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004579 }
4580};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004581} // end anonymous namespace.
4582
Ivan Krasinef05abd2011-08-24 20:22:22 +00004583namespace {
4584class PNaClTargetInfo : public TargetInfo {
4585public:
4586 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004587 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004588 this->UserLabelPrefix = "";
4589 this->LongAlign = 32;
4590 this->LongWidth = 32;
4591 this->PointerAlign = 32;
4592 this->PointerWidth = 32;
4593 this->IntMaxType = TargetInfo::SignedLongLong;
4594 this->UIntMaxType = TargetInfo::UnsignedLongLong;
4595 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004596 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004597 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00004598 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00004599 this->SizeType = TargetInfo::UnsignedInt;
4600 this->PtrDiffType = TargetInfo::SignedInt;
4601 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00004602 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004603 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4604 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4605 }
4606
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004607 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00004608 }
4609 virtual void getArchDefines(const LangOptions &Opts,
4610 MacroBuilder &Builder) const {
4611 Builder.defineMacro("__le32__");
4612 Builder.defineMacro("__pnacl__");
4613 }
4614 virtual void getTargetDefines(const LangOptions &Opts,
4615 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00004616 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00004617 getArchDefines(Opts, Builder);
4618 }
Douglas Gregore727d212012-01-30 06:38:25 +00004619 virtual bool hasFeature(StringRef Feature) const {
4620 return Feature == "pnacl";
4621 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00004622 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4623 unsigned &NumRecords) const {
4624 }
Meador Ingec5613b22012-06-16 03:34:49 +00004625 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4626 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00004627 }
4628 virtual void getGCCRegNames(const char * const *&Names,
4629 unsigned &NumNames) const;
4630 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4631 unsigned &NumAliases) const;
4632 virtual bool validateAsmConstraint(const char *&Name,
4633 TargetInfo::ConstraintInfo &Info) const {
4634 return false;
4635 }
4636
4637 virtual const char *getClobbers() const {
4638 return "";
4639 }
4640};
4641
4642void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4643 unsigned &NumNames) const {
4644 Names = NULL;
4645 NumNames = 0;
4646}
4647
4648void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4649 unsigned &NumAliases) const {
4650 Aliases = NULL;
4651 NumAliases = 0;
4652}
4653} // end anonymous namespace.
4654
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004655namespace {
4656 static const unsigned SPIRAddrSpaceMap[] = {
4657 1, // opencl_global
4658 3, // opencl_local
4659 2, // opencl_constant
4660 0, // cuda_device
4661 0, // cuda_constant
4662 0 // cuda_shared
4663 };
4664 class SPIRTargetInfo : public TargetInfo {
4665 static const char * const GCCRegNames[];
4666 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00004667 std::vector<StringRef> AvailableFeatures;
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004668 public:
4669 SPIRTargetInfo(const std::string& triple) : TargetInfo(triple) {
4670 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
4671 "SPIR target must use unknown OS");
4672 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
4673 "SPIR target must use unknown environment type");
4674 BigEndian = false;
4675 TLSSupported = false;
4676 LongWidth = LongAlign = 64;
4677 AddrSpaceMap = &SPIRAddrSpaceMap;
4678 // Define available target features
4679 // These must be defined in sorted order!
4680 NoAsmVariants = true;
4681 }
4682 virtual void getTargetDefines(const LangOptions &Opts,
4683 MacroBuilder &Builder) const {
4684 DefineStd(Builder, "SPIR", Opts);
4685 }
4686 virtual bool hasFeature(StringRef Feature) const {
4687 return Feature == "spir";
4688 }
4689
4690 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4691 unsigned &NumRecords) const {}
4692 virtual const char *getClobbers() const {
4693 return "";
4694 }
4695 virtual void getGCCRegNames(const char * const *&Names,
4696 unsigned &NumNames) const {}
4697 virtual bool validateAsmConstraint(const char *&Name,
4698 TargetInfo::ConstraintInfo &info) const {
4699 return true;
4700 }
4701 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4702 unsigned &NumAliases) const {}
4703 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4704 return TargetInfo::VoidPtrBuiltinVaList;
4705 }
4706 };
4707
4708
4709 class SPIR32TargetInfo : public SPIRTargetInfo {
4710 public:
4711 SPIR32TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4712 PointerWidth = PointerAlign = 32;
4713 SizeType = TargetInfo::UnsignedInt;
4714 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
4715 DescriptionString
Guy Benyei8a033572012-12-13 13:22:48 +00004716 = "p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004717 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4718 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4719 "v512:512:512-v1024:1024:1024";
4720 }
4721 };
4722
4723 class SPIR64TargetInfo : public SPIRTargetInfo {
4724 public:
4725 SPIR64TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4726 PointerWidth = PointerAlign = 64;
4727 SizeType = TargetInfo::UnsignedLong;
4728 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
4729 DescriptionString
Guy Benyei8a033572012-12-13 13:22:48 +00004730 = "p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004731 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4732 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4733 "v512:512:512-v1024:1024:1024";
4734 }
4735 };
4736}
4737
Ivan Krasinef05abd2011-08-24 20:22:22 +00004738
Reid Spencer5f016e22007-07-11 17:01:13 +00004739//===----------------------------------------------------------------------===//
4740// Driver code
4741//===----------------------------------------------------------------------===//
4742
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004743static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004744 llvm::Triple Triple(T);
4745 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00004746
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004747 switch (Triple.getArch()) {
4748 default:
4749 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00004750
Tony Linthicum96319392011-12-12 21:14:55 +00004751 case llvm::Triple::hexagon:
4752 return new HexagonTargetInfo(T);
4753
Tim Northoverc264e162013-01-31 12:13:10 +00004754 case llvm::Triple::aarch64:
4755 switch (os) {
4756 case llvm::Triple::Linux:
4757 return new LinuxTargetInfo<AArch64TargetInfo>(T);
4758 default:
4759 return new AArch64TargetInfo(T);
4760 }
4761
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004762 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00004763 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004764 if (Triple.isOSDarwin())
4765 return new DarwinARMTargetInfo(T);
4766
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004767 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00004768 case llvm::Triple::Linux:
4769 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004770 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00004771 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004772 case llvm::Triple::NetBSD:
4773 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00004774 case llvm::Triple::OpenBSD:
4775 return new OpenBSDTargetInfo<ARMTargetInfo>(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00004776 case llvm::Triple::Bitrig:
4777 return new BitrigTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00004778 case llvm::Triple::RTEMS:
4779 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00004780 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00004781 return new NaClTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004782 default:
4783 return new ARMTargetInfo(T);
4784 }
Eli Friedman61538a72008-05-20 14:21:01 +00004785
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004786 case llvm::Triple::msp430:
4787 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00004788
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004789 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004790 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004791 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004792 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004793 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004794 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004795 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004796 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004797 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004798 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004799 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004800 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00004801 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004802
4803 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004804 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004805 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004806 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004807 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004808 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004809 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004810 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004811 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004812 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004813 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004814 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00004815 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004816
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004817 case llvm::Triple::mips64:
4818 switch (os) {
4819 case llvm::Triple::Linux:
4820 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
4821 case llvm::Triple::RTEMS:
4822 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
4823 case llvm::Triple::FreeBSD:
4824 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
4825 case llvm::Triple::NetBSD:
4826 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00004827 case llvm::Triple::OpenBSD:
4828 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004829 default:
4830 return new Mips64EBTargetInfo(T);
4831 }
4832
4833 case llvm::Triple::mips64el:
4834 switch (os) {
4835 case llvm::Triple::Linux:
4836 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
4837 case llvm::Triple::RTEMS:
4838 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
4839 case llvm::Triple::FreeBSD:
4840 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
4841 case llvm::Triple::NetBSD:
4842 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00004843 case llvm::Triple::OpenBSD:
4844 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004845 default:
4846 return new Mips64ELTargetInfo(T);
4847 }
4848
Ivan Krasinef05abd2011-08-24 20:22:22 +00004849 case llvm::Triple::le32:
4850 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00004851 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00004852 return new NaClTargetInfo<PNaClTargetInfo>(T);
Ivan Krasinef05abd2011-08-24 20:22:22 +00004853 default:
4854 return NULL;
4855 }
4856
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004857 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004858 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00004859 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004860 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00004861 case llvm::Triple::Linux:
4862 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004863 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00004864 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004865 case llvm::Triple::NetBSD:
4866 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00004867 case llvm::Triple::OpenBSD:
4868 return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004869 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00004870 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004871 default:
4872 return new PPC32TargetInfo(T);
4873 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004874
4875 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004876 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00004877 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004878 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00004879 case llvm::Triple::Linux:
4880 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004881 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00004882 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004883 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00004884 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004885 case llvm::Triple::NetBSD:
4886 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
4887 default:
4888 return new PPC64TargetInfo(T);
4889 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004890
Peter Collingbourneedb66f32012-05-20 23:28:41 +00004891 case llvm::Triple::nvptx:
4892 return new NVPTX32TargetInfo(T);
4893 case llvm::Triple::nvptx64:
4894 return new NVPTX64TargetInfo(T);
4895
Chris Lattner9cbeb632010-03-06 21:21:27 +00004896 case llvm::Triple::mblaze:
4897 return new MBlazeTargetInfo(T);
4898
Eli Friedman6505a292012-10-12 23:32:00 +00004899 case llvm::Triple::r600:
4900 return new R600TargetInfo(T);
4901
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004902 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004903 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00004904 case llvm::Triple::Linux:
4905 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004906 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004907 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004908 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004909 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004910 case llvm::Triple::NetBSD:
4911 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00004912 case llvm::Triple::OpenBSD:
4913 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004914 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00004915 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00004916 default:
4917 return new SparcV8TargetInfo(T);
4918 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004919
Eli Friedmanb63decf2009-08-19 20:47:07 +00004920 case llvm::Triple::tce:
4921 return new TCETargetInfo(T);
4922
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004923 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004924 if (Triple.isOSDarwin())
4925 return new DarwinI386TargetInfo(T);
4926
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004927 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004928 case llvm::Triple::AuroraUX:
4929 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004930 case llvm::Triple::Linux:
4931 return new LinuxTargetInfo<X86_32TargetInfo>(T);
4932 case llvm::Triple::DragonFly:
4933 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
4934 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00004935 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004936 case llvm::Triple::OpenBSD:
4937 return new OpenBSDI386TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00004938 case llvm::Triple::Bitrig:
4939 return new BitrigI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004940 case llvm::Triple::FreeBSD:
4941 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00004942 case llvm::Triple::Minix:
4943 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004944 case llvm::Triple::Solaris:
4945 return new SolarisTargetInfo<X86_32TargetInfo>(T);
4946 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00004947 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004948 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00004949 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004950 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00004951 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00004952 case llvm::Triple::Haiku:
4953 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00004954 case llvm::Triple::RTEMS:
4955 return new RTEMSX86_32TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00004956 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00004957 return new NaClTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004958 default:
4959 return new X86_32TargetInfo(T);
4960 }
4961
4962 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004963 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4964 return new DarwinX86_64TargetInfo(T);
4965
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004966 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004967 case llvm::Triple::AuroraUX:
4968 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004969 case llvm::Triple::Linux:
4970 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00004971 case llvm::Triple::DragonFly:
4972 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004973 case llvm::Triple::NetBSD:
4974 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4975 case llvm::Triple::OpenBSD:
4976 return new OpenBSDX86_64TargetInfo(T);
Eli Friedman42f74f22012-08-08 23:57:20 +00004977 case llvm::Triple::Bitrig:
4978 return new BitrigX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004979 case llvm::Triple::FreeBSD:
4980 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4981 case llvm::Triple::Solaris:
4982 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00004983 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00004984 return new MinGWX86_64TargetInfo(T);
4985 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004986 return new VisualStudioWindowsX86_64TargetInfo(T);
Eli Bendersky441d9f72012-12-04 18:38:10 +00004987 case llvm::Triple::NaCl:
Derek Schuff7da46f92012-10-11 16:55:58 +00004988 return new NaClTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00004989 default:
4990 return new X86_64TargetInfo(T);
4991 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00004992
4993 case llvm::Triple::spir: {
4994 llvm::Triple Triple(T);
4995 if (Triple.getOS() != llvm::Triple::UnknownOS ||
4996 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
4997 return NULL;
4998 return new SPIR32TargetInfo(T);
4999 }
5000 case llvm::Triple::spir64: {
5001 llvm::Triple Triple(T);
5002 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5003 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5004 return NULL;
5005 return new SPIR64TargetInfo(T);
5006 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005007 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005008}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005009
5010/// CreateTargetInfo - Return the target info object for the specified target
5011/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005012TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005013 TargetOptions *Opts) {
5014 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005015
5016 // Construct the target
Dylan Noblesmith6f42b622012-02-05 02:12:40 +00005017 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005018 if (!Target) {
5019 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5020 return 0;
5021 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005022 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005023
Daniel Dunbareac7c532009-12-18 18:42:37 +00005024 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005025 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5026 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005027 return 0;
5028 }
5029
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005030 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005031 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5032 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005033 return 0;
5034 }
5035
Charles Davis98b7c5c2010-06-11 01:06:47 +00005036 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005037 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5038 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005039 return 0;
5040 }
5041
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005042 // Compute the default target features, we need the target to handle this
5043 // because features may have dependencies on one another.
5044 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005045 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005046
5047 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005048 // First the enables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005049 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005050 it = Opts->FeaturesAsWritten.begin(),
5051 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005052 it != ie; ++it) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005053 const char *Name = it->c_str();
5054
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005055 if (Name[0] != '+')
5056 continue;
5057
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005058 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005059 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
5060 Diags.Report(diag::err_target_invalid_feature) << Name;
5061 return 0;
5062 }
5063 }
5064
5065 // Then the disables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005066 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005067 it = Opts->FeaturesAsWritten.begin(),
5068 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005069 it != ie; ++it) {
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005070 const char *Name = it->c_str();
5071
5072 if (Name[0] == '+')
5073 continue;
5074
5075 // Apply the feature via the target.
5076 if (Name[0] != '-' ||
5077 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005078 Diags.Report(diag::err_target_invalid_feature) << Name;
5079 return 0;
5080 }
5081 }
5082
5083 // Add the features to the compile options.
5084 //
5085 // FIXME: If we are completely confident that we have the right set, we only
5086 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005087 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005088 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5089 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005090 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5091 Target->HandleTargetFeatures(Opts->Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005092
5093 return Target.take();
5094}