[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