From 10cf2fa22691838b6b91f85ec6c2cacf946f8d2d Mon Sep 17 00:00:00 2001 From: Thomas Bishop Date: Sun, 2 Aug 2020 11:29:20 +0100 Subject: Update Win32PlatformMisc.hpp Fix ARM64 compilation. MSVC _CountOneBits intrinsics undefined for ARM64. --- Platforms/Win32/interface/Win32PlatformMisc.hpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Platforms/Win32/interface/Win32PlatformMisc.hpp b/Platforms/Win32/interface/Win32PlatformMisc.hpp index f972e360..28f7e80a 100644 --- a/Platforms/Win32/interface/Win32PlatformMisc.hpp +++ b/Platforms/Win32/interface/Win32PlatformMisc.hpp @@ -108,8 +108,12 @@ struct WindowsMisc : public BasicPlatformMisc inline static Diligent::Uint32 CountOneBits(Diligent::Uint32 Val) { -#if _M_ARM - auto Bits = _CountOneBits(Val); +#if defined _M_ARM || defined _M_ARM64 + // MSVC _CountOneBits intrinsics undefined for ARM64 + // Cast bits to 8x8 datatype and use VCNT on result + const uint8x8_t Vsum = vcnt_u8(vcreate_u8(static_cast(Val))); + // Pairwise sums: 8x8 -> 16x4 -> 32x2 + auto Bits = static_cast(vget_lane_u32(vpaddl_u16(vpaddl_u8(Vsum)), 0)); #else auto Bits = __popcnt(Val); #endif @@ -119,8 +123,11 @@ struct WindowsMisc : public BasicPlatformMisc inline static Diligent::Uint32 CountOneBits(Diligent::Uint64 Val) { -#if _M_ARM - auto Bits = _CountOneBits64(Val); +#if defined _M_ARM || defined _M_ARM64 + // Cast bits to 8x8 datatype and use VCNT on result + const uint8x8_t Vsum = vcnt_u8(vcreate_u8(Val)); + // Pairwise sums: 8x8 -> 16x4 -> 32x2 -> 64x1 + auto Bits = static_cast(vget_lane_u64(vpaddl_u32(vpaddl_u16(vpaddl_u8(Vsum))), 0)); #elif _WIN64 auto Bits = __popcnt64(Val); #else -- cgit v1.2.3