]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cmake: detect armv8 crc and crypto feature using CHECK_C_COMPILER_FLAG 24168/head
authorKefu Chai <kchai@redhat.com>
Wed, 19 Sep 2018 06:17:38 +0000 (14:17 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 20 Sep 2018 14:15:56 +0000 (22:15 +0800)
we are using GCC7 and up for C++17 support since mimic, and per
https://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/AArch64-Options.html ,
GCC 4.9 and up should be able to support crc and crypto features if
these archs are enabled at GCC's configure-time. so we should always use
the -march for detecting the compiler's support instead of using the
inline assembly now.

GCC 4.8 is an ancient compiler, and per
https://gcc.gnu.org/gcc-4.8/changes.html, it was the the first GCC
release which offers AArch64 support. so we don't need to cater for
this GCC version. and we can trust GCC-7 and up.

Fixes: http://tracker.ceph.com/issues/17516
Signed-off-by: Kefu Chai <kchai@redhat.com>
cmake/modules/SIMDExt.cmake

index 021524e11e39fb9ed799cefe09c810a9a5eb54d6..b7263691854190c5e31ad8dfe12603423b1b3bb5 100644 (file)
 
 if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
   set(HAVE_ARM 1) 
-  set(save_quiet ${CMAKE_REQUIRED_QUIET})
-  set(CMAKE_REQUIRED_QUIET true)
-  include(CheckCXXSourceCompiles)
-
-  check_cxx_source_compiles("
-    #define CRC32CX(crc, value) __asm__(\"crc32cx %w[c], %w[c], %x[v]\":[c]\"+r\"(crc):[v]\"r\"(value))
-    asm(\".arch_extension crc\");
-    unsigned int foo(unsigned int ret) {
-      CRC32CX(ret, 0);
-      return ret;
-    }
-    int main() { foo(0); }" HAVE_ARMV8_CRC)
-    check_cxx_source_compiles("
-    asm(\".arch_extension crypto\");
-    unsigned int foo(unsigned int ret) {
-      __asm__(\"pmull  v2.1q,          v2.1d,  v1.1d\");
-      return ret;
-    }
-    int main() { foo(0); }" HAVE_ARMV8_CRYPTO)
-
-  set(CMAKE_REQUIRED_QUIET ${save_quiet})
-  if(HAVE_ARMV8_CRC)
-    message(STATUS " aarch64 crc extensions supported")
-  endif()
-
-  if(HAVE_ARMV8_CRYPTO)
-    message(STATUS " aarch64 crypto extensions supported")
-  endif()
-  CHECK_C_COMPILER_FLAG(-march=armv8-a+crc+crypto HAVE_ARMV8_CRC_CRYPTO_MARCH)
-
-  # don't believe only the -march support; gcc 4.8.5 on RHEL/CentOS says
-  # it supports +crc but hasn't got the intrinsics or arm_acle.h.  Test for
-  # the actual presence of one of the intrinsic functions.
-  if(HAVE_ARMV8_CRC_CRYPTO_MARCH)
-    check_cxx_source_compiles("
-      #include <inttypes.h>
-      int main() { uint32_t a; uint8_t b; __builtin_aarch64_crc32b(a, b); }
-    " HAVE_ARMV8_CRC_CRYPTO_INTRINSICS)
-  endif()
+  include(CheckCCompilerFlag)
 
+  check_c_compiler_flag(-march=armv8-a+crc+crypto HAVE_ARMV8_CRC_CRYPTO_INTRINSICS)
   if(HAVE_ARMV8_CRC_CRYPTO_INTRINSICS)
-    message(STATUS " aarch64 crc+crypto intrinsics supported")
-    set(ARMV8_CRC_COMPILE_FLAGS "${ARMV8_CRC_COMPILE_FLAGS} -march=armv8-a+crc+crypto")
+    set(ARMV8_CRC_COMPILE_FLAGS "-march=armv8-a+crc+crypto")
+    set(HAVE_ARMV8_CRC TRUE)
+    set(HAVE_ARMV8_CRYPTO TRUE)
+  else()
+    check_c_compiler_flag(-march=armv8-a+crc HAVE_ARMV8_CRC)
+    check_c_compiler_flag(-march=armv8-a+crypto HAVE_ARMV8_CRYPTO)
+    if(HAVE_ARMV8_CRC)
+      set(ARMV8_CRC_COMPILE_FLAGS "-march=armv8-a+crc")
+    elseif(HAVE_ARMV8_CRYPTO)
+      set(ARMV8_CRC_COMPILE_FLAGS "-march=armv8-a+crypto")
+    endif()
   endif()
 
   CHECK_C_COMPILER_FLAG(-march=armv8-a+simd HAVE_ARMV8_SIMD)