Skip to content

Commit c2b89fc

Browse files
authored
[Hexagon] Add V79 support to compiler and assembler (#120983)
This patch introduces support for the Hexagon V79 architecture. It includes instruction formats, definitions, encodings, scheduling classes, and builtins/intrinsics. It also adds missing Hexagon v73 builtins to clang.
1 parent 2ce168b commit c2b89fc

File tree

22 files changed

+2179
-21
lines changed

22 files changed

+2179
-21
lines changed

clang/include/clang/Basic/BuiltinsHexagon.def

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
# define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS)
1818
#endif
1919

20+
#pragma push_macro("V79")
21+
#define V79 "v79"
2022
#pragma push_macro("V75")
21-
#define V75 "v75"
23+
#define V75 "v75|" V79
2224
#pragma push_macro("V73")
2325
#define V73 "v73|" V75
2426
#pragma push_macro("V71")
@@ -42,8 +44,10 @@
4244
#pragma push_macro("V5")
4345
#define V5 "v5|" V55
4446

47+
#pragma push_macro("HVXV79")
48+
#define HVXV79 "hvxv79"
4549
#pragma push_macro("HVXV75")
46-
#define HVXV75 "hvxv75"
50+
#define HVXV75 "hvxv75|" HVXV79
4751
#pragma push_macro("HVXV73")
4852
#define HVXV73 "hvxv73|" HVXV75
4953
#pragma push_macro("HVXV71")
@@ -148,6 +152,7 @@ TARGET_BUILTIN(__builtin_HEXAGON_V6_vrmpyub_rtt_acc_128B,"V64iV64iV32iLLi","", "
148152
#pragma pop_macro("HVXV71")
149153
#pragma pop_macro("HVXV73")
150154
#pragma pop_macro("HVXV75")
155+
#pragma pop_macro("HVXV79")
151156

152157
#pragma pop_macro("V5")
153158
#pragma pop_macro("V55")
@@ -161,6 +166,7 @@ TARGET_BUILTIN(__builtin_HEXAGON_V6_vrmpyub_rtt_acc_128B,"V64iV64iV32iLLi","", "
161166
#pragma pop_macro("V71")
162167
#pragma pop_macro("V73")
163168
#pragma pop_macro("V75")
169+
#pragma pop_macro("V79")
164170

165171
#undef BUILTIN
166172
#undef TARGET_BUILTIN

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6226,6 +6226,8 @@ def mv73 : Flag<["-"], "mv73">, Group<m_hexagon_Features_Group>,
62266226
Alias<mcpu_EQ>, AliasArgs<["hexagonv73"]>;
62276227
def mv75 : Flag<["-"], "mv75">, Group<m_hexagon_Features_Group>,
62286228
Alias<mcpu_EQ>, AliasArgs<["hexagonv75"]>;
6229+
def mv79 : Flag<["-"], "mv79">, Group<m_hexagon_Features_Group>,
6230+
Alias<mcpu_EQ>, AliasArgs<["hexagonv79"]>;
62296231
def mhexagon_hvx : Flag<["-"], "mhvx">, Group<m_hexagon_Features_HVX_Group>,
62306232
HelpText<"Enable Hexagon Vector eXtensions">;
62316233
def mhexagon_hvx_EQ : Joined<["-"], "mhvx=">,

clang/lib/Basic/Targets/Hexagon.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
8181
} else if (CPU == "hexagonv75") {
8282
Builder.defineMacro("__HEXAGON_V75__");
8383
Builder.defineMacro("__HEXAGON_ARCH__", "75");
84+
} else if (CPU == "hexagonv79") {
85+
Builder.defineMacro("__HEXAGON_V79__");
86+
Builder.defineMacro("__HEXAGON_ARCH__", "79");
8487
}
8588

8689
if (hasFeature("hvx-length64b")) {
@@ -239,6 +242,7 @@ static constexpr CPUSuffix Suffixes[] = {
239242
{{"hexagonv68"}, {"68"}}, {{"hexagonv69"}, {"69"}},
240243
{{"hexagonv71"}, {"71"}}, {{"hexagonv71t"}, {"71t"}},
241244
{{"hexagonv73"}, {"73"}}, {{"hexagonv75"}, {"75"}},
245+
{{"hexagonv79"}, {"79"}},
242246
};
243247

244248
std::optional<unsigned> HexagonTargetInfo::getHexagonCPURev(StringRef Name) {

clang/lib/Headers/hvx_hexagon_protos.h

Lines changed: 427 additions & 0 deletions
Large diffs are not rendered by default.

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,13 @@
159159
// CHECK240: "-cc1" {{.*}} "-target-cpu" "hexagonv75"
160160
// CHECK240: hexagon-link{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon/lib/v75/crt0
161161

162+
// RUN: not %clang -### --target=hexagon-unknown-elf \
163+
// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \
164+
// RUN: -mcpu=hexagonv79 -fuse-ld=hexagon-link \
165+
// RUN: %s 2>&1 | FileCheck -check-prefix=CHECK250 %s
166+
// CHECK250: "-cc1" {{.*}} "-target-cpu" "hexagonv79"
167+
// CHECK250: hexagon-link{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon/lib/v79/crt0
168+
162169
// -----------------------------------------------------------------------------
163170
// Test Linker related args
164171
// -----------------------------------------------------------------------------

clang/test/Misc/target-invalid-cpu-note/hexagon.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@
1919
// CHECK-SAME: {{^}}, hexagonv71t
2020
// CHECK-SAME: {{^}}, hexagonv73
2121
// CHECK-SAME: {{^}}, hexagonv75
22+
// CHECK-SAME: {{^}}, hexagonv79
2223
// CHECK-SAME: {{$}}

clang/test/Preprocessor/hexagon-predefines.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,23 @@
154154
// CHECK-V75HVX-128B: #define __HVX__ 1
155155
// CHECK-V75HVX-128B: #define __hexagon__ 1
156156

157+
// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv79 %s\
158+
// RUN: | FileCheck %s -check-prefix CHECK-V79
159+
// CHECK-V79: #define __HEXAGON_ARCH__ 79
160+
// CHECK-V79: #define __HEXAGON_PHYSICAL_SLOTS__ 4
161+
// CHECK-V79: #define __HEXAGON_V79__ 1
162+
// CHECK-V79: #define __hexagon__ 1
163+
164+
// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv79 \
165+
// RUN: -target-feature +hvxv79 -target-feature +hvx-length128b %s | FileCheck \
166+
// RUN: %s -check-prefix CHECK-V79HVX-128B
167+
// CHECK-V79HVX-128B: #define __HEXAGON_ARCH__ 79
168+
// CHECK-V79HVX-128B: #define __HEXAGON_V79__ 1
169+
// CHECK-V79HVX-128B: #define __HVX_ARCH__ 79
170+
// CHECK-V79HVX-128B: #define __HVX_LENGTH__ 128
171+
// CHECK-V79HVX-128B: #define __HVX__ 1
172+
// CHECK-V79HVX-128B: #define __hexagon__ 1
173+
157174
// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv67 \
158175
// RUN: -target-feature +hvxv67 -target-feature +hvx-length128b %s | FileCheck \
159176
// RUN: %s -check-prefix CHECK-ELF

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ enum {
630630
EF_HEXAGON_MACH_V71T = 0x00008071, // Hexagon V71T
631631
EF_HEXAGON_MACH_V73 = 0x00000073, // Hexagon V73
632632
EF_HEXAGON_MACH_V75 = 0x00000075, // Hexagon V75
633+
EF_HEXAGON_MACH_V79 = 0x00000079, // Hexagon V79
633634
EF_HEXAGON_MACH = 0x000003ff, // Hexagon V..
634635

635636
// Highest ISA version flags
@@ -650,6 +651,7 @@ enum {
650651
EF_HEXAGON_ISA_V71 = 0x00000071, // Hexagon V71 ISA
651652
EF_HEXAGON_ISA_V73 = 0x00000073, // Hexagon V73 ISA
652653
EF_HEXAGON_ISA_V75 = 0x00000075, // Hexagon V75 ISA
654+
EF_HEXAGON_ISA_V79 = 0x00000079, // Hexagon V79 ISA
653655
EF_HEXAGON_ISA = 0x000003ff, // Hexagon V.. ISA
654656
};
655657

llvm/include/llvm/IR/IntrinsicsHexagonDep.td

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6705,3 +6705,130 @@ Hexagon_v32i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vsub_sf_bf">;
67056705
def int_hexagon_V6_vsub_sf_bf_128B :
67066706
Hexagon_v64i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vsub_sf_bf_128B">;
67076707

6708+
// V79 HVX Instructions.
6709+
6710+
def int_hexagon_V6_get_qfext :
6711+
Hexagon_v16i32_v16i32i32_Intrinsic<"HEXAGON_V6_get_qfext">;
6712+
6713+
def int_hexagon_V6_get_qfext_128B :
6714+
Hexagon_v32i32_v32i32i32_Intrinsic<"HEXAGON_V6_get_qfext_128B">;
6715+
6716+
def int_hexagon_V6_get_qfext_oracc :
6717+
Hexagon_v16i32_v16i32v16i32i32_Intrinsic<"HEXAGON_V6_get_qfext_oracc">;
6718+
6719+
def int_hexagon_V6_get_qfext_oracc_128B :
6720+
Hexagon_v32i32_v32i32v32i32i32_Intrinsic<"HEXAGON_V6_get_qfext_oracc_128B">;
6721+
6722+
def int_hexagon_V6_set_qfext :
6723+
Hexagon_v16i32_v16i32i32_Intrinsic<"HEXAGON_V6_set_qfext">;
6724+
6725+
def int_hexagon_V6_set_qfext_128B :
6726+
Hexagon_v32i32_v32i32i32_Intrinsic<"HEXAGON_V6_set_qfext_128B">;
6727+
6728+
def int_hexagon_V6_vabs_f8 :
6729+
Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vabs_f8">;
6730+
6731+
def int_hexagon_V6_vabs_f8_128B :
6732+
Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vabs_f8_128B">;
6733+
6734+
def int_hexagon_V6_vadd_hf_f8 :
6735+
Hexagon_v32i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vadd_hf_f8">;
6736+
6737+
def int_hexagon_V6_vadd_hf_f8_128B :
6738+
Hexagon_v64i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vadd_hf_f8_128B">;
6739+
6740+
def int_hexagon_V6_vcvt2_b_hf :
6741+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vcvt2_b_hf">;
6742+
6743+
def int_hexagon_V6_vcvt2_b_hf_128B :
6744+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vcvt2_b_hf_128B">;
6745+
6746+
def int_hexagon_V6_vcvt2_hf_b :
6747+
Hexagon_v32i32_v16i32_Intrinsic<"HEXAGON_V6_vcvt2_hf_b">;
6748+
6749+
def int_hexagon_V6_vcvt2_hf_b_128B :
6750+
Hexagon_v64i32_v32i32_Intrinsic<"HEXAGON_V6_vcvt2_hf_b_128B">;
6751+
6752+
def int_hexagon_V6_vcvt2_hf_ub :
6753+
Hexagon_v32i32_v16i32_Intrinsic<"HEXAGON_V6_vcvt2_hf_ub">;
6754+
6755+
def int_hexagon_V6_vcvt2_hf_ub_128B :
6756+
Hexagon_v64i32_v32i32_Intrinsic<"HEXAGON_V6_vcvt2_hf_ub_128B">;
6757+
6758+
def int_hexagon_V6_vcvt2_ub_hf :
6759+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vcvt2_ub_hf">;
6760+
6761+
def int_hexagon_V6_vcvt2_ub_hf_128B :
6762+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vcvt2_ub_hf_128B">;
6763+
6764+
def int_hexagon_V6_vcvt_f8_hf :
6765+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vcvt_f8_hf">;
6766+
6767+
def int_hexagon_V6_vcvt_f8_hf_128B :
6768+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vcvt_f8_hf_128B">;
6769+
6770+
def int_hexagon_V6_vcvt_hf_f8 :
6771+
Hexagon_v32i32_v16i32_Intrinsic<"HEXAGON_V6_vcvt_hf_f8">;
6772+
6773+
def int_hexagon_V6_vcvt_hf_f8_128B :
6774+
Hexagon_v64i32_v32i32_Intrinsic<"HEXAGON_V6_vcvt_hf_f8_128B">;
6775+
6776+
def int_hexagon_V6_vfmax_f8 :
6777+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vfmax_f8">;
6778+
6779+
def int_hexagon_V6_vfmax_f8_128B :
6780+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vfmax_f8_128B">;
6781+
6782+
def int_hexagon_V6_vfmin_f8 :
6783+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vfmin_f8">;
6784+
6785+
def int_hexagon_V6_vfmin_f8_128B :
6786+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vfmin_f8_128B">;
6787+
6788+
def int_hexagon_V6_vfneg_f8 :
6789+
Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vfneg_f8">;
6790+
6791+
def int_hexagon_V6_vfneg_f8_128B :
6792+
Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vfneg_f8_128B">;
6793+
6794+
def int_hexagon_V6_vmerge_qf :
6795+
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vmerge_qf">;
6796+
6797+
def int_hexagon_V6_vmerge_qf_128B :
6798+
Hexagon_v32i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vmerge_qf_128B">;
6799+
6800+
def int_hexagon_V6_vmpy_hf_f8 :
6801+
Hexagon_v32i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vmpy_hf_f8">;
6802+
6803+
def int_hexagon_V6_vmpy_hf_f8_128B :
6804+
Hexagon_v64i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vmpy_hf_f8_128B">;
6805+
6806+
def int_hexagon_V6_vmpy_hf_f8_acc :
6807+
Hexagon_v32i32_v32i32v16i32v16i32_Intrinsic<"HEXAGON_V6_vmpy_hf_f8_acc">;
6808+
6809+
def int_hexagon_V6_vmpy_hf_f8_acc_128B :
6810+
Hexagon_v64i32_v64i32v32i32v32i32_Intrinsic<"HEXAGON_V6_vmpy_hf_f8_acc_128B">;
6811+
6812+
def int_hexagon_V6_vmpy_rt_hf :
6813+
Hexagon_v16i32_v16i32i32_Intrinsic<"HEXAGON_V6_vmpy_rt_hf">;
6814+
6815+
def int_hexagon_V6_vmpy_rt_hf_128B :
6816+
Hexagon_v32i32_v32i32i32_Intrinsic<"HEXAGON_V6_vmpy_rt_hf_128B">;
6817+
6818+
def int_hexagon_V6_vmpy_rt_qf16 :
6819+
Hexagon_v16i32_v16i32i32_Intrinsic<"HEXAGON_V6_vmpy_rt_qf16">;
6820+
6821+
def int_hexagon_V6_vmpy_rt_qf16_128B :
6822+
Hexagon_v32i32_v32i32i32_Intrinsic<"HEXAGON_V6_vmpy_rt_qf16_128B">;
6823+
6824+
def int_hexagon_V6_vmpy_rt_sf :
6825+
Hexagon_v16i32_v16i32i32_Intrinsic<"HEXAGON_V6_vmpy_rt_sf">;
6826+
6827+
def int_hexagon_V6_vmpy_rt_sf_128B :
6828+
Hexagon_v32i32_v32i32i32_Intrinsic<"HEXAGON_V6_vmpy_rt_sf_128B">;
6829+
6830+
def int_hexagon_V6_vsub_hf_f8 :
6831+
Hexagon_v32i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vsub_hf_f8">;
6832+
6833+
def int_hexagon_V6_vsub_hf_f8_128B :
6834+
Hexagon_v64i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vsub_hf_f8_128B">;

llvm/lib/Target/Hexagon/Hexagon.td

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ def ExtensionHVXV75: SubtargetFeature<"hvxv75", "HexagonHVXVersion",
7373
ExtensionHVXV67, ExtensionHVXV68, ExtensionHVXV69, ExtensionHVXV71,
7474
ExtensionHVXV73]>;
7575

76+
def ExtensionHVXV79: SubtargetFeature<"hvxv79", "HexagonHVXVersion",
77+
"Hexagon::ArchEnum::V79", "Hexagon HVX instructions",
78+
[ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65, ExtensionHVXV66,
79+
ExtensionHVXV67, ExtensionHVXV68, ExtensionHVXV69, ExtensionHVXV71,
80+
ExtensionHVXV73, ExtensionHVXV75]>;
81+
7682
def ExtensionHVX64B: SubtargetFeature<"hvx-length64b", "UseHVX64BOps",
7783
"true", "Hexagon HVX 64B instructions", [ExtensionHVX]>;
7884
def ExtensionHVX128B: SubtargetFeature<"hvx-length128b", "UseHVX128BOps",
@@ -145,6 +151,8 @@ def UseHVXV73 : Predicate<"HST->useHVXV73Ops()">,
145151
AssemblerPredicate<(all_of ExtensionHVXV73)>;
146152
def UseHVXV75 : Predicate<"HST->useHVXV75Ops()">,
147153
AssemblerPredicate<(all_of ExtensionHVXV75)>;
154+
def UseHVXV79 : Predicate<"HST->useHVXV79Ops()">,
155+
AssemblerPredicate<(all_of ExtensionHVXV79)>;
148156
def UseAudio : Predicate<"HST->useAudioOps()">,
149157
AssemblerPredicate<(all_of ExtensionAudio)>;
150158
def UseZReg : Predicate<"HST->useZRegOps()">,
@@ -475,6 +483,11 @@ def : Proc<"hexagonv75", HexagonModelV75,
475483
ArchV68, ArchV69, ArchV71, ArchV73, ArchV75, FeatureCompound,
476484
FeatureDuplex, FeatureMemNoShuf, FeatureMemops, FeatureNVJ,
477485
FeatureNVS, FeaturePackets, FeatureSmallData]>;
486+
def : Proc<"hexagonv79", HexagonModelV79,
487+
[ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
488+
ArchV68, ArchV69, ArchV71, ArchV73, ArchV75, ArchV79,
489+
FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
490+
FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData]>;
478491

479492
// Need to update the correct features for tiny core.
480493
// 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
@@ -28,7 +28,8 @@ enum class ArchEnum {
2828
V69,
2929
V71,
3030
V73,
31-
V75
31+
V75,
32+
V79
3233
};
3334

3435
inline std::optional<Hexagon::ArchEnum> getCpu(StringRef CPU) {
@@ -48,6 +49,7 @@ inline std::optional<Hexagon::ArchEnum> getCpu(StringRef CPU) {
4849
.Case("hexagonv71t", Hexagon::ArchEnum::V71)
4950
.Case("hexagonv73", Hexagon::ArchEnum::V73)
5051
.Case("hexagonv75", Hexagon::ArchEnum::V75)
52+
.Case("hexagonv79", Hexagon::ArchEnum::V79)
5153
.Default(std::nullopt);
5254
}
5355
} // namespace Hexagon

llvm/lib/Target/Hexagon/HexagonDepArch.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ def ArchV73: SubtargetFeature<"v73", "HexagonArchVersion", "Hexagon::ArchEnum::V
3232
def HasV73 : Predicate<"HST->hasV73Ops()">, AssemblerPredicate<(all_of ArchV73)>;
3333
def ArchV75: SubtargetFeature<"v75", "HexagonArchVersion", "Hexagon::ArchEnum::V75", "Enable Hexagon V75 architecture">;
3434
def HasV75 : Predicate<"HST->hasV75Ops()">, AssemblerPredicate<(all_of ArchV75)>;
35+
def ArchV79: SubtargetFeature<"v79", "HexagonArchVersion", "Hexagon::ArchEnum::V79", "Enable Hexagon V79 architecture">;
36+
def HasV79 : Predicate<"HST->hasV79Ops()">, AssemblerPredicate<(all_of ArchV79)>;

0 commit comments

Comments
 (0)