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");
89 Builder.defineMacro(
"__HVX__");
90 Builder.defineMacro(
"__HVX_ARCH__", HVXVersion);
91 Builder.defineMacro(
"__HVX_LENGTH__",
"64");
95 Builder.defineMacro(
"__HVX__");
96 Builder.defineMacro(
"__HVX_ARCH__", HVXVersion);
97 Builder.defineMacro(
"__HVX_LENGTH__",
"128");
99 Builder.defineMacro(
"__HVXDBL__");
103 Builder.defineMacro(
"__HEXAGON_AUDIO__");
106 std::string NumPhySlots =
isTinyCore() ?
"3" :
"4";
107 Builder.defineMacro(
"__HEXAGON_PHYSICAL_SLOTS__", NumPhySlots);
109 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
110 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
111 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
112 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
117 const std::vector<std::string> &FeaturesVec)
const {
119 Features[
"audio"] =
true;
121 StringRef CPUFeature = CPU;
122 CPUFeature.consume_front(
"hexagon");
123 CPUFeature.consume_back(
"t");
124 if (!CPUFeature.empty())
125 Features[CPUFeature] =
true;
127 Features[
"long-calls"] =
false;
134 for (
auto &F : Features) {
135 if (F ==
"+hvx-length64b")
136 HasHVX = HasHVX64B =
true;
137 else if (F ==
"+hvx-length128b")
138 HasHVX = HasHVX128B =
true;
139 else if (F.find(
"+hvxv") != std::string::npos) {
141 HVXVersion = F.substr(std::string(
"+hvxv").
length());
142 }
else if (F ==
"-hvx")
143 HasHVX = HasHVX64B = HasHVX128B =
false;
144 else if (F ==
"+long-calls")
146 else if (F ==
"-long-calls")
147 UseLongCalls =
false;
148 else if (F ==
"+audio")
151 if (CPU.compare(
"hexagonv68") >= 0) {
158const char *
const HexagonTargetInfo::GCCRegNames[] = {
160 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
161 "r12",
"r13",
"r14",
"r15",
"r16",
"r17",
"r18",
"r19",
"r20",
"r21",
162 "r22",
"r23",
"r24",
"r25",
"r26",
"r27",
"r28",
"r29",
"r30",
"r31",
163 "r1:0",
"r3:2",
"r5:4",
"r7:6",
"r9:8",
"r11:10",
"r13:12",
"r15:14",
164 "r17:16",
"r19:18",
"r21:20",
"r23:22",
"r25:24",
"r27:26",
"r29:28",
167 "p0",
"p1",
"p2",
"p3",
169 "c0",
"c1",
"c2",
"c3",
"c4",
"c5",
"c6",
"c7",
"c8",
"c9",
"c10",
"c11",
170 "c12",
"c13",
"c14",
"c15",
"c16",
"c17",
"c18",
"c19",
"c20",
"c21",
171 "c22",
"c23",
"c24",
"c25",
"c26",
"c27",
"c28",
"c29",
"c30",
"c31",
172 "c1:0",
"c3:2",
"c5:4",
"c7:6",
"c9:8",
"c11:10",
"c13:12",
"c15:14",
173 "c17:16",
"c19:18",
"c21:20",
"c23:22",
"c25:24",
"c27:26",
"c29:28",
176 "sa0",
"lc0",
"sa1",
"lc1",
"p3:0",
"m0",
"m1",
"usr",
"pc",
"ugp",
177 "gp",
"cs0",
"cs1",
"upcyclelo",
"upcyclehi",
"framelimit",
"framekey",
178 "pktcountlo",
"pktcounthi",
"utimerlo",
"utimerhi",
179 "upcycle",
"pktcount",
"utimer",
181 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
182 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
183 "v22",
"v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
184 "v1:0",
"v3:2",
"v5:4",
"v7:6",
"v9:8",
"v11:10",
"v13:12",
"v15:14",
185 "v17:16",
"v19:18",
"v21:20",
"v23:22",
"v25:24",
"v27:26",
"v29:28",
187 "v3:0",
"v7:4",
"v11:8",
"v15:12",
"v19:16",
"v23:20",
"v27:24",
"v31:28",
189 "q0",
"q1",
"q2",
"q3",
209#define GET_BUILTIN_STR_TABLE
210#include "clang/Basic/BuiltinsHexagon.inc"
211#undef GET_BUILTIN_STR_TABLE
214#define GET_BUILTIN_INFOS
215#include "clang/Basic/BuiltinsHexagon.inc"
216#undef GET_BUILTIN_INFOS
220#define GET_BUILTIN_PREFIXED_INFOS
221#include "clang/Basic/BuiltinsHexagon.inc"
222#undef GET_BUILTIN_PREFIXED_INFOS
228 std::string VS =
"hvxv" + HVXVersion;
232 return llvm::StringSwitch<bool>(
Feature)
233 .Case(
"hexagon",
true)
235 .Case(
"hvx-length64b", HasHVX64B)
236 .Case(
"hvx-length128b", HasHVX128B)
237 .Case(
"long-calls", UseLongCalls)
238 .Case(
"audio", HasAudio)
248 {{
"hexagonv5"}, {
"5"}}, {{
"hexagonv55"}, {
"55"}},
249 {{
"hexagonv60"}, {
"60"}}, {{
"hexagonv62"}, {
"62"}},
250 {{
"hexagonv65"}, {
"65"}}, {{
"hexagonv66"}, {
"66"}},
251 {{
"hexagonv67"}, {
"67"}}, {{
"hexagonv67t"}, {
"67t"}},
252 {{
"hexagonv68"}, {
"68"}}, {{
"hexagonv69"}, {
"69"}},
253 {{
"hexagonv71"}, {
"71"}}, {{
"hexagonv71t"}, {
"71t"}},
254 {{
"hexagonv73"}, {
"73"}}, {{
"hexagonv75"}, {
"75"}},
255 {{
"hexagonv79"}, {
"79"}},
259 StringRef
Arch = Name;
260 Arch.consume_front(
"hexagonv");
261 Arch.consume_back(
"t");
264 if (!
Arch.getAsInteger(0, Val))
275 return Item->
Suffix.data();
281 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
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.