From: Kefu Chai Date: Wed, 19 Sep 2018 06:17:38 +0000 (+0800) Subject: cmake: detect armv8 crc and crypto feature using CHECK_C_COMPILER_FLAG X-Git-Tag: v14.0.1~116^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=010edc0f1d9c3f8a7021ecebc635bd8f51271ac3;p=ceph.git cmake: detect armv8 crc and crypto feature using CHECK_C_COMPILER_FLAG 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 --- diff --git a/cmake/modules/SIMDExt.cmake b/cmake/modules/SIMDExt.cmake index 021524e11e39..b72636918541 100644 --- a/cmake/modules/SIMDExt.cmake +++ b/cmake/modules/SIMDExt.cmake @@ -16,49 +16,21 @@ 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 - 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)