[llvm] r209420 - Extend sys::getHostCPUFeatures to work on AArch64 platforms
Bradley Smith
bradley.smith at arm.com
Thu May 22 04:44:34 PDT 2014
Author: brasmi01
Date: Thu May 22 06:44:34 2014
New Revision: 209420
URL: http://llvm.org/viewvc/llvm-project?rev=209420&view=rev
Log:
Extend sys::getHostCPUFeatures to work on AArch64 platforms
Modified:
llvm/trunk/lib/Support/Host.cpp
Modified: llvm/trunk/lib/Support/Host.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?rev=209420&r1=209419&r2=209420&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Host.cpp (original)
+++ llvm/trunk/lib/Support/Host.cpp Thu May 22 06:44:34 2014
@@ -686,7 +686,7 @@ StringRef sys::getHostCPUName() {
}
#endif
-#if defined(__linux__) && defined(__arm__)
+#if defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
std::string Err;
DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err);
@@ -715,8 +715,24 @@ bool sys::getHostCPUFeatures(StringMap<b
break;
}
+#if defined(__aarch64__)
+ // Keep track of which crypto features we have seen
+ enum {
+ HWCAP_AES = 0x1,
+ HWCAP_PMULL = 0x2,
+ HWCAP_SHA1 = 0x4,
+ HWCAP_SHA2 = 0x8
+ };
+ uint32_t crypto = 0;
+#endif
+
for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
StringRef LLVMFeatureStr = StringSwitch<StringRef>(CPUFeatures[I])
+#if defined(__aarch64__)
+ .Case("asimd", "neon")
+ .Case("fp", "fp-armv8")
+ .Case("crc32", "crc")
+#else
.Case("half", "fp16")
.Case("neon", "neon")
.Case("vfpv3", "vfp3")
@@ -724,12 +740,32 @@ bool sys::getHostCPUFeatures(StringMap<b
.Case("vfpv4", "vfp4")
.Case("idiva", "hwdiv-arm")
.Case("idivt", "hwdiv")
+#endif
.Default("");
+#if defined(__aarch64__)
+ // We need to check crypto seperately since we need all of the crypto
+ // extensions to enable the subtarget feature
+ if (CPUFeatures[I] == "aes")
+ crypto |= HWCAP_AES;
+ else if (CPUFeatures[I] == "pmull")
+ crypto |= HWCAP_PMULL;
+ else if (CPUFeatures[I] == "sha1")
+ crypto |= HWCAP_SHA1;
+ else if (CPUFeatures[I] == "sha2")
+ crypto |= HWCAP_SHA2;
+#endif
+
if (LLVMFeatureStr != "")
Features.GetOrCreateValue(LLVMFeatureStr).setValue(true);
}
+#if defined(__aarch64__)
+ // If we have all crypto bits we can add the feature
+ if (crypto == (HWCAP_AES | HWCAP_PMULL | HWCAP_SHA1 | HWCAP_SHA2))
+ Features.GetOrCreateValue("crypto").setValue(true);
+#endif
+
return true;
}
#else
More information about the llvm-commits
mailing list