Merge pull request #9433 from shuffle2/constexpr-error

BitUtils: loosen clz to inline on msvc/arm64
This commit is contained in:
LC 2021-01-10 03:45:59 -05:00 committed by GitHub
commit 87debc6641
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -362,7 +362,16 @@ T ExpandValue(T value, size_t left_shift_amount)
(T(-ExtractBit<0>(value)) >> (BitSize<T>() - left_shift_amount));
}
constexpr int CountLeadingZeros(uint64_t value)
// 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)
{
#if defined(__GNUC__)
return value ? __builtin_clzll(value) : 64;
@ -382,7 +391,8 @@ constexpr int CountLeadingZeros(uint64_t value)
#endif
}
constexpr int CountLeadingZeros(uint32_t value)
CONSTEXPR_FROM_INTRINSIC
int CountLeadingZeros(uint32_t value)
{
#if defined(__GNUC__)
return value ? __builtin_clz(value) : 32;
@ -402,4 +412,6 @@ constexpr int CountLeadingZeros(uint32_t value)
#endif
}
#undef CONSTEXPR_FROM_INTRINSIC
} // namespace Common