Extend sys::getHostCPUFeatures to work on AArch64 platforms
authorBradley Smith <bradley.smith@arm.com>
Thu, 22 May 2014 11:44:34 +0000 (11:44 +0000)
committerBradley Smith <bradley.smith@arm.com>
Thu, 22 May 2014 11:44:34 +0000 (11:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209420 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/Host.cpp

index e0e85630be6b459e94f550c49adc480f32a7acac..7e86e2ffcf28a4ddef0abdba39591c426a2e9096 100644 (file)
@@ -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