diff --git a/ext/hash/murmur/PMurHash.c b/ext/hash/murmur/PMurHash.c index 0716ca13c88f..83c7d721fbe3 100644 --- a/ext/hash/murmur/PMurHash.c +++ b/ext/hash/murmur/PMurHash.c @@ -67,6 +67,11 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. #define UNALIGNED_SAFE #endif +/* Avoid miscompiled aligned reads with the v142 ARM64 optimizer. */ +#if defined(_MSC_VER) && _MSC_VER < 1930 && defined(_M_ARM64) && !defined(__clang__) + #define UNALIGNED_SAFE +#endif + /* Find best way to ROTL */ #if defined(_MSC_VER) #define FORCE_INLINE static __forceinline diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index 7686fb83a4a3..f7c940390ac1 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -27,6 +27,11 @@ #define DEFAULT_SHORT_OPEN_TAG "1" /* Platform-Specific Configuration. Should not be changed. */ +/* Match -ffp-contract=off on toolsets that enable ARM64 contractions by default. */ +#if defined(_MSC_VER) && _MSC_VER < 1930 && defined(_M_ARM64) && !defined(__clang__) +# pragma fp_contract(off) +#endif + /* Alignment for Zend memory allocator */ #define ZEND_MM_ALIGNMENT (size_t)8 #define ZEND_MM_ALIGNMENT_LOG2 (size_t)3