fix cflags detection for x86

This commit is contained in:
Konstantinos Margaritis 2023-10-09 00:23:08 +03:00
parent 0d5ce27df4
commit ee8a3c29cc

View File

@ -1,38 +1,36 @@
option(BUILD_AVX512 "Enabling support for AVX512" OFF) option(BUILD_AVX512 "Enabling support for AVX512" OFF)
option(BUILD_AVX512VBMI "Enabling support for AVX512VBMI" OFF) option(BUILD_AVX512VBMI "Enabling support for AVX512VBMI" OFF)
set(SKYLAKE_FLAG "-march=skylake-avx512")
set(ICELAKE_FLAG "-march=icelake-server")
if (NOT FAT_RUNTIME) if (NOT FAT_RUNTIME)
if (BUILD_AVX512VBMI) if (BUILD_AVX512VBMI)
message (STATUS "AVX512VBMI implies AVX512, enabling BUILD_AVX512") message (STATUS "AVX512VBMI implies AVX512, enabling BUILD_AVX512")
set(BUILD_AVX512 ON) set(BUILD_AVX512 ON)
set(ARCH_C_FLAGS "${ICELAKE_FLAG}")
set(ARCH_CXX_FLAGS "${ICELAKE_FLAG}")
endif () endif ()
if (BUILD_AVX512) if (BUILD_AVX512)
message (STATUS "AVX512 implies AVX2, enabling BUILD_AVX2") message (STATUS "AVX512 implies AVX2, enabling BUILD_AVX2")
set(BUILD_AVX2 ON) set(BUILD_AVX2 ON)
set(ARCH_C_FLAGS "${SKYLAKE_FLAG}")
set(ARCH_CXX_FLAGS "${SKYLAKE_FLAG}")
endif () endif ()
endif() if (BUILD_AVX2)
message (STATUS "Enabling BUILD_AVX2")
set(SKYLAKE_FLAG "-march=skylake-avx512") set(ARCH_C_FLAGS "-mavx2")
set(ICELAKE_FLAG "-march=icelake-server") set(ARCH_CXX_FLAGS "-mavx2")
if (ARCH_IA32 OR ARCH_X86_64)
if (NOT FAT_RUNTIME)
if (BUILD_AVX512)
set(ARCH_C_FLAGS "${SKYLAKE_FLAG}")
set(ARCH_CXX_FLAGS "${SKYLAKE_FLAG}")
elseif (BUILD_AVX2)
set(ARCH_C_FLAGS "-mavx2")
set(ARCH_CXX_FLAGS "-mavx2")
else()
set(ARCH_C_FLAGS "-msse4.2")
set(ARCH_CXX_FLAGS "-msse4.2")
endif()
else() else()
set(ARCH_C_FLAGS "-msse4.2") set(ARCH_C_FLAGS "-msse4.2")
set(ARCH_CXX_FLAGS "-msse4.2") set(ARCH_CXX_FLAGS "-msse4.2")
endif() endif()
else()
set(ARCH_C_FLAGS "-msse4.2")
set(ARCH_CXX_FLAGS "-msse4.2")
endif() endif()
set(CMAKE_REQUIRED_FLAGS "${ARCH_C_FLAGS}")
CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H) CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H)
CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H) CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H)
CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H) CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H)
@ -60,16 +58,15 @@ if (BUILD_AVX512VBMI)
endif () endif ()
endif () endif ()
if (ARCH_IA32 OR ARCH_X86_64) # ensure we have the minimum of SSE4.2 - call a SSE4.2 intrinsic
# ensure we have the minimum of SSE4.2 - call a SSE4.2 intrinsic CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
int main() { int main() {
__m128i a = _mm_set1_epi8(1); __m128i a = _mm_set1_epi8(1);
(void)_mm_shuffle_epi8(a, a); (void)_mm_shuffle_epi8(a, a);
}" HAVE_SSE42) }" HAVE_SSE42)
# now look for AVX2 # now look for AVX2
CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
#if !defined(__AVX2__) #if !defined(__AVX2__)
#error no avx2 #error no avx2
#endif #endif
@ -79,8 +76,8 @@ int main(){
(void)_mm256_xor_si256(z, z); (void)_mm256_xor_si256(z, z);
}" HAVE_AVX2) }" HAVE_AVX2)
# and now for AVX512 # and now for AVX512
CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
#if !defined(__AVX512BW__) #if !defined(__AVX512BW__)
#error no avx512bw #error no avx512bw
#endif #endif
@ -90,8 +87,8 @@ int main(){
(void)_mm512_abs_epi8(z); (void)_mm512_abs_epi8(z);
}" HAVE_AVX512) }" HAVE_AVX512)
# and now for AVX512VBMI # and now for AVX512VBMI
CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}> CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
#if !defined(__AVX512VBMI__) #if !defined(__AVX512VBMI__)
#error no avx512vbmi #error no avx512vbmi
#endif #endif
@ -103,29 +100,29 @@ int main(){
}" HAVE_AVX512VBMI) }" HAVE_AVX512VBMI)
if (FAT_RUNTIME) if (FAT_RUNTIME)
if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) if (NOT HAVE_SSE42)
message(FATAL_ERROR "SSE4.2 support required to build fat runtime") message(FATAL_ERROR "SSE4.2 support required to build fat runtime")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) if (BUILD_AVX2 AND NOT HAVE_AVX2)
message(FATAL_ERROR "AVX2 support required to build fat runtime") message(FATAL_ERROR "AVX2 support required to build fat runtime")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) if (BUILD_AVX512 AND NOT HAVE_AVX512)
message(FATAL_ERROR "AVX512 support requested but not supported") message(FATAL_ERROR "AVX512 support requested but not supported")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) if (BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI)
message(FATAL_ERROR "AVX512VBMI support requested but not supported") message(FATAL_ERROR "AVX512VBMI support requested but not supported")
endif () endif ()
else (NOT FAT_RUNTIME) else (NOT FAT_RUNTIME)
if ((ARCH_IA32 OR ARCH_X86_64) AND NOT BUILD_AVX2) if (NOT BUILD_AVX2)
message(STATUS "Building without AVX2 support") message(STATUS "Building without AVX2 support")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512) if (NOT HAVE_AVX512)
message(STATUS "Building without AVX512 support") message(STATUS "Building without AVX512 support")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512VBMI) if (NOT HAVE_AVX512VBMI)
message(STATUS "Building without AVX512VBMI support") message(STATUS "Building without AVX512VBMI support")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) if (NOT HAVE_SSE42)
message(FATAL_ERROR "A minimum of SSE4.2 compiler support is required") message(FATAL_ERROR "A minimum of SSE4.2 compiler support is required")
endif () endif ()
endif () endif ()