mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-13 15:41:18 +00:00
BitUtils: cleanup constexpr usage for msvc clz
This commit is contained in:
parent
87debc6641
commit
fc65f65891
@ -362,53 +362,53 @@ T ExpandValue(T value, size_t left_shift_amount)
|
|||||||
(T(-ExtractBit<0>(value)) >> (BitSize<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
|
template <typename T>
|
||||||
// the function as inline instead.
|
constexpr int CountLeadingZerosConst(T value)
|
||||||
#if defined(_MSC_VER) && defined(_M_ARM_64)
|
{
|
||||||
#define CONSTEXPR_FROM_INTRINSIC inline
|
int result = sizeof(T) * 8;
|
||||||
#else
|
while (value)
|
||||||
#define CONSTEXPR_FROM_INTRINSIC constexpr
|
{
|
||||||
#endif
|
result--;
|
||||||
|
value >>= 1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
CONSTEXPR_FROM_INTRINSIC
|
constexpr int CountLeadingZeros(uint64_t value)
|
||||||
int CountLeadingZeros(uint64_t value)
|
|
||||||
{
|
{
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
return value ? __builtin_clzll(value) : 64;
|
return value ? __builtin_clzll(value) : 64;
|
||||||
#elif defined(_MSC_VER) && defined(_M_ARM_64)
|
#elif defined(_MSC_VER)
|
||||||
return _CountLeadingZeros64(value);
|
if (std::is_constant_evaluated())
|
||||||
#elif defined(_MSC_VER) && defined(_M_X86_64)
|
{
|
||||||
|
return CountLeadingZerosConst(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
unsigned long index = 0;
|
unsigned long index = 0;
|
||||||
return _BitScanReverse64(&index, value) ? 63 - index : 64;
|
return _BitScanReverse64(&index, value) ? 63 - index : 64;
|
||||||
#else
|
|
||||||
int result = 64;
|
|
||||||
while (value)
|
|
||||||
{
|
|
||||||
result--;
|
|
||||||
value >>= 1;
|
|
||||||
}
|
}
|
||||||
return result;
|
#else
|
||||||
|
return CountLeadingZerosConst(value);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CONSTEXPR_FROM_INTRINSIC
|
constexpr int CountLeadingZeros(uint32_t value)
|
||||||
int CountLeadingZeros(uint32_t value)
|
|
||||||
{
|
{
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
return value ? __builtin_clz(value) : 32;
|
return value ? __builtin_clz(value) : 32;
|
||||||
#elif defined(_MSC_VER) && defined(_M_ARM_64)
|
#elif defined(_MSC_VER)
|
||||||
return _CountLeadingZeros(value);
|
if (std::is_constant_evaluated())
|
||||||
#elif defined(_MSC_VER) && defined(_M_X86_64)
|
{
|
||||||
|
return CountLeadingZerosConst(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
unsigned long index = 0;
|
unsigned long index = 0;
|
||||||
return _BitScanReverse(&index, value) ? 31 - index : 32;
|
return _BitScanReverse(&index, value) ? 31 - index : 32;
|
||||||
#else
|
|
||||||
int result = 32;
|
|
||||||
while (value)
|
|
||||||
{
|
|
||||||
result--;
|
|
||||||
value >>= 1;
|
|
||||||
}
|
}
|
||||||
return result;
|
#else
|
||||||
|
return CountLeadingZerosConst(value);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user