[PATCH] Extend sys::getHostCPUFeatures to work on AArch64 platforms
Bradley Smith
bradley.smith at arm.com
Thu May 22 03:29:36 PDT 2014
This change extends the existing ARM version of the function sys::getHostCPUFeatures to correctly recognize the AArch64 kernel features. Unfortunately there is no testcase for this patch since I can't see how to reasonably write one (nor is this function used anywhere in the codebase), the result of any testcase for this would differ depending on what platform it was run on.
http://reviews.llvm.org/D3869
Files:
lib/Support/Host.cpp
Index: lib/Support/Host.cpp
===================================================================
--- lib/Support/Host.cpp
+++ lib/Support/Host.cpp
@@ -686,7 +686,7 @@
}
#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,21 +715,55 @@
break;
}
+#if defined(__aarch64__)
+ // Keep track of which crypto features we have seen
+ // 0001 = aes
+ // 0010 = pmull
+ // 0100 = sha1
+ // 1000 = sha2
+ 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")
.Case("vfpv3d16", "d16")
.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 |= 0x1;
+ else if (CPUFeatures[I] == "pmull")
+ crypto |= 0x2;
+ else if (CPUFeatures[I] == "sha1")
+ crypto |= 0x4;
+ else if (CPUFeatures[I] == "sha2")
+ crypto |= 0x8;
+#endif
+
if (LLVMFeatureStr != "")
Features.GetOrCreateValue(LLVMFeatureStr).setValue(true);
}
+#if defined(__aarch64__)
+ // If we have all crypto bits we can add the feature
+ if (crypto == 0xf)
+ Features.GetOrCreateValue("crypto").setValue(true);
+#endif
+
return true;
}
#else
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3869.9688.patch
Type: text/x-patch
Size: 1880 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140522/cdccd6f7/attachment.bin>
More information about the llvm-commits
mailing list