From 045441a30502ead533420f479d14b2afe8cc1f8a Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Sat, 27 Apr 2024 17:49:40 -0700 Subject: [PATCH] [Base] Add Windows-ARM64 `bit_count` implementation Uses intrinsics from https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-170 --- src/xenia/base/math.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/xenia/base/math.h b/src/xenia/base/math.h index 889cf03ed..c6132f5b4 100644 --- a/src/xenia/base/math.h +++ b/src/xenia/base/math.h @@ -133,10 +133,17 @@ constexpr inline uint32_t bit_count(T v) { } #else #if XE_COMPILER_MSVC || XE_COMPILER_INTEL +#if XE_ARCH_AMD64 inline uint32_t bit_count(uint32_t v) { return __popcnt(v); } inline uint32_t bit_count(uint64_t v) { return static_cast(__popcnt64(v)); } +#elif XE_ARCH_ARM64 +inline uint32_t bit_count(uint32_t v) { return _CountOneBits(v); } +inline uint32_t bit_count(uint64_t v) { + return static_cast(_CountOneBits64(v)); +} +#endif #elif XE_COMPILER_GCC || XE_COMPILER_CLANG static_assert(sizeof(unsigned int) == sizeof(uint32_t)); static_assert(sizeof(unsigned long long) == sizeof(uint64_t));