clang 22.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 (hasFeature("audio")) {
106 Builder.defineMacro("__HEXAGON_AUDIO__");
107 }
108
109 std::string NumPhySlots = isTinyCore() ? "3" : "4";
110 Builder.defineMacro("__HEXAGON_PHYSICAL_SLOTS__", NumPhySlots);
111
112 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
113 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
114 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
115 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
116}
117
119 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
120 const std::vector<std::string> &FeaturesVec) const {
121 if (isTinyCore())
122 Features["audio"] = true;
123
124 StringRef CPUFeature = CPU;
125 CPUFeature.consume_front("hexagon");
126 CPUFeature.consume_back("t");
127 if (!CPUFeature.empty())
128 Features[CPUFeature] = true;
129
130 Features["long-calls"] = false;
131
132 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
133}
134
135bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
136 DiagnosticsEngine &Diags) {
137 for (auto &F : Features) {
138 if (F == "+hvx-length64b")
139 HasHVX = HasHVX64B = true;
140 else if (F == "+hvx-length128b")
141 HasHVX = HasHVX128B = true;
142 else if (F.find("+hvxv") != std::string::npos) {
143 HasHVX = true;
144 HVXVersion = F.substr(std::string("+hvxv").length());
145 } else if (F == "-hvx")
146 HasHVX = HasHVX64B = HasHVX128B = false;
147 else if (F == "+long-calls")
148 UseLongCalls = true;
149 else if (F == "-long-calls")
150 UseLongCalls = false;
151 else if (F == "+audio")
152 HasAudio = true;
153 }
154 if (CPU.compare("hexagonv68") >= 0) {
155 HasFastHalfType = true;
156 HasFloat16 = true;
157 }
158 if (CPU.compare("hexagonv81") >= 0)
159 HasBFloat16 = true;
160
161 return true;
162}
163
165
166const char *const HexagonTargetInfo::GCCRegNames[] = {
167 // Scalar registers:
168 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11",
169 "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
170 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
171 "r1:0", "r3:2", "r5:4", "r7:6", "r9:8", "r11:10", "r13:12", "r15:14",
172 "r17:16", "r19:18", "r21:20", "r23:22", "r25:24", "r27:26", "r29:28",
173 "r31:30",
174 // Predicate registers:
175 "p0", "p1", "p2", "p3",
176 // Control registers:
177 "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11",
178 "c12", "c13", "c14", "c15", "c16", "c17", "c18", "c19", "c20", "c21",
179 "c22", "c23", "c24", "c25", "c26", "c27", "c28", "c29", "c30", "c31",
180 "c1:0", "c3:2", "c5:4", "c7:6", "c9:8", "c11:10", "c13:12", "c15:14",
181 "c17:16", "c19:18", "c21:20", "c23:22", "c25:24", "c27:26", "c29:28",
182 "c31:30",
183 // Control register aliases:
184 "sa0", "lc0", "sa1", "lc1", "p3:0", "m0", "m1", "usr", "pc", "ugp",
185 "gp", "cs0", "cs1", "upcyclelo", "upcyclehi", "framelimit", "framekey",
186 "pktcountlo", "pktcounthi", "utimerlo", "utimerhi",
187 "upcycle", "pktcount", "utimer",
188 // HVX vector registers:
189 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11",
190 "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
191 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
192 "v1:0", "v3:2", "v5:4", "v7:6", "v9:8", "v11:10", "v13:12", "v15:14",
193 "v17:16", "v19:18", "v21:20", "v23:22", "v25:24", "v27:26", "v29:28",
194 "v31:30",
195 "v3:0", "v7:4", "v11:8", "v15:12", "v19:16", "v23:20", "v27:24", "v31:28",
196 // HVX vector predicates:
197 "q0", "q1", "q2", "q3",
198};
199
203
204const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
205 {{"sp"}, "r29"},
206 {{"fp"}, "r30"},
207 {{"lr"}, "r31"},
208};
209
213
214static constexpr int NumBuiltins =
216
217#define GET_BUILTIN_STR_TABLE
218#include "clang/Basic/BuiltinsHexagon.inc"
219#undef GET_BUILTIN_STR_TABLE
220
221static constexpr Builtin::Info BuiltinInfos[] = {
222#define GET_BUILTIN_INFOS
223#include "clang/Basic/BuiltinsHexagon.inc"
224#undef GET_BUILTIN_INFOS
225};
226
228#define GET_BUILTIN_PREFIXED_INFOS
229#include "clang/Basic/BuiltinsHexagon.inc"
230#undef GET_BUILTIN_PREFIXED_INFOS
231};
232static_assert((std::size(BuiltinInfos) + std::size(PrefixedBuiltinInfos)) ==
234
236 std::string VS = "hvxv" + HVXVersion;
237 if (Feature == VS)
238 return true;
239
240 return llvm::StringSwitch<bool>(Feature)
241 .Case("hexagon", true)
242 .Case("hvx", HasHVX)
243 .Case("hvx-length64b", HasHVX64B)
244 .Case("hvx-length128b", HasHVX128B)
245 .Case("long-calls", UseLongCalls)
246 .Case("audio", HasAudio)
247 .Default(false);
248}
249
250struct CPUSuffix {
251 llvm::StringLiteral Name;
252 llvm::StringLiteral Suffix;
253};
254
255static constexpr CPUSuffix Suffixes[] = {
256 {{"hexagonv5"}, {"5"}}, {{"hexagonv55"}, {"55"}},
257 {{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}},
258 {{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}},
259 {{"hexagonv67"}, {"67"}}, {{"hexagonv67t"}, {"67t"}},
260 {{"hexagonv68"}, {"68"}}, {{"hexagonv69"}, {"69"}},
261 {{"hexagonv71"}, {"71"}}, {{"hexagonv71t"}, {"71t"}},
262 {{"hexagonv73"}, {"73"}}, {{"hexagonv75"}, {"75"}},
263 {{"hexagonv79"}, {"79"}}, {{"hexagonv81"}, {"81"}}};
264
265std::optional<unsigned> HexagonTargetInfo::getHexagonCPURev(StringRef Name) {
266 StringRef Arch = Name;
267 Arch.consume_front("hexagonv");
268 Arch.consume_back("t");
269
270 unsigned Val;
271 if (!Arch.getAsInteger(0, Val))
272 return Val;
273
274 return std::nullopt;
275}
276
277const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) {
278 const CPUSuffix *Item = llvm::find_if(
279 Suffixes, [Name](const CPUSuffix &S) { return S.Name == Name; });
280 if (Item == std::end(Suffixes))
281 return nullptr;
282 return Item->Suffix.data();
283}
284
286 SmallVectorImpl<StringRef> &Values) const {
287 for (const CPUSuffix &Suffix : Suffixes)
288 Values.push_back(Suffix.Name);
289}
290
293 return {{&BuiltinStrings, BuiltinInfos},
294 {&BuiltinStrings, PrefixedBuiltinInfos, "__builtin_HEXAGON_"}};
295}
static constexpr llvm::StringTable BuiltinStrings
Definition AMDGPU.cpp:101
static constexpr CPUSuffix Suffixes[]
Definition Hexagon.cpp:255
static constexpr Builtin::Info PrefixedBuiltinInfos[]
Definition Hexagon.cpp:227
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:135
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:118
static std::optional< unsigned > getHexagonCPURev(StringRef Name)
Definition Hexagon.cpp:265
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:292
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition Hexagon.cpp:210
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
Definition Hexagon.cpp:164
static const char * getHexagonCPUSuffix(StringRef Name)
Definition Hexagon.cpp:277
ArrayRef< const char * > getGCCRegNames() const override
Definition Hexagon.cpp:200
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition Hexagon.cpp:285
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:235
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:252
llvm::StringLiteral Name
Definition Hexagon.cpp:251
The info used to represent each builtin.
Definition Builtins.h:79