Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 1 | //===--- Hexagon.cpp - Implement Hexagon target feature support -----------===// |
| 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file implements Hexagon TargetInfo objects. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #include "Hexagon.h" |
| 14 | #include "Targets.h" |
| 15 | #include "clang/Basic/MacroBuilder.h" |
| 16 | #include "clang/Basic/TargetBuiltins.h" |
| 17 | #include "llvm/ADT/StringSwitch.h" |
| 18 | |
| 19 | using namespace clang; |
| 20 | using namespace clang::targets; |
| 21 | |
| 22 | void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, |
| 23 | MacroBuilder &Builder) const { |
| 24 | Builder.defineMacro("__qdsp6__", "1"); |
| 25 | Builder.defineMacro("__hexagon__", "1"); |
| 26 | |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 27 | // The macro __HVXDBL__ is deprecated. |
| 28 | bool DefineHvxDbl = false; |
| 29 | |
Krzysztof Parzyszek | 57e6706 | 2018-10-19 15:36:45 +0000 | [diff] [blame] | 30 | if (CPU == "hexagonv5") { |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 31 | Builder.defineMacro("__HEXAGON_V5__"); |
| 32 | Builder.defineMacro("__HEXAGON_ARCH__", "5"); |
| 33 | if (Opts.HexagonQdsp6Compat) { |
| 34 | Builder.defineMacro("__QDSP6_V5__"); |
| 35 | Builder.defineMacro("__QDSP6_ARCH__", "5"); |
| 36 | } |
| 37 | } else if (CPU == "hexagonv55") { |
| 38 | Builder.defineMacro("__HEXAGON_V55__"); |
| 39 | Builder.defineMacro("__HEXAGON_ARCH__", "55"); |
| 40 | Builder.defineMacro("__QDSP6_V55__"); |
| 41 | Builder.defineMacro("__QDSP6_ARCH__", "55"); |
| 42 | } else if (CPU == "hexagonv60") { |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 43 | DefineHvxDbl = true; |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 44 | Builder.defineMacro("__HEXAGON_V60__"); |
| 45 | Builder.defineMacro("__HEXAGON_ARCH__", "60"); |
| 46 | Builder.defineMacro("__QDSP6_V60__"); |
| 47 | Builder.defineMacro("__QDSP6_ARCH__", "60"); |
| 48 | } else if (CPU == "hexagonv62") { |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 49 | DefineHvxDbl = true; |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 50 | Builder.defineMacro("__HEXAGON_V62__"); |
| 51 | Builder.defineMacro("__HEXAGON_ARCH__", "62"); |
Krzysztof Parzyszek | cc5cd2c | 2017-12-13 13:48:07 +0000 | [diff] [blame] | 52 | } else if (CPU == "hexagonv65") { |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 53 | DefineHvxDbl = true; |
Krzysztof Parzyszek | cc5cd2c | 2017-12-13 13:48:07 +0000 | [diff] [blame] | 54 | Builder.defineMacro("__HEXAGON_V65__"); |
| 55 | Builder.defineMacro("__HEXAGON_ARCH__", "65"); |
Krzysztof Parzyszek | 85393b2 | 2018-12-05 21:38:35 +0000 | [diff] [blame] | 56 | } else if (CPU == "hexagonv66") { |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 57 | DefineHvxDbl = true; |
Krzysztof Parzyszek | 85393b2 | 2018-12-05 21:38:35 +0000 | [diff] [blame] | 58 | Builder.defineMacro("__HEXAGON_V66__"); |
| 59 | Builder.defineMacro("__HEXAGON_ARCH__", "66"); |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 60 | } else if (CPU == "hexagonv67") { |
| 61 | Builder.defineMacro("__HEXAGON_V67__"); |
| 62 | Builder.defineMacro("__HEXAGON_ARCH__", "67"); |
Krzysztof Parzyszek | 305bf5b | 2020-01-13 16:07:30 -0600 | [diff] [blame] | 63 | } else if (CPU == "hexagonv67t") { |
| 64 | Builder.defineMacro("__HEXAGON_V67T__"); |
| 65 | Builder.defineMacro("__HEXAGON_ARCH__", "67"); |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 66 | } |
| 67 | |
Sumanth Gundapaneni | 57098f5 | 2017-10-18 18:10:13 +0000 | [diff] [blame] | 68 | if (hasFeature("hvx-length64b")) { |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 69 | Builder.defineMacro("__HVX__"); |
Sumanth Gundapaneni | 57098f5 | 2017-10-18 18:10:13 +0000 | [diff] [blame] | 70 | Builder.defineMacro("__HVX_ARCH__", HVXVersion); |
| 71 | Builder.defineMacro("__HVX_LENGTH__", "64"); |
| 72 | } |
| 73 | |
| 74 | if (hasFeature("hvx-length128b")) { |
| 75 | Builder.defineMacro("__HVX__"); |
| 76 | Builder.defineMacro("__HVX_ARCH__", HVXVersion); |
| 77 | Builder.defineMacro("__HVX_LENGTH__", "128"); |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 78 | if (DefineHvxDbl) |
| 79 | Builder.defineMacro("__HVXDBL__"); |
| 80 | } |
| 81 | |
| 82 | if (hasFeature("audio")) { |
| 83 | Builder.defineMacro("__HEXAGON_AUDIO__"); |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 84 | } |
Krzysztof Parzyszek | 305bf5b | 2020-01-13 16:07:30 -0600 | [diff] [blame] | 85 | |
| 86 | std::string NumPhySlots = isTinyCore() ? "3" : "4"; |
| 87 | Builder.defineMacro("__HEXAGON_PHYSICAL_SLOTS__", NumPhySlots); |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 88 | } |
| 89 | |
| 90 | bool HexagonTargetInfo::initFeatureMap( |
| 91 | llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU, |
| 92 | const std::vector<std::string> &FeaturesVec) const { |
Krzysztof Parzyszek | 305bf5b | 2020-01-13 16:07:30 -0600 | [diff] [blame] | 93 | if (isTinyCore()) |
| 94 | Features["audio"] = true; |
| 95 | |
Krzysztof Parzyszek | 6f3effb | 2020-01-16 14:13:25 -0600 | [diff] [blame] | 96 | StringRef CPUFeature = CPU; |
| 97 | CPUFeature.consume_front("hexagon"); |
Krzysztof Parzyszek | 305bf5b | 2020-01-13 16:07:30 -0600 | [diff] [blame] | 98 | CPUFeature.consume_back("t"); |
Krzysztof Parzyszek | 6f3effb | 2020-01-16 14:13:25 -0600 | [diff] [blame] | 99 | Features[CPUFeature] = true; |
| 100 | |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 101 | Features["long-calls"] = false; |
| 102 | |
| 103 | return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); |
| 104 | } |
| 105 | |
| 106 | bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, |
| 107 | DiagnosticsEngine &Diags) { |
| 108 | for (auto &F : Features) { |
Sumanth Gundapaneni | 57098f5 | 2017-10-18 18:10:13 +0000 | [diff] [blame] | 109 | if (F == "+hvx-length64b") |
| 110 | HasHVX = HasHVX64B = true; |
| 111 | else if (F == "+hvx-length128b") |
| 112 | HasHVX = HasHVX128B = true; |
| 113 | else if (F.find("+hvxv") != std::string::npos) { |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 114 | HasHVX = true; |
Sumanth Gundapaneni | 57098f5 | 2017-10-18 18:10:13 +0000 | [diff] [blame] | 115 | HVXVersion = F.substr(std::string("+hvxv").length()); |
| 116 | } else if (F == "-hvx") |
| 117 | HasHVX = HasHVX64B = HasHVX128B = false; |
| 118 | else if (F == "+long-calls") |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 119 | UseLongCalls = true; |
| 120 | else if (F == "-long-calls") |
| 121 | UseLongCalls = false; |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 122 | else if (F == "+audio") |
| 123 | HasAudio = true; |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 124 | } |
| 125 | return true; |
| 126 | } |
| 127 | |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 128 | const char *const HexagonTargetInfo::GCCRegNames[] = { |
| 129 | "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", |
| 130 | "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", |
| 131 | "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", |
| 132 | "r27", "r28", "r29", "r30", "r31", "p0", "p1", "p2", "p3", |
Krzysztof Parzyszek | 99f5196 | 2019-10-28 15:12:43 -0500 | [diff] [blame] | 133 | "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp", |
| 134 | "r1:0", "r3:2", "r5:4", "r7:6", "r9:8", "r11:10", "r13:12", "r15:14", |
| 135 | "r17:16", "r19:18", "r21:20", "r23:22", "r25:24", "r27:26", "r29:28", |
| 136 | "r31:30" |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 137 | }; |
| 138 | |
| 139 | ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const { |
| 140 | return llvm::makeArrayRef(GCCRegNames); |
| 141 | } |
| 142 | |
| 143 | const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = { |
| 144 | {{"sp"}, "r29"}, |
| 145 | {{"fp"}, "r30"}, |
| 146 | {{"lr"}, "r31"}, |
| 147 | }; |
| 148 | |
| 149 | ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const { |
| 150 | return llvm::makeArrayRef(GCCRegAliases); |
| 151 | } |
| 152 | |
| 153 | const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = { |
| 154 | #define BUILTIN(ID, TYPE, ATTRS) \ |
| 155 | {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, |
| 156 | #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ |
| 157 | {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, |
Krzysztof Parzyszek | 6f3effb | 2020-01-16 14:13:25 -0600 | [diff] [blame] | 158 | #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ |
| 159 | {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 160 | #include "clang/Basic/BuiltinsHexagon.def" |
| 161 | }; |
| 162 | |
| 163 | bool HexagonTargetInfo::hasFeature(StringRef Feature) const { |
Krzysztof Parzyszek | 762dee5 | 2018-07-12 18:54:04 +0000 | [diff] [blame] | 164 | std::string VS = "hvxv" + HVXVersion; |
| 165 | if (Feature == VS) |
| 166 | return true; |
| 167 | |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 168 | return llvm::StringSwitch<bool>(Feature) |
| 169 | .Case("hexagon", true) |
| 170 | .Case("hvx", HasHVX) |
Sumanth Gundapaneni | 57098f5 | 2017-10-18 18:10:13 +0000 | [diff] [blame] | 171 | .Case("hvx-length64b", HasHVX64B) |
| 172 | .Case("hvx-length128b", HasHVX128B) |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 173 | .Case("long-calls", UseLongCalls) |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 174 | .Case("audio", HasAudio) |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 175 | .Default(false); |
| 176 | } |
| 177 | |
Erich Keane | e44bdb3 | 2018-02-08 23:16:55 +0000 | [diff] [blame] | 178 | struct CPUSuffix { |
| 179 | llvm::StringLiteral Name; |
| 180 | llvm::StringLiteral Suffix; |
| 181 | }; |
| 182 | |
| 183 | static constexpr CPUSuffix Suffixes[] = { |
Krzysztof Parzyszek | c12a591 | 2020-01-17 16:29:40 -0600 | [diff] [blame] | 184 | {{"hexagonv5"}, {"5"}}, {{"hexagonv55"}, {"55"}}, |
| 185 | {{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}}, |
| 186 | {{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}}, |
Krzysztof Parzyszek | 305bf5b | 2020-01-13 16:07:30 -0600 | [diff] [blame] | 187 | {{"hexagonv67"}, {"67"}}, {{"hexagonv67t"}, {"67t"}}, |
Erich Keane | e44bdb3 | 2018-02-08 23:16:55 +0000 | [diff] [blame] | 188 | }; |
| 189 | |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 190 | const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) { |
Erich Keane | e44bdb3 | 2018-02-08 23:16:55 +0000 | [diff] [blame] | 191 | const CPUSuffix *Item = llvm::find_if( |
| 192 | Suffixes, [Name](const CPUSuffix &S) { return S.Name == Name; }); |
| 193 | if (Item == std::end(Suffixes)) |
| 194 | return nullptr; |
| 195 | return Item->Suffix.data(); |
| 196 | } |
| 197 | |
| 198 | void HexagonTargetInfo::fillValidCPUList( |
| 199 | SmallVectorImpl<StringRef> &Values) const { |
| 200 | for (const CPUSuffix &Suffix : Suffixes) |
| 201 | Values.push_back(Suffix.Name); |
Erich Keane | ebba592 | 2017-07-21 22:37:03 +0000 | [diff] [blame] | 202 | } |
| 203 | |
| 204 | ArrayRef<Builtin::Info> HexagonTargetInfo::getTargetBuiltins() const { |
| 205 | return llvm::makeArrayRef(BuiltinInfo, clang::Hexagon::LastTSBuiltin - |
| 206 | Builtin::FirstTSBuiltin); |
| 207 | } |