blob: 2f31c3512a1a596ba125e7b09f4f5f4152596037 [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");
Erich Keaneebba5922017-07-21 22:37:03 +000063 }
64
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +000065 if (hasFeature("hvx-length64b")) {
Erich Keaneebba5922017-07-21 22:37:03 +000066 Builder.defineMacro("__HVX__");
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +000067 Builder.defineMacro("__HVX_ARCH__", HVXVersion);
68 Builder.defineMacro("__HVX_LENGTH__", "64");
69 }
70
71 if (hasFeature("hvx-length128b")) {
72 Builder.defineMacro("__HVX__");
73 Builder.defineMacro("__HVX_ARCH__", HVXVersion);
74 Builder.defineMacro("__HVX_LENGTH__", "128");
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -060075 if (DefineHvxDbl)
76 Builder.defineMacro("__HVXDBL__");
77 }
78
79 if (hasFeature("audio")) {
80 Builder.defineMacro("__HEXAGON_AUDIO__");
Erich Keaneebba5922017-07-21 22:37:03 +000081 }
82}
83
84bool HexagonTargetInfo::initFeatureMap(
85 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
86 const std::vector<std::string> &FeaturesVec) const {
Krzysztof Parzyszek6f3effb2020-01-16 14:13:25 -060087 StringRef CPUFeature = CPU;
88 CPUFeature.consume_front("hexagon");
89 Features[CPUFeature] = true;
90
Erich Keaneebba5922017-07-21 22:37:03 +000091 Features["long-calls"] = false;
92
93 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
94}
95
96bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
97 DiagnosticsEngine &Diags) {
98 for (auto &F : Features) {
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +000099 if (F == "+hvx-length64b")
100 HasHVX = HasHVX64B = true;
101 else if (F == "+hvx-length128b")
102 HasHVX = HasHVX128B = true;
103 else if (F.find("+hvxv") != std::string::npos) {
Erich Keaneebba5922017-07-21 22:37:03 +0000104 HasHVX = true;
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +0000105 HVXVersion = F.substr(std::string("+hvxv").length());
106 } else if (F == "-hvx")
107 HasHVX = HasHVX64B = HasHVX128B = false;
108 else if (F == "+long-calls")
Erich Keaneebba5922017-07-21 22:37:03 +0000109 UseLongCalls = true;
110 else if (F == "-long-calls")
111 UseLongCalls = false;
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -0600112 else if (F == "+audio")
113 HasAudio = true;
Erich Keaneebba5922017-07-21 22:37:03 +0000114 }
115 return true;
116}
117
Erich Keaneebba5922017-07-21 22:37:03 +0000118const char *const HexagonTargetInfo::GCCRegNames[] = {
119 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",
120 "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17",
121 "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26",
122 "r27", "r28", "r29", "r30", "r31", "p0", "p1", "p2", "p3",
Krzysztof Parzyszek99f51962019-10-28 15:12:43 -0500123 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp",
124 "r1:0", "r3:2", "r5:4", "r7:6", "r9:8", "r11:10", "r13:12", "r15:14",
125 "r17:16", "r19:18", "r21:20", "r23:22", "r25:24", "r27:26", "r29:28",
126 "r31:30"
Erich Keaneebba5922017-07-21 22:37:03 +0000127};
128
129ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const {
130 return llvm::makeArrayRef(GCCRegNames);
131}
132
133const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
134 {{"sp"}, "r29"},
135 {{"fp"}, "r30"},
136 {{"lr"}, "r31"},
137};
138
139ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
140 return llvm::makeArrayRef(GCCRegAliases);
141}
142
143const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
144#define BUILTIN(ID, TYPE, ATTRS) \
145 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
146#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
147 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr},
Krzysztof Parzyszek6f3effb2020-01-16 14:13:25 -0600148#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
149 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
Erich Keaneebba5922017-07-21 22:37:03 +0000150#include "clang/Basic/BuiltinsHexagon.def"
151};
152
153bool HexagonTargetInfo::hasFeature(StringRef Feature) const {
Krzysztof Parzyszek762dee52018-07-12 18:54:04 +0000154 std::string VS = "hvxv" + HVXVersion;
155 if (Feature == VS)
156 return true;
157
Erich Keaneebba5922017-07-21 22:37:03 +0000158 return llvm::StringSwitch<bool>(Feature)
159 .Case("hexagon", true)
160 .Case("hvx", HasHVX)
Sumanth Gundapaneni57098f52017-10-18 18:10:13 +0000161 .Case("hvx-length64b", HasHVX64B)
162 .Case("hvx-length128b", HasHVX128B)
Erich Keaneebba5922017-07-21 22:37:03 +0000163 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -0600164 .Case("audio", HasAudio)
Erich Keaneebba5922017-07-21 22:37:03 +0000165 .Default(false);
166}
167
Erich Keanee44bdb32018-02-08 23:16:55 +0000168struct CPUSuffix {
169 llvm::StringLiteral Name;
170 llvm::StringLiteral Suffix;
171};
172
173static constexpr CPUSuffix Suffixes[] = {
Krzysztof Parzyszekc12a5912020-01-17 16:29:40 -0600174 {{"hexagonv5"}, {"5"}}, {{"hexagonv55"}, {"55"}},
175 {{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}},
176 {{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}},
177 {{"hexagonv67"}, {"67"}},
Erich Keanee44bdb32018-02-08 23:16:55 +0000178};
179
Erich Keaneebba5922017-07-21 22:37:03 +0000180const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) {
Erich Keanee44bdb32018-02-08 23:16:55 +0000181 const CPUSuffix *Item = llvm::find_if(
182 Suffixes, [Name](const CPUSuffix &S) { return S.Name == Name; });
183 if (Item == std::end(Suffixes))
184 return nullptr;
185 return Item->Suffix.data();
186}
187
188void HexagonTargetInfo::fillValidCPUList(
189 SmallVectorImpl<StringRef> &Values) const {
190 for (const CPUSuffix &Suffix : Suffixes)
191 Values.push_back(Suffix.Name);
Erich Keaneebba5922017-07-21 22:37:03 +0000192}
193
194ArrayRef<Builtin::Info> HexagonTargetInfo::getTargetBuiltins() const {
195 return llvm::makeArrayRef(BuiltinInfo, clang::Hexagon::LastTSBuiltin -
196 Builtin::FirstTSBuiltin);
197}