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)
# endif
# include <sys/sysctl.h>
#elif defined(_WIN32)
-# include <winapifamily.h>
+# include <windows.h>
#endif
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
*/
#ifdef ARM_ACLE_CRC_HASH
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+# include <intrin.h>
+#else
# include <arm_acle.h>
#endif
#include "../../zbuild.h"
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);
# 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}")
#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))