Skip to content

Commit 9603012

Browse files
committed
[Hexagon] Add V81 support to compiler and assembler
This patch introduces support for the Hexagon V81 architecture. It includes instruction formats, definitions, encodings, scheduling classes, and builtins/intrinsics.
1 parent 169626f commit 9603012

File tree

20 files changed

+1680
-21
lines changed

20 files changed

+1680
-21
lines changed

clang/include/clang/Basic/BuiltinsHexagon.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ class V<string version, VFeatures newer> : VFeatures {
2020
let Features = !strconcat("v", version, "|", newer.Features);
2121
}
2222

23-
let Features = "v79" in def V79 : VFeatures;
23+
let Features = "v81" in def V81 : VFeatures;
2424

25+
def V79 : V<"79", V81>;
2526
def V75 : V<"75", V79>;
2627
def V73 : V<"73", V75>;
2728
def V71 : V<"71", V73>;
@@ -43,8 +44,9 @@ class HVXV<string version, HVXVFeatures newer> : HVXVFeatures {
4344
let Features = !strconcat("hvxv", version, "|", newer.Features);
4445
}
4546

46-
let Features = "hvxv79" in def HVXV79 : HVXVFeatures;
47+
let Features = "hvxv81" in def HVXV81 : HVXVFeatures;
4748

49+
def HVXV79 : HVXV<"79", HVXV81>;
4850
def HVXV75 : HVXV<"75", HVXV79>;
4951
def HVXV73 : HVXV<"73", HVXV75>;
5052
def HVXV71 : HVXV<"71", HVXV73>;

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6558,6 +6558,8 @@ def mv75 : Flag<["-"], "mv75">, Group<m_hexagon_Features_Group>,
65586558
Alias<mcpu_EQ>, AliasArgs<["hexagonv75"]>;
65596559
def mv79 : Flag<["-"], "mv79">, Group<m_hexagon_Features_Group>,
65606560
Alias<mcpu_EQ>, AliasArgs<["hexagonv79"]>;
6561+
def mv81 : Flag<["-"], "mv81">, Group<m_hexagon_Features_Group>,
6562+
Alias<mcpu_EQ>, AliasArgs<["hexagonv81"]>;
65616563
def mhexagon_hvx : Flag<["-"], "mhvx">, Group<m_hexagon_Features_HVX_Group>,
65626564
HelpText<"Enable Hexagon Vector eXtensions">;
65636565
def mhexagon_hvx_EQ : Joined<["-"], "mhvx=">,

clang/lib/Basic/Targets/Hexagon.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
8383
} else if (CPU == "hexagonv79") {
8484
Builder.defineMacro("__HEXAGON_V79__");
8585
Builder.defineMacro("__HEXAGON_ARCH__", "79");
86+
} else if (CPU == "hexagonv81") {
87+
Builder.defineMacro("__HEXAGON_V81__");
88+
Builder.defineMacro("__HEXAGON_ARCH__", "81");
8689
}
8790

8891
if (hasFeature("hvx-length64b")) {
@@ -252,8 +255,7 @@ static constexpr CPUSuffix Suffixes[] = {
252255
{{"hexagonv68"}, {"68"}}, {{"hexagonv69"}, {"69"}},
253256
{{"hexagonv71"}, {"71"}}, {{"hexagonv71t"}, {"71t"}},
254257
{{"hexagonv73"}, {"73"}}, {{"hexagonv75"}, {"75"}},
255-
{{"hexagonv79"}, {"79"}},
256-
};
258+
{{"hexagonv79"}, {"79"}}, {{"hexagonv81"}, {"81"}}};
257259

258260
std::optional<unsigned> HexagonTargetInfo::getHexagonCPURev(StringRef Name) {
259261
StringRef Arch = Name;

clang/test/Driver/hexagon-toolchain-elf.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,13 @@
166166
// CHECK250: "-cc1" {{.*}} "-target-cpu" "hexagonv79"
167167
// CHECK250: hexagon-link{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon/lib/v79/crt0
168168

169+
// RUN: not %clang -### --target=hexagon-unknown-elf \
170+
// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
171+
// RUN: -mcpu=hexagonv81 -fuse-ld=hexagon-link \
172+
// RUN: %s 2>&1 | FileCheck -check-prefix=CHECK260 %s
173+
// CHECK260: "-cc1" {{.*}} "-target-cpu" "hexagonv81"
174+
// CHECK260: hexagon-link{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon/lib/v81/crt0
175+
169176
// -----------------------------------------------------------------------------
170177
// Test Linker related args
171178
// -----------------------------------------------------------------------------

clang/test/Preprocessor/hexagon-predefines.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,23 @@
171171
// CHECK-V79HVX-128B: #define __HVX__ 1
172172
// CHECK-V79HVX-128B: #define __hexagon__ 1
173173

174+
// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv81 %s\
175+
// RUN: | FileCheck %s -check-prefix CHECK-V81
176+
// CHECK-V81: #define __HEXAGON_ARCH__ 81
177+
// CHECK-V81: #define __HEXAGON_PHYSICAL_SLOTS__ 4
178+
// CHECK-V81: #define __HEXAGON_V81__ 1
179+
// CHECK-V81: #define __hexagon__ 1
180+
181+
// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv81 \
182+
// RUN: -target-feature +hvxv81 -target-feature +hvx-length128b %s | FileCheck \
183+
// RUN: %s -check-prefix CHECK-V81HVX-128B
184+
// CHECK-V81HVX-128B: #define __HEXAGON_ARCH__ 81
185+
// CHECK-V81HVX-128B: #define __HEXAGON_V81__ 1
186+
// CHECK-V81HVX-128B: #define __HVX_ARCH__ 81
187+
// CHECK-V81HVX-128B: #define __HVX_LENGTH__ 128
188+
// CHECK-V81HVX-128B: #define __HVX__ 1
189+
// CHECK-V81HVX-128B: #define __hexagon__ 1
190+
174191
// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv67 \
175192
// RUN: -target-feature +hvxv67 -target-feature +hvx-length128b %s | FileCheck \
176193
// RUN: %s -check-prefix CHECK-ELF

llvm/include/llvm/IR/IntrinsicsHexagonDep.td

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6832,3 +6832,17 @@ Hexagon_v32i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vsub_hf_f8">;
68326832

68336833
def int_hexagon_V6_vsub_hf_f8_128B :
68346834
Hexagon_v64i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vsub_hf_f8_128B">;
6835+
6836+
// V81 HVX Instructions.
6837+
6838+
def int_hexagon_V6_vsub_hf_mix :
6839+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vsub_hf_mix">;
6840+
6841+
def int_hexagon_V6_vsub_hf_mix_128B :
6842+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vsub_hf_mix_128B">;
6843+
6844+
def int_hexagon_V6_vsub_sf_mix :
6845+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vsub_sf_mix">;
6846+
6847+
def int_hexagon_V6_vsub_sf_mix_128B :
6848+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vsub_sf_mix_128B">;

llvm/lib/Target/Hexagon/Hexagon.td

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@ def ExtensionHVXV79: SubtargetFeature<"hvxv79", "HexagonHVXVersion",
7979
ExtensionHVXV67, ExtensionHVXV68, ExtensionHVXV69, ExtensionHVXV71,
8080
ExtensionHVXV73, ExtensionHVXV75]>;
8181

82+
def ExtensionHVXV81: SubtargetFeature<"hvxv81", "HexagonHVXVersion",
83+
"Hexagon::ArchEnum::V81", "Hexagon HVX instructions",
84+
[ExtensionHVXV65, ExtensionHVXV66, ExtensionHVXV67,
85+
ExtensionHVXV68, ExtensionHVXV69, ExtensionHVXV71,
86+
ExtensionHVXV73, ExtensionHVXV75, ExtensionHVXV79]>;
87+
8288
def ExtensionHVX64B: SubtargetFeature<"hvx-length64b", "UseHVX64BOps",
8389
"true", "Hexagon HVX 64B instructions", [ExtensionHVX]>;
8490
def ExtensionHVX128B: SubtargetFeature<"hvx-length128b", "UseHVX128BOps",
@@ -151,6 +157,8 @@ def UseHVXV75 : Predicate<"HST->useHVXV75Ops()">,
151157
AssemblerPredicate<(all_of ExtensionHVXV75)>;
152158
def UseHVXV79 : Predicate<"HST->useHVXV79Ops()">,
153159
AssemblerPredicate<(all_of ExtensionHVXV79)>;
160+
def UseHVXV81 : Predicate<"HST->useHVXV81Ops()">,
161+
AssemblerPredicate<(all_of ExtensionHVXV81)>;
154162
def UseAudio : Predicate<"HST->useAudioOps()">,
155163
AssemblerPredicate<(all_of ExtensionAudio)>;
156164
def UseZReg : Predicate<"HST->useZRegOps()">,
@@ -488,6 +496,11 @@ def : Proc<"hexagonv79", HexagonModelV79,
488496
ArchV68, ArchV69, ArchV71, ArchV73, ArchV75, ArchV79,
489497
FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
490498
FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData]>;
499+
def : Proc<"hexagonv81", HexagonModelV81,
500+
[ArchV65, ArchV66, ArchV67, ArchV68, ArchV69, ArchV71, ArchV73,
501+
ArchV75, ArchV79, ArchV81,
502+
FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
503+
FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData]>;
491504

492505
// Need to update the correct features for tiny core.
493506
// Disable NewValueJumps since the packetizer is unable to handle a packet with

llvm/lib/Target/Hexagon/HexagonDepArch.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ enum class ArchEnum {
2929
V71,
3030
V73,
3131
V75,
32-
V79
32+
V79,
33+
V81
3334
};
3435

3536
inline std::optional<Hexagon::ArchEnum> getCpu(StringRef CPU) {
@@ -50,6 +51,7 @@ inline std::optional<Hexagon::ArchEnum> getCpu(StringRef CPU) {
5051
.Case("hexagonv73", Hexagon::ArchEnum::V73)
5152
.Case("hexagonv75", Hexagon::ArchEnum::V75)
5253
.Case("hexagonv79", Hexagon::ArchEnum::V79)
54+
.Case("hexagonv81", Hexagon::ArchEnum::V81)
5355
.Default(std::nullopt);
5456
}
5557
} // namespace Hexagon

llvm/lib/Target/Hexagon/HexagonDepArch.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,5 @@ def ArchV75: SubtargetFeature<"v75", "HexagonArchVersion", "Hexagon::ArchEnum::V
3434
def HasV75 : Predicate<"HST->hasV75Ops()">, AssemblerPredicate<(all_of ArchV75)>;
3535
def ArchV79: SubtargetFeature<"v79", "HexagonArchVersion", "Hexagon::ArchEnum::V79", "Enable Hexagon V79 architecture">;
3636
def HasV79 : Predicate<"HST->hasV79Ops()">, AssemblerPredicate<(all_of ArchV79)>;
37+
def ArchV81: SubtargetFeature<"v81", "HexagonArchVersion", "Hexagon::ArchEnum::V81", "Enable Hexagon V81 architecture">;
38+
def HasV81 : Predicate<"HST->hasV81Ops()">, AssemblerPredicate<(all_of ArchV81)>;

0 commit comments

Comments
 (0)