16#include "llvm/ADT/StringSwitch.h"
23 Builder.defineMacro(
"__qdsp6__",
"1");
24 Builder.defineMacro(
"__hexagon__",
"1");
27 bool DefineHvxDbl =
false;
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");
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") {
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") {
49 Builder.defineMacro(
"__HEXAGON_V62__");
50 Builder.defineMacro(
"__HEXAGON_ARCH__",
"62");
51 }
else if (CPU ==
"hexagonv65") {
53 Builder.defineMacro(
"__HEXAGON_V65__");
54 Builder.defineMacro(
"__HEXAGON_ARCH__",
"65");
55 }
else if (CPU ==
"hexagonv66") {
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");
92 Builder.defineMacro(
"__HVX__");
93 Builder.defineMacro(
"__HVX_ARCH__", HVXVersion);
94 Builder.defineMacro(
"__HVX_LENGTH__",
"64");
98 Builder.defineMacro(
"__HVX__");
99 Builder.defineMacro(
"__HVX_ARCH__", HVXVersion);
100 Builder.defineMacro(
"__HVX_LENGTH__",
"128");
102 Builder.defineMacro(
"__HVXDBL__");
106 Builder.defineMacro(
"__HVX_IEEE_FP__");
109 Builder.defineMacro(
"__HEXAGON_AUDIO__");
112 std::string NumPhySlots =
isTinyCore() ?
"3" :
"4";
113 Builder.defineMacro(
"__HEXAGON_PHYSICAL_SLOTS__", NumPhySlots);
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");
123 const std::vector<std::string> &FeaturesVec)
const {
125 Features[
"audio"] =
true;
127 StringRef CPUFeature = CPU;
128 CPUFeature.consume_front(
"hexagon");
129 CPUFeature.consume_back(
"t");
130 if (!CPUFeature.empty())
131 Features[CPUFeature] =
true;
133 Features[
"long-calls"] =
false;
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) {
147 HVXVersion = F.substr(std::string(
"+hvxv").
length());
148 }
else if (F ==
"-hvx")
149 HasHVX = HasHVX64B = HasHVX128B =
false;
150 else if (F ==
"+long-calls")
152 else if (F ==
"-long-calls")
153 UseLongCalls =
false;
154 else if (F ==
"+hvx-ieee-fp")
156 else if (F ==
"+audio")
159 if (CPU.compare(
"hexagonv68") >= 0) {
163 if (CPU.compare(
"hexagonv81") >= 0)
171const char *
const HexagonTargetInfo::GCCRegNames[] = {
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",
180 "p0",
"p1",
"p2",
"p3",
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",
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",
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",
200 "v3:0",
"v7:4",
"v11:8",
"v15:12",
"v19:16",
"v23:20",
"v27:24",
"v31:28",
202 "q0",
"q1",
"q2",
"q3",
222#define GET_BUILTIN_STR_TABLE
223#include "clang/Basic/BuiltinsHexagon.inc"
224#undef GET_BUILTIN_STR_TABLE
227#define GET_BUILTIN_INFOS
228#include "clang/Basic/BuiltinsHexagon.inc"
229#undef GET_BUILTIN_INFOS
233#define GET_BUILTIN_PREFIXED_INFOS
234#include "clang/Basic/BuiltinsHexagon.inc"
235#undef GET_BUILTIN_PREFIXED_INFOS
241 std::string VS =
"hvxv" + HVXVersion;
245 return llvm::StringSwitch<bool>(
Feature)
246 .Case(
"hexagon",
true)
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)
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"}}};
272 StringRef
Arch = Name;
273 Arch.consume_front(
"hexagonv");
274 Arch.consume_back(
"t");
277 if (!
Arch.getAsInteger(0, Val))
288 return Item->
Suffix.data();
294 Values.push_back(Suffix.Name);
static constexpr llvm::StringTable BuiltinStrings
static constexpr CPUSuffix Suffixes[]
static constexpr Builtin::Info PrefixedBuiltinInfos[]
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
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.
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).
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 ...
static std::optional< unsigned > getHexagonCPURev(StringRef Name)
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
static const char * getHexagonCPUSuffix(StringRef Name)
ArrayRef< const char * > getGCCRegNames() const override
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
static constexpr int NumBuiltins
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
The info used to represent each builtin.