diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b56aad8e81a92fdd7966a98c84902120be91800..c2d74892e07d6dd238db72e54fb9049f784c7d79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,6 +108,7 @@ include(RootBuildOptions) include(RootNewMacros) include(CheckCompiler) include(CheckAssembler) +include(CheckIntrinsics) #---Enable CCache ------------------------------------------------------------------------------ if(ccache) diff --git a/builtins/zlib/CMakeLists.txt b/builtins/zlib/CMakeLists.txt index fa4e6984bdacfd475c17337f0792e21fb2d90fb7..1007f664b85ad7c34f0fe1cafb65a4ef616d69f1 100644 --- a/builtins/zlib/CMakeLists.txt +++ b/builtins/zlib/CMakeLists.txt @@ -88,7 +88,20 @@ set(ZLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "") set(ZLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "") if((CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64|X86_64|aarch64") AND (CMAKE_SYSTEM_NAME MATCHES "Linux")) + # Calling helper to avoid using old unsupported binutils (e.g. with SL6) + # macro is returning extra ${ROOT_DEFINITIONS} used after in ZLIB-CF root_check_assembler() + # Calling helper to avoid using old unsupported binutils (e.g. with Centos7 + # and native gcc compiler 4.8.5) + # Macros are returning bools SSE_SUPPORT & AVX2_SUPPORT + root_check_sse41() + root_check_avx2() + if(SSE_SUPPORT OR AVX2_SUPPORT) + set(ZLIB_CF TRUE CACHE INTERNAL "") + endif() +endif() + +if(ZLIB_CF) add_library(ZLIB STATIC ${ZLIB_PUBLIC_HEADERS} ${ZLIBCF_PRIVATE_HEADERS} ${ZLIBCF_SOURCES}) else() add_library(ZLIB STATIC ${ZLIB_PUBLIC_HEADERS} ${ZLIB_PRIVATE_HEADERS} ${ZLIB_SOURCES}) @@ -98,7 +111,7 @@ set_target_properties(ZLIB PROPERTIES C_VISIBILITY_PRESET hidden POSITION_INDEPE target_include_directories(ZLIB INTERFACE $<BUILD_INTERFACE:${ZLIB_INCLUDE_DIR}>) if((CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64|X86_64") AND (CMAKE_SYSTEM_NAME MATCHES "Linux")) - target_compile_options(ZLIB PRIVATE -Wno-unused-function -O3 -mpclmul ${ROOT_DEFINITIONS}) + target_compile_options(ZLIB PRIVATE -Wno-unused-function -O3 -mpclmul ${ROOT_DEFINITIONS}) else() target_compile_options(ZLIB PRIVATE -O3) endif() diff --git a/cmake/modules/CheckIntrinsics.cmake b/cmake/modules/CheckIntrinsics.cmake new file mode 100644 index 0000000000000000000000000000000000000000..90f553ef64b05f272e517146e93428001048c865 --- /dev/null +++ b/cmake/modules/CheckIntrinsics.cmake @@ -0,0 +1,21 @@ +include(CheckCXXSourceRuns) + +# Helper function for checking if compiler is supporting AVX2 intrinsics +function(root_check_avx2) + CHECK_CXX_COMPILER_FLAG("-mavx" AVX2_FLAG) + CHECK_CXX_SOURCE_COMPILES("#include <immintrin.h> \n int main () {__m256i xmm = _mm256_set1_epi64x(0); xmm = _mm256_add_epi64(xmm,xmm);};" AVX2_COMPILATION) + CHECK_CXX_SOURCE_RUNS("#include <immintrin.h> \n int main () {__m256i xmm = _mm256_set1_epi64x(0); xmm = _mm256_add_epi64(xmm,xmm);};" AVX2_RUN) + if(AVX2_FLAG AND AVX2_COMPILATION AND AVX2_RUN) + set(AVX2_SUPPORT TRUE PARENT_SCOPE) + endif() +endfunction() + +# Helper function for checking if compiler is supporting SSE4.1 intrinsics +function(root_check_sse41) + CHECK_CXX_COMPILER_FLAG("-msse4.1" SSE_FLAG) + CHECK_CXX_SOURCE_COMPILES("#include <smmintrin.h> \n int main () {__m128 xmm=_mm_set_ps1(0.0); _mm_ceil_ps(xmm);};" SSE_COMPILATION) + CHECK_CXX_SOURCE_RUNS("#include <smmintrin.h> \n int main () {__m128 xmm=_mm_set_ps1(0.0); _mm_ceil_ps(xmm);};" SSE_RUN) + if(SSE_FLAG AND SSE_COMPILATION AND SSE_RUN) + set(SSE_SUPPORT TRUE PARENT_SCOPE) + endif() +endfunction()