From bee421b93d79c613ecb67c13687d9a7127698609 Mon Sep 17 00:00:00 2001 From: Ben Niu Date: Wed, 26 Jan 2022 18:02:31 -0800 Subject: Disable _tzcnt_u64 for ARM64EC The ARM64EC is a new Microsoft-designed ARM64 ABI that is compatible with AMD64 code. However, not all AMD64 intrinsic functions are supported. For, intrinsics that are lowered to AVX, AVX2 and AVX512 instructions are not supported, including the _tzcnt_u64. To make sure this file compiles for ARM64EC, the use of _tzcnt_u64 should be neutered. --- lib/lz4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lz4.c b/lib/lz4.c index 2867c60..fb91047 100644 --- a/lib/lz4.c +++ b/lib/lz4.c @@ -517,7 +517,7 @@ static unsigned LZ4_NbCommonBytes (reg_t val) assert(val != 0); if (LZ4_isLittleEndian()) { if (sizeof(val) == 8) { -# if defined(_MSC_VER) && (_MSC_VER >= 1800) && defined(_M_AMD64) && !defined(LZ4_FORCE_SW_BITCOUNT) +# if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) && !defined(_M_ARM64EC)) && !defined(LZ4_FORCE_SW_BITCOUNT) # if defined(__clang__) && (__clang_major__ < 10) /* Avoid undefined clang-cl intrinics issue. * See https://github.com/lz4/lz4/pull/1017 for details. */ -- cgit v0.12 From c2d00cb97b68cdaf3cc52dc910eecbeb4bee5015 Mon Sep 17 00:00:00 2001 From: Ben Niu Date: Thu, 27 Jan 2022 11:04:06 -0800 Subject: Add comments --- lib/lz4.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/lz4.c b/lib/lz4.c index fb91047..6a02ef5 100644 --- a/lib/lz4.c +++ b/lib/lz4.c @@ -518,6 +518,11 @@ static unsigned LZ4_NbCommonBytes (reg_t val) if (LZ4_isLittleEndian()) { if (sizeof(val) == 8) { # if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) && !defined(_M_ARM64EC)) && !defined(LZ4_FORCE_SW_BITCOUNT) +/*-************************************************************************************************* +* ARM64EC is a Microsoft-designed ARM64 ABI compatible with AMD64 applications on ARM64 Windows 11. +* The ARM64EC ABI does not support AVX/AVX2/AVX512 instructions, nor their relevant intrinsics +* including _tzcnt_u64. Therefore, we need to neuter the _tzcnt_u64 code path for ARM64EC. +****************************************************************************************************/ # if defined(__clang__) && (__clang_major__ < 10) /* Avoid undefined clang-cl intrinics issue. * See https://github.com/lz4/lz4/pull/1017 for details. */ -- cgit v0.12