diff --git a/stl/inc/__msvc_bit_utils.hpp b/stl/inc/__msvc_bit_utils.hpp index 4217cb208a3..df0af9064d5 100644 --- a/stl/inc/__msvc_bit_utils.hpp +++ b/stl/inc/__msvc_bit_utils.hpp @@ -281,7 +281,8 @@ _NODISCARD int _Checked_x86_x64_countr_zero(const _Ty _Val) noexcept { #define _POPCNT_INTRINSICS_ALWAYS_AVAILABLE 0 #endif // ^^^ intrinsics not always available ^^^ #else // ^^^ intrinsics available / intrinsics unavailable vvv -#define _HAS_POPCNT_INTRINSICS 0 +#define _HAS_POPCNT_INTRINSICS 0 +#define _POPCNT_INTRINSICS_ALWAYS_AVAILABLE 0 #endif // ^^^ intrinsics unavailable ^^^ #if _HAS_POPCNT_INTRINSICS @@ -384,9 +385,7 @@ _CONSTEXPR20 decltype(auto) _Select_popcount_impl(_Fn _Callback) { return _Callback([](_Ty _Val) _STATIC_LAMBDA { return _Popcount_fallback(_Val); }); } -#undef _HAS_POPCNT_INTRINSICS #undef _HAS_TZCNT_BSF_INTRINSICS -#undef _POPCNT_INTRINSICS_ALWAYS_AVAILABLE _STD_END diff --git a/stl/inc/bit b/stl/inc/bit index 6d82d9bc106..f9be4e925fd 100644 --- a/stl/inc/bit +++ b/stl/inc/bit @@ -84,6 +84,12 @@ _NODISCARD constexpr int countl_zero(_Ty _Val) noexcept; _EXPORT_STD template <_Standard_unsigned_integral _Ty> _NODISCARD constexpr bool has_single_bit(const _Ty _Val) noexcept { +#if _POPCNT_INTRINSICS_ALWAYS_AVAILABLE + if (!_STD is_constant_evaluated()) { + return _Unchecked_popcount(_Val) == 1; + } +#endif // ^^^ _POPCNT_INTRINSICS_ALWAYS_AVAILABLE ^^^ + return (_Val ^ (_Val - 1)) > _Val - 1; }