From 96460548773e4c644677be5c3b421a5f9517f2a7 Mon Sep 17 00:00:00 2001 From: Saikari Date: Tue, 30 Sep 2025 21:40:25 +0300 Subject: [PATCH 1/3] CMakeLists.txt: support AVX2 detection for https://github.com/xmake-io/xmake-repo/pull/8277 --- CMakeLists.txt | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1f87173..55d4e7af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,13 +3,19 @@ cmake_minimum_required(VERSION 3.26) project(omath VERSION 3.8.1 LANGUAGES CXX) include(CMakePackageConfigHelpers) +include(CheckCXXCompilerFlag) +if (MSVC) + check_cxx_compiler_flag("/arch:AVX2" COMPILER_SUPPORTS_AVX2) +else () + check_cxx_compiler_flag("-mavx2" COMPILER_SUPPORTS_AVX2) +endif () option(OMATH_BUILD_TESTS "Build unit tests" ${PROJECT_IS_TOP_LEVEL}) option(OMATH_BUILD_BENCHMARK "Build benchmarks" ${PROJECT_IS_TOP_LEVEL}) option(OMATH_THREAT_WARNING_AS_ERROR "Set highest level of warnings and force compiler to treat them as errors" ON) option(OMATH_BUILD_AS_SHARED_LIBRARY "Build Omath as .so or .dll" OFF) -option(OMATH_USE_AVX2 "Omath will use AVX2 to boost performance" ON) +option(OMATH_USE_AVX2 "Omath will use AVX2 to boost performance" ${COMPILER_SUPPORTS_AVX2}) option(OMATH_IMGUI_INTEGRATION "Omath will define method to convert omath types to imgui types" OFF) option(OMATH_BUILD_EXAMPLES "Build example projects with you can learn & play" OFF) option(OMATH_STATIC_MSVC_RUNTIME_LIBRARY "Force Omath to link static runtime" OFF) @@ -17,6 +23,11 @@ option(OMATH_SUPRESS_SAFETY_CHECKS "Supress some safety checks in release build option(OMATH_USE_UNITY_BUILD "Will enable unity build to speed up compilation" OFF) option(OMATH_ENABLE_LEGACY "Will enable legacy classes that MUST be used ONLY for backward compatibility" OFF) +if (OMATH_USE_AVX2 AND NOT COMPILER_SUPPORTS_AVX2) + message(WARNING "OMATH_USE_AVX2 requested, but compiler/target does not support AVX2. Disabling.") + set(OMATH_USE_AVX2 OFF CACHE BOOL "Omath will use AVX2 to boost performance" FORCE) +endif () + message(STATUS "[${PROJECT_NAME}]: Building on ${CMAKE_HOST_SYSTEM_NAME}, compiler ${CMAKE_CXX_COMPILER_ID}") message(STATUS "[${PROJECT_NAME}]: Warnings as errors ${OMATH_THREAT_WARNING_AS_ERROR}") message(STATUS "[${PROJECT_NAME}]: Build unit tests ${OMATH_BUILD_TESTS}") @@ -93,9 +104,15 @@ if (OMATH_STATIC_MSVC_RUNTIME_LIBRARY) ) endif () -if (OMATH_USE_AVX2 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - target_compile_options(${PROJECT_NAME} PUBLIC -mavx2 -mavx -mfma) -endif () +if (OMATH_USE_AVX2) + if (MSVC) + target_compile_options(${PROJECT_NAME} PRIVATE /ARCH:AVX /ARCH:AVX2) + elseif (EMSCRIPTEN) + target_compile_options(${PROJECT_NAME} PRIVATE -msimd128 -mavx -mavx2) + elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") + target_compile_options(${PROJECT_NAME} PRIVATE -mavx2 -mavx -mfma) + endif() +endif() target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_23) From ac046aae6c65aca12a451ad5924dcd0c77a91c97 Mon Sep 17 00:00:00 2001 From: Saikari Date: Tue, 30 Sep 2025 23:18:00 +0300 Subject: [PATCH 2/3] Update CMakeLists.txt --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 55d4e7af..e01b1cd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,11 +106,11 @@ endif () if (OMATH_USE_AVX2) if (MSVC) - target_compile_options(${PROJECT_NAME} PRIVATE /ARCH:AVX /ARCH:AVX2) + target_compile_options(${PROJECT_NAME} PUBLIC /ARCH:AVX /ARCH:AVX2) elseif (EMSCRIPTEN) - target_compile_options(${PROJECT_NAME} PRIVATE -msimd128 -mavx -mavx2) + target_compile_options(${PROJECT_NAME} PUBLIC -msimd128 -mavx -mavx2) elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") - target_compile_options(${PROJECT_NAME} PRIVATE -mavx2 -mavx -mfma) + target_compile_options(${PROJECT_NAME} PUBLIC -mfma -mavx -mavx2) endif() endif() From 86fea065e71cb5e9a2476711d9331aa0774e5ccb Mon Sep 17 00:00:00 2001 From: Saikari Date: Tue, 30 Sep 2025 23:40:07 +0300 Subject: [PATCH 3/3] CMakeLists.txt: do not use /ARCH:AVX since we have /ARCH:AVX2 already --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e01b1cd6..c29926cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,11 +106,11 @@ endif () if (OMATH_USE_AVX2) if (MSVC) - target_compile_options(${PROJECT_NAME} PUBLIC /ARCH:AVX /ARCH:AVX2) + target_compile_options(${PROJECT_NAME} PUBLIC /ARCH:AVX2) elseif (EMSCRIPTEN) - target_compile_options(${PROJECT_NAME} PUBLIC -msimd128 -mavx -mavx2) + target_compile_options(${PROJECT_NAME} PUBLIC -msimd128 -mavx2) elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") - target_compile_options(${PROJECT_NAME} PUBLIC -mfma -mavx -mavx2) + target_compile_options(${PROJECT_NAME} PUBLIC -mfma -mavx2) endif() endif()