From fc65f65891c7ca3221c4ceb70c8378ffdbc819ea Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Sun, 10 Jan 2021 09:31:05 -0800 Subject: BitUtils: cleanup constexpr usage for msvc clz --- Source/Core/Common/BitUtils.h | 64 +++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Source/Core/Common/BitUtils.h b/Source/Core/Common/BitUtils.h index 1ba34be10f..9a3298b6d5 100644 --- a/Source/Core/Common/BitUtils.h +++ b/Source/Core/Common/BitUtils.h @@ -362,53 +362,53 @@ T ExpandValue(T value, size_t left_shift_amount) (T(-ExtractBit<0>(value)) >> (BitSize() - left_shift_amount)); } -// On some compiler / arch combinations, the compiler does not see instrinsics as constexpr, so mark -// the function as inline instead. -#if defined(_MSC_VER) && defined(_M_ARM_64) -#define CONSTEXPR_FROM_INTRINSIC inline -#else -#define CONSTEXPR_FROM_INTRINSIC constexpr -#endif - -CONSTEXPR_FROM_INTRINSIC -int CountLeadingZeros(uint64_t value) +template +constexpr int CountLeadingZerosConst(T value) { -#if defined(__GNUC__) - return value ? __builtin_clzll(value) : 64; -#elif defined(_MSC_VER) && defined(_M_ARM_64) - return _CountLeadingZeros64(value); -#elif defined(_MSC_VER) && defined(_M_X86_64) - unsigned long index = 0; - return _BitScanReverse64(&index, value) ? 63 - index : 64; -#else - int result = 64; + int result = sizeof(T) * 8; while (value) { result--; value >>= 1; } return result; +} + +constexpr int CountLeadingZeros(uint64_t value) +{ +#if defined(__GNUC__) + return value ? __builtin_clzll(value) : 64; +#elif defined(_MSC_VER) + if (std::is_constant_evaluated()) + { + return CountLeadingZerosConst(value); + } + else + { + unsigned long index = 0; + return _BitScanReverse64(&index, value) ? 63 - index : 64; + } +#else + return CountLeadingZerosConst(value); #endif } -CONSTEXPR_FROM_INTRINSIC -int CountLeadingZeros(uint32_t value) +constexpr int CountLeadingZeros(uint32_t value) { #if defined(__GNUC__) return value ? __builtin_clz(value) : 32; -#elif defined(_MSC_VER) && defined(_M_ARM_64) - return _CountLeadingZeros(value); -#elif defined(_MSC_VER) && defined(_M_X86_64) - unsigned long index = 0; - return _BitScanReverse(&index, value) ? 31 - index : 32; -#else - int result = 32; - while (value) +#elif defined(_MSC_VER) + if (std::is_constant_evaluated()) { - result--; - value >>= 1; + return CountLeadingZerosConst(value); } - return result; + else + { + unsigned long index = 0; + return _BitScanReverse(&index, value) ? 31 - index : 32; + } +#else + return CountLeadingZerosConst(value); #endif } -- cgit v1.2.3