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(
"__HEXAGON_AUDIO__");
109 std::string NumPhySlots =
isTinyCore() ?
"3" :
"4";
110 Builder.defineMacro(
"__HEXAGON_PHYSICAL_SLOTS__", NumPhySlots);
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");
120 const std::vector<std::string> &FeaturesVec)
const {
122 Features[
"audio"] =
true;
124 StringRef CPUFeature = CPU;
125 CPUFeature.consume_front(
"hexagon");
126 CPUFeature.consume_back(
"t");
127 if (!CPUFeature.empty())
128 Features[CPUFeature] =
true;
130 Features[
"long-calls"] =
false;
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) {
144 HVXVersion = F.substr(std::string(
"+hvxv").
length());
145 }
else if (F ==
"-hvx")
146 HasHVX = HasHVX64B = HasHVX128B =
false;
147 else if (F ==
"+long-calls")
149 else if (F ==
"-long-calls")
150 UseLongCalls =
false;
151 else if (F ==
"+audio")
154 if (CPU.compare(
"hexagonv68") >= 0) {
158 if (CPU.compare(
"hexagonv81") >= 0)
166const char *
const HexagonTargetInfo::GCCRegNames[] = {
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",
175 "p0",
"p1",
"p2",
"p3",
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",
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",
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",
195 "v3:0",
"v7:4",
"v11:8",
"v15:12",
"v19:16",
"v23:20",
"v27:24",
"v31:28",
197 "q0",
"q1",
"q2",
"q3",
217#define GET_BUILTIN_STR_TABLE
218#include "clang/Basic/BuiltinsHexagon.inc"
219#undef GET_BUILTIN_STR_TABLE
222#define GET_BUILTIN_INFOS
223#include "clang/Basic/BuiltinsHexagon.inc"
224#undef GET_BUILTIN_INFOS
228#define GET_BUILTIN_PREFIXED_INFOS
229#include "clang/Basic/BuiltinsHexagon.inc"
230#undef GET_BUILTIN_PREFIXED_INFOS
236 std::string VS =
"hvxv" + HVXVersion;
240 return llvm::StringSwitch<bool>(
Feature)
241 .Case(
"hexagon",
true)
243 .Case(
"hvx-length64b", HasHVX64B)
244 .Case(
"hvx-length128b", HasHVX128B)
245 .Case(
"long-calls", UseLongCalls)
246 .Case(
"audio", HasAudio)
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"}}};
266 StringRef
Arch = Name;
267 Arch.consume_front(
"hexagonv");
268 Arch.consume_back(
"t");
271 if (!
Arch.getAsInteger(0, Val))
282 return Item->
Suffix.data();
288 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.