]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Allow overwrite NATIVEFLAG value by option NATIVE_ARCH_OVERRIDE.
authorVladislav Shchapov <vladislav@shchapov.ru>
Wed, 7 Feb 2024 19:22:54 +0000 (00:22 +0500)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Sun, 18 Feb 2024 09:08:45 +0000 (10:08 +0100)
Signed-off-by: Vladislav Shchapov <vladislav@shchapov.ru>
.github/workflows/cmake.yml
CMakeLists.txt
cmake/detect-intrinsics.cmake

index de2a1f7f9f00bcd60547b7ed4700ca8a9dcd6952..6410a84e4bc1d6d91424fe5d3f3280a40a9ec3c4 100644 (file)
@@ -41,6 +41,13 @@ jobs:
             cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON
             codecov: ubuntu_gcc_native_inst
 
+          - name: Ubuntu GCC Native Instructions (AVX)
+            os: ubuntu-latest
+            compiler: gcc
+            cxx-compiler: g++
+            cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON -DNATIVE_ARCH_OVERRIDE="-mavx -mpclmul"
+            codecov: ubuntu_gcc_native_inst
+
           - name: Ubuntu GCC Symbol Prefix
             os: ubuntu-latest
             compiler: gcc
index 42eb8f9bc4ae3539e250ab6b3bde7d716103e8bd..bbd144c5f7d20a509144494b627d77c74cb7a72c 100644 (file)
@@ -256,21 +256,31 @@ endif()
 
 # Set native march/mcpu
 if(WITH_NATIVE_INSTRUCTIONS)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        check_c_compiler_flag(-march=native HAVE_MARCH_NATIVE)
-        if(HAVE_MARCH_NATIVE)
-            set(NATIVEFLAG "-march=native")
-        else()
-            check_c_compiler_flag(-mcpu=native HAVE_MCPU_NATIVE)
-            if(HAVE_MCPU_NATIVE)
-                set(NATIVEFLAG "-mcpu=native")
+    if(NATIVE_ARCH_OVERRIDE)
+        message(STATUS "WARNING: WITH_NATIVE_INSTRUCTIONS enabled, but running with NATIVE_ARCH_OVERRIDE: ${NATIVE_ARCH_OVERRIDE}")
+        set(NATIVEFLAG "${NATIVE_ARCH_OVERRIDE}")
+    else()
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
+            check_c_compiler_flag(-march=native HAVE_MARCH_NATIVE)
+            if(HAVE_MARCH_NATIVE)
+                set(NATIVEFLAG "-march=native")
+            else()
+                check_c_compiler_flag(-mcpu=native HAVE_MCPU_NATIVE)
+                if(HAVE_MCPU_NATIVE)
+                    set(NATIVEFLAG "-mcpu=native")
+                endif()
             endif()
+            # Fall through
         endif()
-        # Fall through
     endif()
     if(NATIVEFLAG)
-        # Apply flag to all source files and compilation checks
-        add_compile_options(${NATIVEFLAG})
+        # Apply flags to all source files and compilation checks
+        if(WIN32)
+            separate_arguments(NATIVEOPTIONS WINDOWS_COMMAND "${NATIVEFLAG}")
+        else()
+            separate_arguments(NATIVEOPTIONS UNIX_COMMAND "${NATIVEFLAG}")
+        endif()
+        add_compile_options(${NATIVEOPTIONS})
     else()
         message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not implemented yet on this configuration")
         set(WITH_NATIVE_INSTRUCTIONS OFF)
index 88e9dc10c06e82d0b6e5f7d9e1f49565064fef54..c0d442cff0c9802c5a2eddc4810d345853a0956b 100644 (file)
@@ -9,8 +9,8 @@ macro(check_acle_compiler_flag)
             set(HAVE_ACLE_FLAG TRUE)
         endif()
     else()
-        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-            if(NOT NATIVEFLAG)
+        if(NOT NATIVEFLAG)
+            if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
                 set(ACLEFLAG "-march=armv8-a+crc" CACHE INTERNAL "Compiler option to enable ACLE support")
             endif()
         endif()
@@ -34,8 +34,8 @@ macro(check_acle_compiler_flag)
 endmacro()
 
 macro(check_armv6_compiler_flag)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             check_c_compiler_flag("-march=armv6" HAVE_MARCH_ARMV6)
             if(HAVE_MARCH_ARMV6)
                 set(ARMV6FLAG "-march=armv6" CACHE INTERNAL "Compiler option to enable ARMv6 support")
@@ -74,14 +74,14 @@ macro(check_armv6_compiler_flag)
 endmacro()
 
 macro(check_avx512_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "Intel")
-        if(CMAKE_HOST_UNIX OR APPLE)
-            set(AVX512FLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl")
-        else()
-            set(AVX512FLAG "/arch:AVX512")
-        endif()
-    elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "Intel")
+            if(CMAKE_HOST_UNIX OR APPLE)
+                set(AVX512FLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl")
+            else()
+                set(AVX512FLAG "/arch:AVX512")
+            endif()
+        elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             # For CPUs that can benefit from AVX512, it seems GCC generates suboptimal
             # instruction scheduling unless you specify a reasonable -mtune= target
             set(AVX512FLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl")
@@ -94,9 +94,9 @@ macro(check_avx512_intrinsics)
                 endif()
                 unset(HAVE_CASCADE_LAKE)
             endif()
+        elseif(MSVC)
+            set(AVX512FLAG "/arch:AVX512")
         endif()
-    elseif(MSVC)
-        set(AVX512FLAG "/arch:AVX512")
     endif()
     # Check whether compiler supports AVX512 intrinsics
     set(CMAKE_REQUIRED_FLAGS "${AVX512FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
@@ -112,14 +112,14 @@ macro(check_avx512_intrinsics)
 endmacro()
 
 macro(check_avx512vnni_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "Intel")
-        if(CMAKE_HOST_UNIX OR APPLE)
-            set(AVX512VNNIFLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl -mavx512vnni")
-        else()
-            set(AVX512VNNIFLAG "/arch:AVX512")
-        endif()
-    elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "Intel")
+            if(CMAKE_HOST_UNIX OR APPLE)
+                set(AVX512VNNIFLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl -mavx512vnni")
+            else()
+                set(AVX512VNNIFLAG "/arch:AVX512")
+            endif()
+        elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(AVX512VNNIFLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl -mavx512vnni")
             if(NOT MSVC)
                 check_c_compiler_flag("-mtune=cascadelake" HAVE_CASCADE_LAKE)
@@ -130,11 +130,10 @@ macro(check_avx512vnni_intrinsics)
                 endif()
                 unset(HAVE_CASCADE_LAKE)
             endif()
+        elseif(MSVC)
+            set(AVX512VNNIFLAG "/arch:AVX512")
         endif()
-    elseif(MSVC)
-        set(AVX512VNNIFLAG "/arch:AVX512")
     endif()
-
     # Check whether compiler supports AVX512vnni intrinsics
     set(CMAKE_REQUIRED_FLAGS "${AVX512VNNIFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
     check_c_source_compiles(
@@ -150,18 +149,18 @@ macro(check_avx512vnni_intrinsics)
 endmacro()
 
 macro(check_avx2_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "Intel")
-        if(CMAKE_HOST_UNIX OR APPLE)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "Intel")
+            if(CMAKE_HOST_UNIX OR APPLE)
+                set(AVX2FLAG "-mavx2")
+            else()
+                set(AVX2FLAG "/arch:AVX2")
+            endif()
+        elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(AVX2FLAG "-mavx2")
-        else()
+        elseif(MSVC)
             set(AVX2FLAG "/arch:AVX2")
         endif()
-    elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
-            set(AVX2FLAG "-mavx2")
-        endif()
-    elseif(MSVC)
-        set(AVX2FLAG "/arch:AVX2")
     endif()
     # Check whether compiler supports AVX2 intrinics
     set(CMAKE_REQUIRED_FLAGS "${AVX2FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
@@ -178,8 +177,8 @@ macro(check_avx2_intrinsics)
 endmacro()
 
 macro(check_neon_compiler_flag)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             if("${ARCH}" MATCHES "aarch64")
                 set(NEONFLAG "-march=armv8-a+simd")
             else()
@@ -201,8 +200,8 @@ macro(check_neon_compiler_flag)
 endmacro()
 
 macro(check_neon_ld4_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             if("${ARCH}" MATCHES "aarch64")
                 set(NEONFLAG "-march=armv8-a+simd")
             else()
@@ -225,8 +224,8 @@ macro(check_neon_ld4_intrinsics)
 endmacro()
 
 macro(check_pclmulqdq_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(PCLMULFLAG "-mpclmul")
         endif()
     endif()
@@ -248,8 +247,8 @@ macro(check_pclmulqdq_intrinsics)
 endmacro()
 
 macro(check_vpclmulqdq_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(VPCLMULFLAG "-mvpclmulqdq -mavx512f")
         endif()
     endif()
@@ -332,8 +331,8 @@ macro(check_ppc_intrinsics)
 endmacro()
 
 macro(check_power8_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(POWER8FLAG "-mcpu=power8")
         endif()
     endif()
@@ -374,8 +373,8 @@ macro(check_power8_intrinsics)
 endmacro()
 
 macro(check_rvv_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(RISCVFLAG "-march=rv64gcv")
         endif()
     endif()
@@ -405,8 +404,8 @@ macro(check_s390_intrinsics)
 endmacro()
 
 macro(check_power9_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(POWER9FLAG "-mcpu=power9")
         endif()
     endif()
@@ -447,18 +446,18 @@ macro(check_power9_intrinsics)
 endmacro()
 
 macro(check_sse2_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "Intel")
-        if(CMAKE_HOST_UNIX OR APPLE)
-            set(SSE2FLAG "-msse2")
-        else()
-            set(SSE2FLAG "/arch:SSE2")
-        endif()
-    elseif(MSVC)
-        if(NOT "${ARCH}" MATCHES "x86_64")
-            set(SSE2FLAG "/arch:SSE2")
-        endif()
-    elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "Intel")
+            if(CMAKE_HOST_UNIX OR APPLE)
+                set(SSE2FLAG "-msse2")
+            else()
+                set(SSE2FLAG "/arch:SSE2")
+            endif()
+        elseif(MSVC)
+            if(NOT "${ARCH}" MATCHES "x86_64")
+                set(SSE2FLAG "/arch:SSE2")
+            endif()
+        elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(SSE2FLAG "-msse2")
         endif()
     endif()
@@ -474,14 +473,14 @@ macro(check_sse2_intrinsics)
 endmacro()
 
 macro(check_ssse3_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "Intel")
-        if(CMAKE_HOST_UNIX OR APPLE)
-            set(SSSE3FLAG "-mssse3")
-        else()
-            set(SSSE3FLAG "/arch:SSSE3")
-        endif()
-    elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "Intel")
+            if(CMAKE_HOST_UNIX OR APPLE)
+                set(SSSE3FLAG "-mssse3")
+            else()
+                set(SSSE3FLAG "/arch:SSSE3")
+            endif()
+        elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(SSSE3FLAG "-mssse3")
         endif()
     endif()
@@ -499,14 +498,14 @@ macro(check_ssse3_intrinsics)
 endmacro()
 
 macro(check_sse42_intrinsics)
-    if(CMAKE_C_COMPILER_ID MATCHES "Intel")
-        if(CMAKE_HOST_UNIX OR APPLE)
-            set(SSE42FLAG "-msse4.2")
-        else()
-            set(SSE42FLAG "/arch:SSE4.2")
-        endif()
-    elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
-        if(NOT NATIVEFLAG)
+    if(NOT NATIVEFLAG)
+        if(CMAKE_C_COMPILER_ID MATCHES "Intel")
+            if(CMAKE_HOST_UNIX OR APPLE)
+                set(SSE42FLAG "-msse4.2")
+            else()
+                set(SSE42FLAG "/arch:SSE4.2")
+            endif()
+        elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
             set(SSE42FLAG "-msse4.2")
         endif()
     endif()