1 //===--- Sparc.cpp - Implement Sparc target feature support ---------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements Sparc TargetInfo objects.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "Sparc.h"
15 #include "Targets.h"
16 #include "clang/Basic/MacroBuilder.h"
17 #include "llvm/ADT/StringSwitch.h"
18 
19 using namespace clang;
20 using namespace clang::targets;
21 
22 const char *const SparcTargetInfo::GCCRegNames[] = {
23     "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
24     "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
25     "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
26 };
27 
28 ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
29   return llvm::makeArrayRef(GCCRegNames);
30 }
31 
32 const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
33     {{"g0"}, "r0"},  {{"g1"}, "r1"},  {{"g2"}, "r2"},        {{"g3"}, "r3"},
34     {{"g4"}, "r4"},  {{"g5"}, "r5"},  {{"g6"}, "r6"},        {{"g7"}, "r7"},
35     {{"o0"}, "r8"},  {{"o1"}, "r9"},  {{"o2"}, "r10"},       {{"o3"}, "r11"},
36     {{"o4"}, "r12"}, {{"o5"}, "r13"}, {{"o6", "sp"}, "r14"}, {{"o7"}, "r15"},
37     {{"l0"}, "r16"}, {{"l1"}, "r17"}, {{"l2"}, "r18"},       {{"l3"}, "r19"},
38     {{"l4"}, "r20"}, {{"l5"}, "r21"}, {{"l6"}, "r22"},       {{"l7"}, "r23"},
39     {{"i0"}, "r24"}, {{"i1"}, "r25"}, {{"i2"}, "r26"},       {{"i3"}, "r27"},
40     {{"i4"}, "r28"}, {{"i5"}, "r29"}, {{"i6", "fp"}, "r30"}, {{"i7"}, "r31"},
41 };
42 
43 ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
44   return llvm::makeArrayRef(GCCRegAliases);
45 }
46 
47 bool SparcTargetInfo::hasFeature(StringRef Feature) const {
48   return llvm::StringSwitch<bool>(Feature)
49       .Case("softfloat", SoftFloat)
50       .Case("sparc", true)
51       .Default(false);
52 }
53 
54 SparcTargetInfo::CPUKind SparcTargetInfo::getCPUKind(StringRef Name) const {
55   return llvm::StringSwitch<CPUKind>(Name)
56       .Case("v8", CK_V8)
57       .Case("supersparc", CK_SUPERSPARC)
58       .Case("sparclite", CK_SPARCLITE)
59       .Case("f934", CK_F934)
60       .Case("hypersparc", CK_HYPERSPARC)
61       .Case("sparclite86x", CK_SPARCLITE86X)
62       .Case("sparclet", CK_SPARCLET)
63       .Case("tsc701", CK_TSC701)
64       .Case("v9", CK_V9)
65       .Case("ultrasparc", CK_ULTRASPARC)
66       .Case("ultrasparc3", CK_ULTRASPARC3)
67       .Case("niagara", CK_NIAGARA)
68       .Case("niagara2", CK_NIAGARA2)
69       .Case("niagara3", CK_NIAGARA3)
70       .Case("niagara4", CK_NIAGARA4)
71       .Case("ma2100", CK_MYRIAD2100)
72       .Case("ma2150", CK_MYRIAD2150)
73       .Case("ma2450", CK_MYRIAD2450)
74       // FIXME: the myriad2[.n] spellings are obsolete,
75       // but a grace period is needed to allow updating dependent builds.
76       .Case("myriad2", CK_MYRIAD2100)
77       .Case("myriad2.1", CK_MYRIAD2100)
78       .Case("myriad2.2", CK_MYRIAD2150)
79       .Case("leon2", CK_LEON2)
80       .Case("at697e", CK_LEON2_AT697E)
81       .Case("at697f", CK_LEON2_AT697F)
82       .Case("leon3", CK_LEON3)
83       .Case("ut699", CK_LEON3_UT699)
84       .Case("gr712rc", CK_LEON3_GR712RC)
85       .Case("leon4", CK_LEON4)
86       .Case("gr740", CK_LEON4_GR740)
87       .Default(CK_GENERIC);
88 }
89 
90 void SparcTargetInfo::getTargetDefines(const LangOptions &Opts,
91                                        MacroBuilder &Builder) const {
92   DefineStd(Builder, "sparc", Opts);
93   Builder.defineMacro("__REGISTER_PREFIX__", "");
94 
95   if (SoftFloat)
96     Builder.defineMacro("SOFT_FLOAT", "1");
97 }
98 
99 void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,
100                                          MacroBuilder &Builder) const {
101   SparcTargetInfo::getTargetDefines(Opts, Builder);
102   switch (getCPUGeneration(CPU)) {
103   case CG_V8:
104     Builder.defineMacro("__sparcv8");
105     if (getTriple().getOS() != llvm::Triple::Solaris)
106       Builder.defineMacro("__sparcv8__");
107     break;
108   case CG_V9:
109     Builder.defineMacro("__sparcv9");
110     if (getTriple().getOS() != llvm::Triple::Solaris) {
111       Builder.defineMacro("__sparcv9__");
112       Builder.defineMacro("__sparc_v9__");
113     }
114     break;
115   }
116   if (getTriple().getVendor() == llvm::Triple::Myriad) {
117     std::string MyriadArchValue, Myriad2Value;
118     Builder.defineMacro("__sparc_v8__");
119     Builder.defineMacro("__leon__");
120     switch (CPU) {
121     case CK_MYRIAD2150:
122       MyriadArchValue = "__ma2150";
123       Myriad2Value = "2";
124       break;
125     case CK_MYRIAD2450:
126       MyriadArchValue = "__ma2450";
127       Myriad2Value = "2";
128       break;
129     default:
130       MyriadArchValue = "__ma2100";
131       Myriad2Value = "1";
132       break;
133     }
134     Builder.defineMacro(MyriadArchValue, "1");
135     Builder.defineMacro(MyriadArchValue + "__", "1");
136     Builder.defineMacro("__myriad2__", Myriad2Value);
137     Builder.defineMacro("__myriad2", Myriad2Value);
138   }
139 }
140 
141 void SparcV9TargetInfo::getTargetDefines(const LangOptions &Opts,
142                                          MacroBuilder &Builder) const {
143   SparcTargetInfo::getTargetDefines(Opts, Builder);
144   Builder.defineMacro("__sparcv9");
145   Builder.defineMacro("__arch64__");
146   // Solaris doesn't need these variants, but the BSDs do.
147   if (getTriple().getOS() != llvm::Triple::Solaris) {
148     Builder.defineMacro("__sparc64__");
149     Builder.defineMacro("__sparc_v9__");
150     Builder.defineMacro("__sparcv9__");
151   }
152 }
153