clang 23.0.0git
Hexagon.cpp
Go to the documentation of this file.
1//===--- Hexagon.cpp - Implement Hexagon target feature support -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements Hexagon TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "Hexagon.h"
16#include "llvm/ADT/StringSwitch.h"
17
18using namespace clang;
19using namespace clang::targets;
20
22 MacroBuilder &Builder) const {
23 Builder.defineMacro("__qdsp6__", "1");
24 Builder.defineMacro("__hexagon__", "1");
25
26 // The macro __HVXDBL__ is deprecated.
27 bool DefineHvxDbl = false;
28
29 if (CPU == "hexagonv5") {
30 Builder.defineMacro("__HEXAGON_V5__");
31 Builder.defineMacro("__HEXAGON_ARCH__", "5");
32 if (Opts.HexagonQdsp6Compat) {
33 Builder.defineMacro("__QDSP6_V5__");
34 Builder.defineMacro("__QDSP6_ARCH__", "5");
35 }
36 } else if (CPU == "hexagonv55") {
37 Builder.defineMacro("__HEXAGON_V55__");
38 Builder.defineMacro("__HEXAGON_ARCH__", "55");
39 Builder.defineMacro("__QDSP6_V55__");
40 Builder.defineMacro("__QDSP6_ARCH__", "55");
41 } else if (CPU == "hexagonv60") {
42 DefineHvxDbl = true;
43 Builder.defineMacro("__HEXAGON_V60__");
44 Builder.defineMacro("__HEXAGON_ARCH__", "60");
45 Builder.defineMacro("__QDSP6_V60__");
46 Builder.defineMacro("__QDSP6_ARCH__", "60");
47 } else if (CPU == "hexagonv62") {
48 DefineHvxDbl = true;
49 Builder.defineMacro("__HEXAGON_V62__");
50 Builder.defineMacro("__HEXAGON_ARCH__", "62");
51 } else if (CPU == "hexagonv65") {
52 DefineHvxDbl = true;
53 Builder.defineMacro("__HEXAGON_V65__");
54 Builder.defineMacro("__HEXAGON_ARCH__", "65");
55 } else if (CPU == "hexagonv66") {
56 DefineHvxDbl = true;
57 Builder.defineMacro("__HEXAGON_V66__");
58 Builder.defineMacro("__HEXAGON_ARCH__", "66");
59 } else if (CPU == "hexagonv67") {
60 Builder.defineMacro("__HEXAGON_V67__");
61 Builder.defineMacro("__HEXAGON_ARCH__", "67");
62 } else if (CPU == "hexagonv67t") {
63 Builder.defineMacro("__HEXAGON_V67T__");
64 Builder.defineMacro("__HEXAGON_ARCH__", "67");
65 } else if (CPU == "hexagonv68") {
66 Builder.defineMacro("__HEXAGON_V68__");
67 Builder.defineMacro("__HEXAGON_ARCH__", "68");
68 } else if (CPU == "hexagonv69") {
69 Builder.defineMacro("__HEXAGON_V69__");
70 Builder.defineMacro("__HEXAGON_ARCH__", "69");
71 } else if (CPU == "hexagonv71") {
72 Builder.defineMacro("__HEXAGON_V71__");
73 Builder.defineMacro("__HEXAGON_ARCH__", "71");
74 } else if (CPU == "hexagonv71t") {
75 Builder.defineMacro("__HEXAGON_V71T__");
76 Builder.defineMacro("__HEXAGON_ARCH__", "71");
77 } else if (CPU == "hexagonv73") {
78 Builder.defineMacro("__HEXAGON_V73__");
79 Builder.defineMacro("__HEXAGON_ARCH__", "73");
80 } else if (CPU == "hexagonv75") {
81 Builder.defineMacro("__HEXAGON_V75__");
82 Builder.defineMacro("__HEXAGON_ARCH__", "75");
83 } else if (CPU == "hexagonv79") {
84 Builder.defineMacro("__HEXAGON_V79__");
85 Builder.defineMacro("__HEXAGON_ARCH__", "79");
86 } else if (CPU == "hexagonv81") {
87 Builder.defineMacro("__HEXAGON_V81__");
88 Builder.defineMacro("__HEXAGON_ARCH__", "81");
89 }
90
91 if (hasFeature("hvx-length64b")) {
92 Builder.defineMacro("__HVX__");
93 Builder.defineMacro("__HVX_ARCH__", HVXVersion);
94 Builder.defineMacro("__HVX_LENGTH__", "64");
95 }
96
97 if (hasFeature("hvx-length128b")) {
98 Builder.defineMacro("__HVX__");
99 Builder.defineMacro("__HVX_ARCH__", HVXVersion);
100 Builder.defineMacro("__HVX_LENGTH__", "128");
101 if (DefineHvxDbl)
102 Builder.defineMacro("__HVXDBL__");
103 }
104
105 if (HasHVXIeeeFp)
106 Builder.defineMacro("__HVX_IEEE_FP__");
107
108 if (hasFeature("audio")) {
109 Builder.defineMacro("__HEXAGON_AUDIO__");
110 }
111
112 std::string NumPhySlots = isTinyCore() ? "3" : "4";
113 Builder.defineMacro("__HEXAGON_PHYSICAL_SLOTS__", NumPhySlots);
114
115 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
116 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
117 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
118 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
119}
120
122 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
123 const std::vector<std::string> &FeaturesVec) const {
124 if (isTinyCore())
125 Features["audio"] = true;
126
127 StringRef CPUFeature = CPU;
128 CPUFeature.consume_front("hexagon");
129 CPUFeature.consume_back("t");
130 if (!CPUFeature.empty())
131 Features[CPUFeature] = true;
132
133 Features["long-calls"] = false;
134
135 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
136}
137
138bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
139 DiagnosticsEngine &Diags) {
140 for (auto &F : Features) {
141 if (F == "+hvx-length64b")
142 HasHVX = HasHVX64B = true;
143 else if (F == "+hvx-length128b")
144 HasHVX = HasHVX128B = true;
145 else if (F.find("+hvxv") != std::string::npos) {
146 HasHVX = true;
147 HVXVersion = F.substr(std::string("+hvxv").length());
148 } else if (F == "-hvx")
149 HasHVX = HasHVX64B = HasHVX128B = false;
150 else if (F == "+long-calls")
151 UseLongCalls = true;
152 else if (F == "-long-calls")
153 UseLongCalls = false;
154 else if (F == "+hvx-ieee-fp")
155 HasHVXIeeeFp = true;
156 else if (F == "+audio")
157 HasAudio = true;
158 }
159 if (CPU.compare("hexagonv68") >= 0) {
160 HasFastHalfType = true;
161 HasFloat16 = true;
162 }
163 if (CPU.compare("hexagonv81") >= 0)
164 HasBFloat16 = true;
165
166 return true;
167}
168
170
171const char *const HexagonTargetInfo::GCCRegNames[] = {
172 // Scalar registers:
173 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11",
174 "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
175 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
176 "r1:0", "r3:2", "r5:4", "r7:6", "r9:8", "r11:10", "r13:12", "r15:14",
177 "r17:16", "r19:18", "r21:20", "r23:22", "r25:24", "r27:26", "r29:28",
178 "r31:30",
179 // Predicate registers:
180 "p0", "p1", "p2", "p3",
181 // Control registers:
182 "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11",
183 "c12", "c13", "c14", "c15", "c16", "c17", "c18", "c19", "c20", "c21",
184 "c22", "c23", "c24", "c25", "c26", "c27", "c28", "c29", "c30", "c31",
185 "c1:0", "c3:2", "c5:4", "c7:6", "c9:8", "c11:10", "c13:12", "c15:14",
186 "c17:16", "c19:18", "c21:20", "c23:22", "c25:24", "c27:26", "c29:28",
187 "c31:30",
188 // Control register aliases:
189 "sa0", "lc0", "sa1", "lc1", "p3:0", "m0", "m1", "usr", "pc", "ugp",
190 "gp", "cs0", "cs1", "upcyclelo", "upcyclehi", "framelimit", "framekey",
191 "pktcountlo", "pktcounthi", "utimerlo", "utimerhi",
192 "upcycle", "pktcount", "utimer",
193 // HVX vector registers:
194 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11",
195 "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
196 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
197 "v1:0", "v3:2", "v5:4", "v7:6", "v9:8", "v11:10", "v13:12", "v15:14",
198 "v17:16", "v19:18", "v21:20", "v23:22", "v25:24", "v27:26", "v29:28",
199 "v31:30",
200 "v3:0", "v7:4", "v11:8", "v15:12", "v19:16", "v23:20", "v27:24", "v31:28",
201 // HVX vector predicates:
202 "q0", "q1", "q2", "q3",
203};
204
208
209const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
210 {{"sp"}, "r29"},
211 {{"fp"}, "r30"},
212 {{"lr"}, "r31"},
213};
214
218
219static constexpr int NumBuiltins =
221
222#define GET_BUILTIN_STR_TABLE
223#include "clang/Basic/BuiltinsHexagon.inc"
224#undef GET_BUILTIN_STR_TABLE
225
226static constexpr Builtin::Info BuiltinInfos[] = {
227#define GET_BUILTIN_INFOS
228#include "clang/Basic/BuiltinsHexagon.inc"
229#undef GET_BUILTIN_INFOS
230};
231
233#define GET_BUILTIN_PREFIXED_INFOS
234#include "clang/Basic/BuiltinsHexagon.inc"
235#undef GET_BUILTIN_PREFIXED_INFOS
236};
237static_assert((std::size(BuiltinInfos) + std::size(PrefixedBuiltinInfos)) ==
239
241 std::string VS = "hvxv" + HVXVersion;
242 if (Feature == VS)
243 return true;
244
245 return llvm::StringSwitch<bool>(Feature)
246 .Case("hexagon", true)
247 .Case("hvx", HasHVX)
248 .Case("hvx-length64b", HasHVX64B)
249 .Case("hvx-length128b", HasHVX128B)
250 .Case("hvx-ieee-fp", HasHVXIeeeFp)
251 .Case("long-calls", UseLongCalls)
252 .Case("audio", HasAudio)
253 .Default(false);
254}
255
256struct CPUSuffix {
257 llvm::StringLiteral Name;
258 llvm::StringLiteral Suffix;
259};
260
261static constexpr CPUSuffix Suffixes[] = {
262 {{"hexagonv5"}, {"5"}}, {{"hexagonv55"}, {"55"}},
263 {{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}},
264 {{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}},
265 {{"hexagonv67"}, {"67"}}, {{"hexagonv67t"}, {"67t"}},
266 {{"hexagonv68"}, {"68"}}, {{"hexagonv69"}, {"69"}},
267 {{"hexagonv71"}, {"71"}}, {{"hexagonv71t"}, {"71t"}},
268 {{"hexagonv73"}, {"73"}}, {{"hexagonv75"}, {"75"}},
269 {{"hexagonv79"}, {"79"}}, {{"hexagonv81"}, {"81"}}};
270
271std::optional<unsigned> HexagonTargetInfo::getHexagonCPURev(StringRef Name) {
272 StringRef Arch = Name;
273 Arch.consume_front("hexagonv");
274 Arch.consume_back("t");
275
276 unsigned Val;
277 if (!Arch.getAsInteger(0, Val))
278 return Val;
279
280 return std::nullopt;
281}
282
283const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) {
284 const CPUSuffix *Item = llvm::find_if(
285 Suffixes, [Name](const CPUSuffix &S) { return S.Name == Name; });
286 if (Item == std::end(Suffixes))
287 return nullptr;
288 return Item->Suffix.data();
289}
290
292 SmallVectorImpl<StringRef> &Values) const {
293 for (const CPUSuffix &Suffix : Suffixes)
294 Values.push_back(Suffix.Name);
295}
296
299 return {{&BuiltinStrings, BuiltinInfos},
300 {&BuiltinStrings, PrefixedBuiltinInfos, "__builtin_HEXAGON_"}};
301}
static constexpr llvm::StringTable BuiltinStrings
Definition ARM.cpp:1115
static constexpr CPUSuffix Suffixes[]
Definition Hexagon.cpp:261
static constexpr Builtin::Info PrefixedBuiltinInfos[]
Definition Hexagon.cpp:232
static constexpr Builtin::Info BuiltinInfos[]
Definition Builtins.cpp:38
static constexpr unsigned NumBuiltins
Definition Builtins.cpp:32
Defines the clang::MacroBuilder utility class.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
Definition Hexagon.cpp:138
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
Definition Hexagon.cpp:121
static std::optional< unsigned > getHexagonCPURev(StringRef Name)
Definition Hexagon.cpp:271
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
Definition Hexagon.cpp:298
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition Hexagon.cpp:215
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
Definition Hexagon.cpp:169
static const char * getHexagonCPUSuffix(StringRef Name)
Definition Hexagon.cpp:283
ArrayRef< const char * > getGCCRegNames() const override
Definition Hexagon.cpp:205
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition Hexagon.cpp:291
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Hexagon.cpp:21
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Definition Hexagon.cpp:240
static constexpr int NumBuiltins
Definition X86.cpp:30
The JSON file list parser is used to communicate input to InstallAPI.
float __ovld __cnfn length(float)
Return the length of vector p, i.e., sqrt(p.x2 + p.y 2 + ...)
llvm::StringLiteral Suffix
Definition Hexagon.cpp:258
llvm::StringLiteral Name
Definition Hexagon.cpp:257
The info used to represent each builtin.
Definition Builtins.h:79