From d95a38a9fc88384b620a78b9553dc61d423cc3a7 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Mon, 7 Aug 2017 11:20:14 -0400 Subject: [PATCH] Add Android CPU feature detection code Also see https://developer.android.com/ndk/guides/cpu-features.html --- crc-simd.cpp | 5 ++++- gcm-simd.cpp | 5 ++++- rijndael-simd.cpp | 5 ++++- sha-simd.cpp | 13 ++++++++++--- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/crc-simd.cpp b/crc-simd.cpp index bf6f1828..8fa1dcbd 100644 --- a/crc-simd.cpp +++ b/crc-simd.cpp @@ -81,8 +81,11 @@ bool CPU_TryCRC32_ARMV8() } return result; #else +# if defined(__android__) + if (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32) + return true; // https://sourceware.org/ml/libc-help/2017-08/msg00012.html -# if defined(__linux__) && defined(__aarch64__) +# elif defined(__linux__) && defined(__aarch64__) if (getauxval(AT_HWCAP) & HWCAP_CRC32) return true; # elif defined(__linux__) && defined(__aarch32__) diff --git a/gcm-simd.cpp b/gcm-simd.cpp index 57ba9319..01858dc2 100644 --- a/gcm-simd.cpp +++ b/gcm-simd.cpp @@ -214,8 +214,11 @@ bool CPU_TryPMULL_ARMV8() } return result; # else +# if defined(__android__) + if (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL) + return true; // https://sourceware.org/ml/libc-help/2017-08/msg00012.html -# if defined(__linux__) && defined(__aarch64__) +# elif defined(__linux__) && defined(__aarch64__) if (getauxval(AT_HWCAP) & HWCAP_PMULL) return true; # elif defined(__linux__) && defined(__aarch32__) diff --git a/rijndael-simd.cpp b/rijndael-simd.cpp index 7ab393a5..e7e48e94 100644 --- a/rijndael-simd.cpp +++ b/rijndael-simd.cpp @@ -104,8 +104,11 @@ bool CPU_TryAES_ARMV8() } return result; # else +# if defined(__android__) + if (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES) + return true; // https://sourceware.org/ml/libc-help/2017-08/msg00012.html -# if defined(__linux__) && defined(__aarch64__) +# elif defined(__linux__) && defined(__aarch64__) if (getauxval(AT_HWCAP) & HWCAP_AES) return true; # elif defined(__linux__) && defined(__aarch32__) diff --git a/sha-simd.cpp b/sha-simd.cpp index e7a8708a..18bf3c88 100644 --- a/sha-simd.cpp +++ b/sha-simd.cpp @@ -91,8 +91,11 @@ bool CPU_TrySHA1_ARMV8() } return result; # else +# if defined(__android__) + if (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1) + return true; // https://sourceware.org/ml/libc-help/2017-08/msg00012.html -# if defined(__linux__) && defined(__aarch64__) +# elif defined(__linux__) && defined(__aarch64__) if (getauxval(AT_HWCAP) & HWCAP_SHA1) return true; # elif defined(__linux__) && defined(__aarch32__) @@ -158,11 +161,15 @@ bool CPU_TrySHA2_ARMV8() } return result; #else -# if defined(__linux__) && defined(__aarch64__) +# if defined(__android__) + if (android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2) + return true; + // https://sourceware.org/ml/libc-help/2017-08/msg00012.html +# elif defined(__linux__) && defined(__aarch64__) if (getauxval(AT_HWCAP) & HWCAP_SHA2) return true; # elif defined(__linux__) && defined(__aarch32__) - if (getauxval(AT_HWCAP) & HWCAP_SHA2) + if (getauxval(AT_HWCAP2) & HWCAP2_SHA2) return true; # endif