]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
[ARM] Use armv8-crc+simd when compiling ACLE code on toolchains that don't enable...
authorMika T. Lindqvist <postmaster@raasu.org>
Mon, 24 Jan 2022 06:21:10 +0000 (08:21 +0200)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Sat, 29 Jan 2022 16:03:30 +0000 (17:03 +0100)
cmake/detect-intrinsics.cmake
configure

index cc1ffa51c139dbc78aeb3520946ad3a9f1796789..429383cd720a5a493441604ff1c59925ebd65d84 100644 (file)
@@ -2,14 +2,24 @@
 # Licensed under the Zlib license, see LICENSE.md for details
 
 macro(check_acle_intrinsics)
-    if(NOT NATIVEFLAG)
-        set(ACLEFLAG "-march=armv8-a+crc")
+    if(NOT NATIVEFLAG AND NOT HAVE_ACLE_INTRIN)
+        set(ACLEFLAG "-march=armv8-a+crc" CACHE INTERNAL "Compiler option to enable ACLE support")
     endif()
     # Check whether compiler supports ACLE flag
     set(CMAKE_REQUIRED_FLAGS "${ACLEFLAG} ${NATIVEFLAG}")
     check_c_source_compiles(
         "int main() { return 0; }"
         HAVE_ACLE_INTRIN FAIL_REGEX "not supported")
+    if(NOT NATIVEFLAG AND NOT HAVE_ACLE_INTRIN)
+        set(ACLEFLAG "-march=armv8-a+crc+simd" CACHE INTERNAL "Compiler option to enable ACLE support" FORCE)
+        # Check whether compiler supports ACLE flag
+        set(CMAKE_REQUIRED_FLAGS "${ACLEFLAG}")
+        check_c_source_compiles(
+            "int main() { return 0; }"
+            HAVE_ACLE_INTRIN2 FAIL_REGEX "not supported")
+        set(HAVE_ACLE_INTRIN ${HAVE_ACLE_INTRIN2} CACHE INTERNAL "Have ACLE intrinsics" FORCE)
+        unset(HAVE_ACLE_INTRIN2 CACHE) # Don't cache this internal variable
+    endif()
     set(CMAKE_REQUIRED_FLAGS)
 endmacro()
 
index e957aa0ba15ac51bf925dd1956bc10afb2076a06..1e063322a4d69890f7619deb0a685c01d06e868f 100755 (executable)
--- a/configure
+++ b/configure
@@ -1132,6 +1132,29 @@ EOF
     fi
 }
 
+check_acle_intrinsics() {
+    # Check whether -march=armv8-a+crc works correctly
+    cat > $test.c << EOF
+int main() { return 0; }
+EOF
+    if try $CC -c $CFLAGS -march=armv8-a+crc $test.c; then
+        ACLE_AVAILABLE=1
+        echo "Check whether -march=armv8-a+crc works ... Yes." | tee -a configure.log
+    else
+        echo "Check whether -march=armv8-a+crc works ... No." | tee -a configure.log
+        if try $CC -c $CFLAGS -march=armv8-a+crc+simd $test.c; then
+            ACLE_AVAILABLE=1
+            echo "Check whether -march=armv8-a+crc+simd works ... Yes." | tee -a configure.log
+            if test "$ARCH" = "armv8-a+crc"; then
+                ARCH=armv8-a+crc+simd
+            fi
+        else
+            ACLE_AVAILABLE=0
+            echo "Check whether -march=armv8-a+crc+simd works ... No." | tee -a configure.log
+        fi
+    fi
+}
+
 check_neon_intrinsics() {
     # Check whether -mfpu=neon is available on ARM processors.
     cat > $test.c << EOF
@@ -1633,6 +1656,7 @@ EOF
         fi
 
         if test $without_optimizations -eq 0; then
+            check_acle_intrinsics
             check_neon_intrinsics
         fi
 
@@ -1713,11 +1737,13 @@ EOF
                 acleflag="-march=${ARCH}"
 
                 if test $without_optimizations -eq 0; then
-                    CFLAGS="${CFLAGS} -DARM_ACLE_CRC_HASH"
-                    SFLAGS="${SFLAGS} -DARM_ACLE_CRC_HASH"
+                    if test $ACLE_AVAILABLE -eq 1; then
+                        CFLAGS="${CFLAGS} -DARM_ACLE_CRC_HASH"
+                        SFLAGS="${SFLAGS} -DARM_ACLE_CRC_HASH"
 
-                    ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_acle.o insert_string_acle.o"
-                    ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_acle.lo insert_string_acle.lo"
+                        ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_acle.o insert_string_acle.o"
+                        ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_acle.lo insert_string_acle.lo"
+                    fi
 
                     if test $buildneon -eq 1; then
                         if test $MFPU_NEON_AVAILABLE -eq 1;then