[llvm] [TargetParser][AArch64] Believe runtime feature detection (PR #95694)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 17 11:35:16 PDT 2024
https://github.com/workingjubilee updated https://github.com/llvm/llvm-project/pull/95694
>From 56265e59e6729990ec3984c897999b5417b70ceb Mon Sep 17 00:00:00 2001
From: Jubilee Young <workingjubilee at gmail.com>
Date: Sun, 16 Jun 2024 01:59:59 -0700
Subject: [PATCH 1/2] [TargetParser][AArch64] Believe runtime feature detection
---
llvm/lib/TargetParser/Host.cpp | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/llvm/lib/TargetParser/Host.cpp b/llvm/lib/TargetParser/Host.cpp
index 2ea56746aff24..0cb0419746459 100644
--- a/llvm/lib/TargetParser/Host.cpp
+++ b/llvm/lib/TargetParser/Host.cpp
@@ -1967,21 +1967,23 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
}
#if defined(__aarch64__)
- // If we have all crypto bits we can add the feature
- if (crypto == (CAP_AES | CAP_PMULL | CAP_SHA1 | CAP_SHA2))
- Features["crypto"] = true;
+ // LLVM has decided some AArch64 CPUs have all the instructions they _may_
+ // have, as opposed to all the instructions they _must_ have, so allow runtime
+ // information to correct us on that.
+ Features["crypto"] = (crypto == (CAP_AES | CAP_PMULL | CAP_SHA1 | CAP_SHA2));
#endif
return true;
}
#elif defined(_WIN32) && (defined(__aarch64__) || defined(_M_ARM64))
bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
- if (IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE))
- Features["neon"] = true;
- if (IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE))
- Features["crc"] = true;
- if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE))
- Features["crypto"] = true;
+ // If we're asking the OS at runtime, believe what the OS says
+ Features["neon"] =
+ IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE);
+ Features["crc"] =
+ IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE);
+ Features["crypto"] =
+ IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);
return true;
}
>From 6c9e72d33a31910c226e2733f4e5a8b7096c157e Mon Sep 17 00:00:00 2001
From: Jubilee Young <workingjubilee at gmail.com>
Date: Mon, 17 Jun 2024 11:24:40 -0700
Subject: [PATCH 2/2] [TargetParser][AArch64] Split crypto feature detection
into AES & SHA2
---
llvm/lib/TargetParser/Host.cpp | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/TargetParser/Host.cpp b/llvm/lib/TargetParser/Host.cpp
index 0cb0419746459..5f3fda18772fa 100644
--- a/llvm/lib/TargetParser/Host.cpp
+++ b/llvm/lib/TargetParser/Host.cpp
@@ -1924,7 +1924,8 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
}
#if defined(__aarch64__)
- // Keep track of which crypto features we have seen
+ // All of these are "crypto" features, but we must sift out actual features
+ // as the former meaning of "crypto" as a single feature is no more.
enum { CAP_AES = 0x1, CAP_PMULL = 0x2, CAP_SHA1 = 0x4, CAP_SHA2 = 0x8 };
uint32_t crypto = 0;
#endif
@@ -1970,7 +1971,10 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
// LLVM has decided some AArch64 CPUs have all the instructions they _may_
// have, as opposed to all the instructions they _must_ have, so allow runtime
// information to correct us on that.
- Features["crypto"] = (crypto == (CAP_AES | CAP_PMULL | CAP_SHA1 | CAP_SHA2));
+ uint32_t aes = CAP_AES | CAP_PMULL;
+ uint32_t sha2 = CAP_SHA1 | CAP_SHA2;
+ Features["aes"] = (crypto & aes) == aes;
+ Features["sha2"] = (crypto & sha2) == sha2;
#endif
return true;
@@ -1982,8 +1986,12 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE);
Features["crc"] =
IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE);
- Features["crypto"] =
+
+ // Avoid inferring "crypto" means more than the traditional AES + SHA2
+ bool trad_crypto =
IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);
+ Features["aes"] = crypto;
+ Features["sha2"] = crypto;
return true;
}
More information about the llvm-commits
mailing list