]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
fix ACLE detection on msvc/arm64
authorShawn Hoffman <godisgovernment@gmail.com>
Sun, 24 Jul 2022 04:01:04 +0000 (21:01 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Mon, 5 Sep 2022 09:26:37 +0000 (11:26 +0200)
CMakeLists.txt
arch/arm/arm_features.c
arch/arm/crc32_acle.c
cmake/detect-intrinsics.cmake
fallback_builtins.h

index c403e5b0fb0958866ab1b5fea362dbf0ba0833cb..8ca63a30f4e37698594e084bcc62c2d5a34ee225 100644 (file)
@@ -587,7 +587,7 @@ if(WITH_OPTIM)
         endif()
         list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_features.h)
         list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/arm_features.c)
-        if(WITH_ACLE AND NOT MSVC AND NOT "${ARCH}" MATCHES "armv[2-7]")
+        if(WITH_ACLE AND NOT "${ARCH}" MATCHES "armv[2-7]")
             check_acle_compiler_flag()
             if(HAVE_ACLE_FLAG)
                 add_definitions(-DARM_ACLE_CRC_HASH)
index 979204b83bcef82147dd23c644f49856aac90c38..d41c13acb074db1814a8bdd293472d1556def955 100644 (file)
@@ -16,7 +16,7 @@
 #  endif
 #  include <sys/sysctl.h>
 #elif defined(_WIN32)
-#  include <winapifamily.h>
+#  include <windows.h>
 #endif
 
 static int arm_has_crc32() {
@@ -34,6 +34,8 @@ static int arm_has_crc32() {
     size_t size = sizeof(hascrc32);
     return sysctlbyname("hw.optional.armv8_crc32", &hascrc32, &size, NULL, 0) == 0
       && hascrc32 == 1;
+#elif defined(_WIN32)
+    return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE);
 #elif defined(ARM_NOCHECK_ACLE)
     return 1;
 #else
index ce75c343e5150c30a9b54f9cae76a6e14d2dbc59..ef18ae81ecf56068c6516435038af2e5d77f4bd7 100644 (file)
@@ -6,7 +6,9 @@
 */
 
 #ifdef ARM_ACLE_CRC_HASH
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+#  include <intrin.h>
+#else
 #  include <arm_acle.h>
 #endif
 #include "../../zbuild.h"
@@ -31,7 +33,7 @@ uint32_t crc32_acle(uint32_t crc, const uint8_t *buf, uint64_t len) {
         buf4 = (const uint32_t *) buf;
     }
 
-#if defined(__aarch64__)
+#if defined(__aarch64__) || defined(_M_ARM64)
     if ((len >= sizeof(uint32_t)) && ((ptrdiff_t)buf & sizeof(uint32_t))) {
         c = __crc32w(c, *buf4++);
         len -= sizeof(uint32_t);
index 1ddab22537b62d82294893caf8be7ca1798d4197..743af4e87c5cdd6b2eedb76b50d10af628aecb7c 100644 (file)
@@ -2,8 +2,12 @@
 # Licensed under the Zlib license, see LICENSE.md for details
 
 macro(check_acle_compiler_flag)
-    if(NOT NATIVEFLAG AND NOT HAVE_ACLE_FLAG)
-        set(ACLEFLAG "-march=armv8-a+crc" CACHE INTERNAL "Compiler option to enable ACLE support")
+    if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
+        if(NOT NATIVEFLAG AND NOT HAVE_ACLE_FLAG)
+            set(ACLEFLAG "-march=armv8-a+crc" CACHE INTERNAL "Compiler option to enable ACLE support")
+        endif()
+    elseif(MSVC)
+        set(HAVE_ACLE_FLAG TRUE)
     endif()
     # Check whether compiler supports ACLE flag
     set(CMAKE_REQUIRED_FLAGS "${ACLEFLAG} ${NATIVEFLAG}")
index 6ab89c20f895f422674034508e0599901401b68a..3e589420789b838dd014f2d4c0a770becbd8e010 100644 (file)
@@ -71,7 +71,7 @@ static inline __m512i _mm512_zextsi128_si512(__m128i a) {
 
 #endif // __AVX2__
 
-#if defined(ARM_NEON_ADLER32) && !defined(__aarch64__)
+#if defined(ARM_NEON_ADLER32) && !defined(__aarch64__) && !defined(_M_ARM64)
 /* Compatibility shim for the _high family of functions */
 #define vmull_high_u8(a, b) vmull_u8(vget_high_u8(a), vget_high_u8(b))
 #define vmlal_high_u8(a, b, c) vmlal_u8(a, vget_high_u8(b), vget_high_u8(c))