summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorShawn Hoffman <godisgovernment@gmail.com>2021-01-10 09:31:05 -0800
committerShawn Hoffman <godisgovernment@gmail.com>2021-01-10 10:06:30 -0800
commitfc65f65891c7ca3221c4ceb70c8378ffdbc819ea (patch)
tree0321bb17bc8ed4955c5bc324bad5e8eddd45c8fc /Source/Core
parent87debc6641e9e685704038726cf74a38c04d162f (diff)
BitUtils: cleanup constexpr usage for msvc clz
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Common/BitUtils.h64
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
}