diff options
| author | Thomas Bishop <tomb@artfulassemblage.com> | 2020-08-02 10:29:20 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-02 10:29:20 +0000 |
| commit | 10cf2fa22691838b6b91f85ec6c2cacf946f8d2d (patch) | |
| tree | a57da854ee347a1b48f72a9ca8ad4386c22d7af3 | |
| parent | Windows platform: fixed ARM compilation issue (diff) | |
| download | DiligentCore-10cf2fa22691838b6b91f85ec6c2cacf946f8d2d.tar.gz DiligentCore-10cf2fa22691838b6b91f85ec6c2cacf946f8d2d.zip | |
Update Win32PlatformMisc.hpp
Fix ARM64 compilation. MSVC _CountOneBits intrinsics undefined for ARM64.
| -rw-r--r-- | Platforms/Win32/interface/Win32PlatformMisc.hpp | 15 |
1 files 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<uint64_t>(Val))); + // Pairwise sums: 8x8 -> 16x4 -> 32x2 + auto Bits = static_cast<Diligent::Uint32>(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<Diligent::Uint32>(vget_lane_u64(vpaddl_u32(vpaddl_u16(vpaddl_u8(Vsum))), 0)); #elif _WIN64 auto Bits = __popcnt64(Val); #else |
