Skip to content

Commit 2db4cf5

Browse files
tmatheson-armtyb-arm
authored andcommitted
clang support for Armv8.8/9.3 HBC
This introduces clang command line support for new Armv8.8-A and Armv9.3-A Hinted Conditional Branches feature, previously introduced into LLVM in https://reviews.llvm.org/D116156. Patch by Tomas Matheson and Son Tuan Vu. Differential Revision: https://reviews.llvm.org/D116939
1 parent d4d0168 commit 2db4cf5

File tree

7 files changed

+89
-77
lines changed

7 files changed

+89
-77
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
543543
HasMatmulFP64 = false;
544544
HasMatmulFP32 = false;
545545
HasLSE = false;
546+
HasHBC = false;
546547

547548
ArchKind = llvm::AArch64::ArchKind::INVALID;
548549

@@ -658,6 +659,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
658659
HasRandGen = true;
659660
if (Feature == "+flagm")
660661
HasFlagM = true;
662+
if (Feature == "+hbc")
663+
HasHBC = true;
661664
}
662665

663666
setDataLayout();

clang/lib/Basic/Targets/AArch64.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
5353
bool HasMatmulFP32;
5454
bool HasLSE;
5555
bool HasFlagM;
56+
bool HasHBC;
5657

5758
llvm::AArch64::ArchKind ArchKind;
5859

clang/test/Driver/aarch64-hbc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Test that target feature hbc is implemented and available correctly
2+
// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+hbc %s 2>&1 | FileCheck %s
3+
// CHECK: "-target-feature" "+hbc"
4+
5+
// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+nohbc %s 2>&1 | FileCheck %s --check-prefix=NO_HBC
6+
// NO_HBC: "-target-feature" "-hbc"

llvm/include/llvm/Support/AArch64TargetParser.def

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -103,47 +103,48 @@ AARCH64_ARCH("armv8-r", ARMV8R, "8-R", "v8r",
103103
#define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE)
104104
#endif
105105
// FIXME: This would be nicer were it tablegen
106-
AARCH64_ARCH_EXT_NAME("invalid", AArch64::AEK_INVALID, nullptr, nullptr)
107-
AARCH64_ARCH_EXT_NAME("none", AArch64::AEK_NONE, nullptr, nullptr)
108-
AARCH64_ARCH_EXT_NAME("crc", AArch64::AEK_CRC, "+crc", "-crc")
109-
AARCH64_ARCH_EXT_NAME("lse", AArch64::AEK_LSE, "+lse", "-lse")
110-
AARCH64_ARCH_EXT_NAME("rdm", AArch64::AEK_RDM, "+rdm", "-rdm")
111-
AARCH64_ARCH_EXT_NAME("crypto", AArch64::AEK_CRYPTO, "+crypto","-crypto")
112-
AARCH64_ARCH_EXT_NAME("sm4", AArch64::AEK_SM4, "+sm4", "-sm4")
113-
AARCH64_ARCH_EXT_NAME("sha3", AArch64::AEK_SHA3, "+sha3", "-sha3")
114-
AARCH64_ARCH_EXT_NAME("sha2", AArch64::AEK_SHA2, "+sha2", "-sha2")
115-
AARCH64_ARCH_EXT_NAME("aes", AArch64::AEK_AES, "+aes", "-aes")
116-
AARCH64_ARCH_EXT_NAME("dotprod", AArch64::AEK_DOTPROD, "+dotprod","-dotprod")
117-
AARCH64_ARCH_EXT_NAME("fp", AArch64::AEK_FP, "+fp-armv8", "-fp-armv8")
118-
AARCH64_ARCH_EXT_NAME("simd", AArch64::AEK_SIMD, "+neon", "-neon")
119-
AARCH64_ARCH_EXT_NAME("fp16", AArch64::AEK_FP16, "+fullfp16", "-fullfp16")
120-
AARCH64_ARCH_EXT_NAME("fp16fml", AArch64::AEK_FP16FML, "+fp16fml", "-fp16fml")
121-
AARCH64_ARCH_EXT_NAME("profile", AArch64::AEK_PROFILE, "+spe", "-spe")
122-
AARCH64_ARCH_EXT_NAME("ras", AArch64::AEK_RAS, "+ras", "-ras")
123-
AARCH64_ARCH_EXT_NAME("sve", AArch64::AEK_SVE, "+sve", "-sve")
124-
AARCH64_ARCH_EXT_NAME("sve2", AArch64::AEK_SVE2, "+sve2", "-sve2")
125-
AARCH64_ARCH_EXT_NAME("sve2-aes", AArch64::AEK_SVE2AES, "+sve2-aes", "-sve2-aes")
126-
AARCH64_ARCH_EXT_NAME("sve2-sm4", AArch64::AEK_SVE2SM4, "+sve2-sm4", "-sve2-sm4")
127-
AARCH64_ARCH_EXT_NAME("sve2-sha3", AArch64::AEK_SVE2SHA3, "+sve2-sha3", "-sve2-sha3")
106+
AARCH64_ARCH_EXT_NAME("invalid", AArch64::AEK_INVALID, nullptr, nullptr)
107+
AARCH64_ARCH_EXT_NAME("none", AArch64::AEK_NONE, nullptr, nullptr)
108+
AARCH64_ARCH_EXT_NAME("crc", AArch64::AEK_CRC, "+crc", "-crc")
109+
AARCH64_ARCH_EXT_NAME("lse", AArch64::AEK_LSE, "+lse", "-lse")
110+
AARCH64_ARCH_EXT_NAME("rdm", AArch64::AEK_RDM, "+rdm", "-rdm")
111+
AARCH64_ARCH_EXT_NAME("crypto", AArch64::AEK_CRYPTO, "+crypto", "-crypto")
112+
AARCH64_ARCH_EXT_NAME("sm4", AArch64::AEK_SM4, "+sm4", "-sm4")
113+
AARCH64_ARCH_EXT_NAME("sha3", AArch64::AEK_SHA3, "+sha3", "-sha3")
114+
AARCH64_ARCH_EXT_NAME("sha2", AArch64::AEK_SHA2, "+sha2", "-sha2")
115+
AARCH64_ARCH_EXT_NAME("aes", AArch64::AEK_AES, "+aes", "-aes")
116+
AARCH64_ARCH_EXT_NAME("dotprod", AArch64::AEK_DOTPROD, "+dotprod", "-dotprod")
117+
AARCH64_ARCH_EXT_NAME("fp", AArch64::AEK_FP, "+fp-armv8", "-fp-armv8")
118+
AARCH64_ARCH_EXT_NAME("simd", AArch64::AEK_SIMD, "+neon", "-neon")
119+
AARCH64_ARCH_EXT_NAME("fp16", AArch64::AEK_FP16, "+fullfp16", "-fullfp16")
120+
AARCH64_ARCH_EXT_NAME("fp16fml", AArch64::AEK_FP16FML, "+fp16fml", "-fp16fml")
121+
AARCH64_ARCH_EXT_NAME("profile", AArch64::AEK_PROFILE, "+spe", "-spe")
122+
AARCH64_ARCH_EXT_NAME("ras", AArch64::AEK_RAS, "+ras", "-ras")
123+
AARCH64_ARCH_EXT_NAME("sve", AArch64::AEK_SVE, "+sve", "-sve")
124+
AARCH64_ARCH_EXT_NAME("sve2", AArch64::AEK_SVE2, "+sve2", "-sve2")
125+
AARCH64_ARCH_EXT_NAME("sve2-aes", AArch64::AEK_SVE2AES, "+sve2-aes", "-sve2-aes")
126+
AARCH64_ARCH_EXT_NAME("sve2-sm4", AArch64::AEK_SVE2SM4, "+sve2-sm4", "-sve2-sm4")
127+
AARCH64_ARCH_EXT_NAME("sve2-sha3", AArch64::AEK_SVE2SHA3, "+sve2-sha3", "-sve2-sha3")
128128
AARCH64_ARCH_EXT_NAME("sve2-bitperm", AArch64::AEK_SVE2BITPERM, "+sve2-bitperm", "-sve2-bitperm")
129-
AARCH64_ARCH_EXT_NAME("rcpc", AArch64::AEK_RCPC, "+rcpc", "-rcpc")
130-
AARCH64_ARCH_EXT_NAME("rng", AArch64::AEK_RAND, "+rand", "-rand")
131-
AARCH64_ARCH_EXT_NAME("memtag", AArch64::AEK_MTE, "+mte", "-mte")
132-
AARCH64_ARCH_EXT_NAME("ssbs", AArch64::AEK_SSBS, "+ssbs", "-ssbs")
133-
AARCH64_ARCH_EXT_NAME("sb", AArch64::AEK_SB, "+sb", "-sb")
134-
AARCH64_ARCH_EXT_NAME("predres", AArch64::AEK_PREDRES, "+predres", "-predres")
135-
AARCH64_ARCH_EXT_NAME("bf16", AArch64::AEK_BF16, "+bf16", "-bf16")
136-
AARCH64_ARCH_EXT_NAME("i8mm", AArch64::AEK_I8MM, "+i8mm", "-i8mm")
137-
AARCH64_ARCH_EXT_NAME("f32mm", AArch64::AEK_F32MM, "+f32mm", "-f32mm")
138-
AARCH64_ARCH_EXT_NAME("f64mm", AArch64::AEK_F64MM, "+f64mm", "-f64mm")
139-
AARCH64_ARCH_EXT_NAME("tme", AArch64::AEK_TME, "+tme", "-tme")
140-
AARCH64_ARCH_EXT_NAME("ls64", AArch64::AEK_LS64, "+ls64", "-ls64")
141-
AARCH64_ARCH_EXT_NAME("brbe", AArch64::AEK_BRBE, "+brbe", "-brbe")
142-
AARCH64_ARCH_EXT_NAME("pauth", AArch64::AEK_PAUTH, "+pauth", "-pauth")
143-
AARCH64_ARCH_EXT_NAME("flagm", AArch64::AEK_FLAGM, "+flagm", "-flagm")
144-
AARCH64_ARCH_EXT_NAME("sme", AArch64::AEK_SME, "+sme", "-sme")
145-
AARCH64_ARCH_EXT_NAME("sme-f64", AArch64::AEK_SMEF64, "+sme-f64", "-sme-f64")
146-
AARCH64_ARCH_EXT_NAME("sme-i64", AArch64::AEK_SMEI64, "+sme-i64", "-sme-i64")
129+
AARCH64_ARCH_EXT_NAME("rcpc", AArch64::AEK_RCPC, "+rcpc", "-rcpc")
130+
AARCH64_ARCH_EXT_NAME("rng", AArch64::AEK_RAND, "+rand", "-rand")
131+
AARCH64_ARCH_EXT_NAME("memtag", AArch64::AEK_MTE, "+mte", "-mte")
132+
AARCH64_ARCH_EXT_NAME("ssbs", AArch64::AEK_SSBS, "+ssbs", "-ssbs")
133+
AARCH64_ARCH_EXT_NAME("sb", AArch64::AEK_SB, "+sb", "-sb")
134+
AARCH64_ARCH_EXT_NAME("predres", AArch64::AEK_PREDRES, "+predres", "-predres")
135+
AARCH64_ARCH_EXT_NAME("bf16", AArch64::AEK_BF16, "+bf16", "-bf16")
136+
AARCH64_ARCH_EXT_NAME("i8mm", AArch64::AEK_I8MM, "+i8mm", "-i8mm")
137+
AARCH64_ARCH_EXT_NAME("f32mm", AArch64::AEK_F32MM, "+f32mm", "-f32mm")
138+
AARCH64_ARCH_EXT_NAME("f64mm", AArch64::AEK_F64MM, "+f64mm", "-f64mm")
139+
AARCH64_ARCH_EXT_NAME("tme", AArch64::AEK_TME, "+tme", "-tme")
140+
AARCH64_ARCH_EXT_NAME("ls64", AArch64::AEK_LS64, "+ls64", "-ls64")
141+
AARCH64_ARCH_EXT_NAME("brbe", AArch64::AEK_BRBE, "+brbe", "-brbe")
142+
AARCH64_ARCH_EXT_NAME("pauth", AArch64::AEK_PAUTH, "+pauth", "-pauth")
143+
AARCH64_ARCH_EXT_NAME("flagm", AArch64::AEK_FLAGM, "+flagm", "-flagm")
144+
AARCH64_ARCH_EXT_NAME("sme", AArch64::AEK_SME, "+sme", "-sme")
145+
AARCH64_ARCH_EXT_NAME("sme-f64", AArch64::AEK_SMEF64, "+sme-f64", "-sme-f64")
146+
AARCH64_ARCH_EXT_NAME("sme-i64", AArch64::AEK_SMEI64, "+sme-i64", "-sme-i64")
147+
AARCH64_ARCH_EXT_NAME("hbc", AArch64::AEK_HBC, "+hbc", "-hbc")
147148
#undef AARCH64_ARCH_EXT_NAME
148149

149150
#ifndef AARCH64_CPU_NAME

llvm/include/llvm/Support/AArch64TargetParser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ enum ArchExtKind : uint64_t {
6969
AEK_SME = 1ULL << 37,
7070
AEK_SMEF64 = 1ULL << 38,
7171
AEK_SMEI64 = 1ULL << 39,
72+
AEK_HBC = 1ULL << 40,
7273
};
7374

7475
enum class ArchKind {

llvm/lib/Support/AArch64TargetParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ bool AArch64::getExtensionFeatures(uint64_t Extensions,
114114
Features.push_back("+sme-f64");
115115
if (Extensions & AArch64::AEK_SMEI64)
116116
Features.push_back("+sme-i64");
117+
if (Extensions & AArch64::AEK_HBC)
118+
Features.push_back("+hbc");
117119

118120
return true;
119121
}

llvm/unittests/Support/TargetParserTest.cpp

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,43 +1485,41 @@ TEST(TargetParserTest, AArch64ArchFeatures) {
14851485
}
14861486

14871487
TEST(TargetParserTest, AArch64ArchExtFeature) {
1488-
const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"},
1489-
{"crypto", "nocrypto", "+crypto", "-crypto"},
1490-
{"flagm", "noflagm", "+flagm", "-flagm"},
1491-
{"fp", "nofp", "+fp-armv8", "-fp-armv8"},
1492-
{"simd", "nosimd", "+neon", "-neon"},
1493-
{"fp16", "nofp16", "+fullfp16", "-fullfp16"},
1494-
{"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
1495-
{"profile", "noprofile", "+spe", "-spe"},
1496-
{"ras", "noras", "+ras", "-ras"},
1497-
{"lse", "nolse", "+lse", "-lse"},
1498-
{"rdm", "nordm", "+rdm", "-rdm"},
1499-
{"sve", "nosve", "+sve", "-sve"},
1500-
{"sve2", "nosve2", "+sve2", "-sve2"},
1501-
{"sve2-aes", "nosve2-aes", "+sve2-aes",
1502-
"-sve2-aes"},
1503-
{"sve2-sm4", "nosve2-sm4", "+sve2-sm4",
1504-
"-sve2-sm4"},
1505-
{"sve2-sha3", "nosve2-sha3", "+sve2-sha3",
1506-
"-sve2-sha3"},
1507-
{"sve2-bitperm", "nosve2-bitperm",
1508-
"+sve2-bitperm", "-sve2-bitperm"},
1509-
{"dotprod", "nodotprod", "+dotprod", "-dotprod"},
1510-
{"rcpc", "norcpc", "+rcpc", "-rcpc" },
1511-
{"rng", "norng", "+rand", "-rand"},
1512-
{"memtag", "nomemtag", "+mte", "-mte"},
1513-
{"tme", "notme", "+tme", "-tme"},
1514-
{"pauth", "nopauth", "+pauth", "-pauth"},
1515-
{"ssbs", "nossbs", "+ssbs", "-ssbs"},
1516-
{"sb", "nosb", "+sb", "-sb"},
1517-
{"predres", "nopredres", "+predres", "-predres"},
1518-
{"i8mm", "noi8mm", "+i8mm", "-i8mm"},
1519-
{"f32mm", "nof32mm", "+f32mm", "-f32mm"},
1520-
{"f64mm", "nof64mm", "+f64mm", "-f64mm"},
1521-
{"sme", "nosme", "+sme", "-sme"},
1522-
{"sme-f64", "nosme-f64", "+sme-f64", "-sme-f64"},
1523-
{"sme-i64", "nosme-i64", "+sme-i64", "-sme-i64"},
1524-
};
1488+
const char *ArchExt[][4] = {
1489+
{"crc", "nocrc", "+crc", "-crc"},
1490+
{"crypto", "nocrypto", "+crypto", "-crypto"},
1491+
{"flagm", "noflagm", "+flagm", "-flagm"},
1492+
{"fp", "nofp", "+fp-armv8", "-fp-armv8"},
1493+
{"simd", "nosimd", "+neon", "-neon"},
1494+
{"fp16", "nofp16", "+fullfp16", "-fullfp16"},
1495+
{"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
1496+
{"profile", "noprofile", "+spe", "-spe"},
1497+
{"ras", "noras", "+ras", "-ras"},
1498+
{"lse", "nolse", "+lse", "-lse"},
1499+
{"rdm", "nordm", "+rdm", "-rdm"},
1500+
{"sve", "nosve", "+sve", "-sve"},
1501+
{"sve2", "nosve2", "+sve2", "-sve2"},
1502+
{"sve2-aes", "nosve2-aes", "+sve2-aes", "-sve2-aes"},
1503+
{"sve2-sm4", "nosve2-sm4", "+sve2-sm4", "-sve2-sm4"},
1504+
{"sve2-sha3", "nosve2-sha3", "+sve2-sha3", "-sve2-sha3"},
1505+
{"sve2-bitperm", "nosve2-bitperm", "+sve2-bitperm", "-sve2-bitperm"},
1506+
{"dotprod", "nodotprod", "+dotprod", "-dotprod"},
1507+
{"rcpc", "norcpc", "+rcpc", "-rcpc"},
1508+
{"rng", "norng", "+rand", "-rand"},
1509+
{"memtag", "nomemtag", "+mte", "-mte"},
1510+
{"tme", "notme", "+tme", "-tme"},
1511+
{"pauth", "nopauth", "+pauth", "-pauth"},
1512+
{"ssbs", "nossbs", "+ssbs", "-ssbs"},
1513+
{"sb", "nosb", "+sb", "-sb"},
1514+
{"predres", "nopredres", "+predres", "-predres"},
1515+
{"i8mm", "noi8mm", "+i8mm", "-i8mm"},
1516+
{"f32mm", "nof32mm", "+f32mm", "-f32mm"},
1517+
{"f64mm", "nof64mm", "+f64mm", "-f64mm"},
1518+
{"sme", "nosme", "+sme", "-sme"},
1519+
{"sme-f64", "nosme-f64", "+sme-f64", "-sme-f64"},
1520+
{"sme-i64", "nosme-i64", "+sme-i64", "-sme-i64"},
1521+
{"hbc", "nohbc", "+hbc", "-hbc"},
1522+
};
15251523

15261524
for (unsigned i = 0; i < array_lengthof(ArchExt); i++) {
15271525
EXPECT_EQ(StringRef(ArchExt[i][2]),

0 commit comments

Comments
 (0)