blob: fcf9e9cff31da6da635eee3db7477639518ac109 [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- Hexagon.cpp - Implement Hexagon target feature support -----------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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 Keaneebba5922017-07-21 22:37:03 +00006//
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
19using namespace clang;
20using namespace clang::targets;
21
22void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
23 MacroBuilder &Builder) const {
24 Builder.defineMacro("__qdsp6__", "1");
25 Builder.defineMacro("__hexagon__", "1");
26
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -060027 // The macro __HVXDBL__ is deprecated.
28 bool DefineHvxDbl = false;
29
Krzysztof Parzyszek57e67062018-10-19 15:36:45 +000030 if (CPU == "hexagonv5") {
Erich Keaneebba5922017-07-21 22:37:03 +000031 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 Parzyszekc12a5912020-01-17 16:29:40 -060043 DefineHvxDbl = true;
Erich Keaneebba5922017-07-21 22:37:03 +000044 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 Parzyszekc12a5912020-01-17 16:29:40 -060049 DefineHvxDbl = true;
Erich Keaneebba5922017-07-21 22:37:03 +000050 Builder.defineMacro("__HEXAGON_V62__");
51 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Krzysztof Parzyszekcc5cd2c2017-12-13 13:48:07 +000052 } else if (CPU == "hexagonv65") {
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -060053 DefineHvxDbl = true;
Krzysztof Parzyszekcc5cd2c2017-12-13 13:48:07 +000054 Builder.defineMacro("__HEXAGON_V65__");
55 Builder.defineMacro("__HEXAGON_ARCH__", "65");
Krzysztof Parzyszek85393b22018-12-05 21:38:35 +000056 } else if (CPU == "hexagonv66") {
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -060057 DefineHvxDbl = true;
Krzysztof Parzyszek85393b22018-12-05 21:38:35 +000058 Builder.defineMacro("__HEXAGON_V66__");
59 Builder.defineMacro("__HEXAGON_ARCH__", "66");
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -060060 } else if (CPU == "hexagonv67") {
61 Builder.defineMacro("__HEXAGON_V67__");
62 Builder.defineMacro("__HEXAGON_ARCH__", "67");
Krzysztof Parzyszek305bf5b2020-01-13 16:07:30 -060063 } else if (CPU == "hexagonv67t") {
64 Builder.defineMacro("__HEXAGON_V67T__");
65 Builder.defineMacro("__HEXAGON_ARCH__", "67");
Erich Keaneebba5922017-07-21 22:37:03 +000066 }
67
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +000068 if (hasFeature("hvx-length64b")) {
Erich Keaneebba5922017-07-21 22:37:03 +000069 Builder.defineMacro("__HVX__");
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +000070 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 Parzyszekc12a5912020-01-17 16:29:40 -060078 if (DefineHvxDbl)
79 Builder.defineMacro("__HVXDBL__");
80 }
81
82 if (hasFeature("audio")) {
83 Builder.defineMacro("__HEXAGON_AUDIO__");
Erich Keaneebba5922017-07-21 22:37:03 +000084 }
Krzysztof Parzyszek305bf5b2020-01-13 16:07:30 -060085
86 std::string NumPhySlots = isTinyCore() ? "3" : "4";
87 Builder.defineMacro("__HEXAGON_PHYSICAL_SLOTS__", NumPhySlots);
Erich Keaneebba5922017-07-21 22:37:03 +000088}
89
90bool HexagonTargetInfo::initFeatureMap(
91 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
92 const std::vector<std::string> &FeaturesVec) const {
Krzysztof Parzyszek305bf5b2020-01-13 16:07:30 -060093 if (isTinyCore())
94 Features["audio"] = true;
95
Krzysztof Parzyszek6f3effb2020-01-16 14:13:25 -060096 StringRef CPUFeature = CPU;
97 CPUFeature.consume_front("hexagon");
Krzysztof Parzyszek305bf5b2020-01-13 16:07:30 -060098 CPUFeature.consume_back("t");
Krzysztof Parzyszek6f3effb2020-01-16 14:13:25 -060099 Features[CPUFeature] = true;
100
Erich Keaneebba5922017-07-21 22:37:03 +0000101 Features["long-calls"] = false;
102
103 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
104}
105
106bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
107 DiagnosticsEngine &Diags) {
108 for (auto &F : Features) {
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +0000109 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 Keaneebba5922017-07-21 22:37:03 +0000114 HasHVX = true;
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +0000115 HVXVersion = F.substr(std::string("+hvxv").length());
116 } else if (F == "-hvx")
117 HasHVX = HasHVX64B = HasHVX128B = false;
118 else if (F == "+long-calls")
Erich Keaneebba5922017-07-21 22:37:03 +0000119 UseLongCalls = true;
120 else if (F == "-long-calls")
121 UseLongCalls = false;
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -0600122 else if (F == "+audio")
123 HasAudio = true;
Erich Keaneebba5922017-07-21 22:37:03 +0000124 }
125 return true;
126}
127
Erich Keaneebba5922017-07-21 22:37:03 +0000128const 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 Parzyszek99f51962019-10-28 15:12:43 -0500133 "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 Keaneebba5922017-07-21 22:37:03 +0000137};
138
139ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const {
140 return llvm::makeArrayRef(GCCRegNames);
141}
142
143const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
144 {{"sp"}, "r29"},
145 {{"fp"}, "r30"},
146 {{"lr"}, "r31"},
147};
148
149ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
150 return llvm::makeArrayRef(GCCRegAliases);
151}
152
153const 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 Parzyszek6f3effb2020-01-16 14:13:25 -0600158#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
159 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
Erich Keaneebba5922017-07-21 22:37:03 +0000160#include "clang/Basic/BuiltinsHexagon.def"
161};
162
163bool HexagonTargetInfo::hasFeature(StringRef Feature) const {
Krzysztof Parzyszek762dee52018-07-12 18:54:04 +0000164 std::string VS = "hvxv" + HVXVersion;
165 if (Feature == VS)
166 return true;
167
Erich Keaneebba5922017-07-21 22:37:03 +0000168 return llvm::StringSwitch<bool>(Feature)
169 .Case("hexagon", true)
170 .Case("hvx", HasHVX)
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +0000171 .Case("hvx-length64b", HasHVX64B)
172 .Case("hvx-length128b", HasHVX128B)
Erich Keaneebba5922017-07-21 22:37:03 +0000173 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -0600174 .Case("audio", HasAudio)
Erich Keaneebba5922017-07-21 22:37:03 +0000175 .Default(false);
176}
177
Erich Keanee44bdb32018-02-08 23:16:55 +0000178struct CPUSuffix {
179 llvm::StringLiteral Name;
180 llvm::StringLiteral Suffix;
181};
182
183static constexpr CPUSuffix Suffixes[] = {
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -0600184 {{"hexagonv5"}, {"5"}}, {{"hexagonv55"}, {"55"}},
185 {{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}},
186 {{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}},
Krzysztof Parzyszek305bf5b2020-01-13 16:07:30 -0600187 {{"hexagonv67"}, {"67"}}, {{"hexagonv67t"}, {"67t"}},
Erich Keanee44bdb32018-02-08 23:16:55 +0000188};
189
Erich Keaneebba5922017-07-21 22:37:03 +0000190const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) {
Erich Keanee44bdb32018-02-08 23:16:55 +0000191 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
198void HexagonTargetInfo::fillValidCPUList(
199 SmallVectorImpl<StringRef> &Values) const {
200 for (const CPUSuffix &Suffix : Suffixes)
201 Values.push_back(Suffix.Name);
Erich Keaneebba5922017-07-21 22:37:03 +0000202}
203
204ArrayRef<Builtin::Info> HexagonTargetInfo::getTargetBuiltins() const {
205 return llvm::makeArrayRef(BuiltinInfo, clang::Hexagon::LastTSBuiltin -
206 Builtin::FirstTSBuiltin);
207}