diff options
| author | Shawn Hoffman <godisgovernment@gmail.com> | 2021-01-10 09:31:05 -0800 |
|---|---|---|
| committer | Shawn Hoffman <godisgovernment@gmail.com> | 2021-01-10 10:06:30 -0800 |
| commit | fc65f65891c7ca3221c4ceb70c8378ffdbc819ea (patch) | |
| tree | 0321bb17bc8ed4955c5bc324bad5e8eddd45c8fc /Source/Core | |
| parent | 87debc6641e9e685704038726cf74a38c04d162f (diff) | |
BitUtils: cleanup constexpr usage for msvc clz
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Common/BitUtils.h | 64 |
1 files 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<T>() - 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 <typename T> +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 } |
