summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBradley Smith <bradley.smith@arm.com>2014-05-22 11:44:34 +0000
committerBradley Smith <bradley.smith@arm.com>2014-05-22 11:44:34 +0000
commit00011c71f92328253102032abdb3acbd97fc9d4b (patch)
tree75fda66b2d7dd929f616873c8f4a2485ac1b8365 /lib
parente3ece90f24497f63cd058f497dae61c4daa27452 (diff)
downloadllvm-00011c71f92328253102032abdb3acbd97fc9d4b.tar.gz
llvm-00011c71f92328253102032abdb3acbd97fc9d4b.tar.bz2
llvm-00011c71f92328253102032abdb3acbd97fc9d4b.tar.xz
Extend sys::getHostCPUFeatures to work on AArch64 platforms
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209420 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Support/Host.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/lib/Support/Host.cpp b/lib/Support/Host.cpp
index e0e85630be..7e86e2ffcf 100644
--- a/lib/Support/Host.cpp
+++ b/lib/Support/Host.cpp
@@ -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<bool> &Features) {
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<bool> &Features) {
.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