diff --git a/stl/inc/__msvc_bit_utils.hpp b/stl/inc/__msvc_bit_utils.hpp index 94b7cad7fcb..160c37d859f 100644 --- a/stl/inc/__msvc_bit_utils.hpp +++ b/stl/inc/__msvc_bit_utils.hpp @@ -352,6 +352,24 @@ constexpr decltype(auto) _Select_countr_zero_impl(_Fn _Callback) { return _Callback([](_Ty _Val) _STATIC_LAMBDA { return _Countr_zero_fallback(_Val); }); } +template +_NODISCARD constexpr int _Countl_zero(const _Ty _Val) noexcept { + _STL_INTERNAL_STATIC_ASSERT(_Is_standard_unsigned_integer<_Ty>); +#if _HAS_COUNTL_ZERO_INTRINSICS +#if (defined(_M_IX86) && !defined(_M_HYBRID_X86_ARM64)) || (defined(_M_X64) && !defined(_M_ARM64EC)) + if (!_Is_constant_evaluated()) { + return _Checked_x86_x64_countl_zero(_Val); + } +#elif defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_HYBRID_X86_ARM64) + if (!_Is_constant_evaluated()) { + return _Checked_arm64_countl_zero(_Val); + } +#endif // defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_HYBRID_X86_ARM64) +#endif // _HAS_COUNTL_ZERO_INTRINSICS + + return _Countl_zero_fallback(_Val); +} + template , int> = 0> _NODISCARD _CONSTEXPR20 int _Popcount(const _Ty _Val) noexcept { #if _HAS_POPCNT_INTRINSICS diff --git a/stl/inc/__msvc_int128.hpp b/stl/inc/__msvc_int128.hpp index 34f9bc99003..08b0267cafe 100644 --- a/stl/inc/__msvc_int128.hpp +++ b/stl/inc/__msvc_int128.hpp @@ -48,24 +48,6 @@ _STD_BEGIN #define _STL_128_DIV_INTRINSICS 0 #endif // ^^^ intrinsics unavailable ^^^ -template -_NODISCARD constexpr int _Countl_zero_internal(const _Ty _Val) noexcept { - _STL_INTERNAL_STATIC_ASSERT(_Is_standard_unsigned_integer<_Ty>); -#if _HAS_COUNTL_ZERO_INTRINSICS -#if (defined(_M_IX86) && !defined(_M_HYBRID_X86_ARM64)) || (defined(_M_X64) && !defined(_M_ARM64EC)) - if (!_Is_constant_evaluated()) { - return _Checked_x86_x64_countl_zero(_Val); - } -#elif defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_HYBRID_X86_ARM64) - if (!_Is_constant_evaluated()) { - return _Checked_arm64_countl_zero(_Val); - } -#endif // defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_HYBRID_X86_ARM64) -#endif // _HAS_COUNTL_ZERO_INTRINSICS - - return _Countl_zero_fallback(_Val); -} - struct alignas(16) _Base128 { uint64_t _Word[2]; @@ -258,7 +240,7 @@ struct alignas(16) _Base128 { } #endif // _STL_128_DIV_INTRINSICS - const auto __d = _Countl_zero_internal(static_cast(_Div >> 32)); + const auto __d = _Countl_zero(static_cast(_Div >> 32)); if (__d >= 32) { // _Div < 2^32 auto _Rem = (_High << 32) | (_Low >> 32); auto _Result = _Rem / static_cast(_Div); @@ -466,7 +448,7 @@ struct alignas(16) _Base128 { // _STL_INTERNAL_CHECK(_Den._Word[1] != 0); // _STL_INTERNAL_CHECK(_Num._Word[1] > _Den._Word[1]); // Normalize by shifting both left until _Den's high bit is set (So _Den's high digit is >= b / 2) - const auto __d = _Countl_zero_internal(_Den._Word[1]); + const auto __d = _Countl_zero(_Den._Word[1]); _Den <<= __d; auto _High_digit = __d == 0 ? 0 : _Num._Word[1] >> (64 - __d); // This creates a third digit for _Num _Num <<= __d; @@ -511,7 +493,7 @@ struct alignas(16) _Base128 { } return __qhat; #else // ^^^ 128-bit intrinsics / no such intrinsics vvv - auto __d = _Countl_zero_internal(_Den._Word[1]); + auto __d = _Countl_zero(_Den._Word[1]); const bool _Three_word_den = __d >= 32; __d &= 31; uint32_t __u[5]{ @@ -591,7 +573,7 @@ struct alignas(16) _Base128 { // _STL_INTERNAL_CHECK(_Den._Word[1] != 0); // _STL_INTERNAL_CHECK(_Num._Word[1] > _Den._Word[1]); // Normalize by shifting both left until _Den's high bit is set (So _Den's high digit is >= b / 2) - const auto __d = _Countl_zero_internal(_Den._Word[1]); + const auto __d = _Countl_zero(_Den._Word[1]); _Den <<= __d; auto _High_digit = __d == 0 ? 0 : _Num._Word[1] >> (64 - __d); // This creates a third digit for _Num _Num <<= __d; @@ -638,7 +620,7 @@ struct alignas(16) _Base128 { (void) _AddCarry64(_Carry, _Num._Word[1], _Den._Word[1], _Num._Word[1]); } #else // ^^^ 128-bit intrinsics / no such intrinsics vvv - auto __d = _Countl_zero_internal(_Den._Word[1]); + auto __d = _Countl_zero(_Den._Word[1]); const bool _Three_word_den = __d >= 32; __d &= 31; uint32_t __u[5]{ @@ -748,7 +730,7 @@ struct alignas(16) _Base128 { // _STL_INTERNAL_CHECK(_Den._Word[1] != 0); // _STL_INTERNAL_CHECK(_Num._Word[1] > _Den._Word[1]); // Normalize by shifting both left until _Den's high bit is set (So _Den's high digit is >= b / 2) - const auto __d = _STD _Countl_zero_internal(_Den._Word[1]); + const auto __d = _STD _Countl_zero(_Den._Word[1]); _Den <<= __d; auto _High_digit = __d == 0 ? 0 : _Num._Word[1] >> (64 - __d); // This creates a third digit for _Num _Num <<= __d; @@ -795,7 +777,7 @@ struct alignas(16) _Base128 { } _Result = __qhat; #else // ^^^ 128-bit intrinsics / no such intrinsics vvv - auto __d = _Countl_zero_internal(_Den._Word[1]); + auto __d = _Countl_zero(_Den._Word[1]); const bool _Three_word_den = __d >= 32; __d &= 31; uint32_t __u[5]{ diff --git a/stl/inc/bit b/stl/inc/bit index 2b6d9195930..94a5cedd990 100644 --- a/stl/inc/bit +++ b/stl/inc/bit @@ -198,24 +198,12 @@ _NODISCARD constexpr _Ty rotr(const _Ty _Val, const int _Rotation) noexcept { _EXPORT_STD template <_Standard_unsigned_integral _Ty> _NODISCARD constexpr int countl_zero(const _Ty _Val) noexcept { -#if _HAS_COUNTL_ZERO_INTRINSICS -#if (defined(_M_IX86) && !defined(_M_HYBRID_X86_ARM64)) || (defined(_M_X64) && !defined(_M_ARM64EC)) - if (!_STD is_constant_evaluated()) { - return _Checked_x86_x64_countl_zero(_Val); - } -#elif defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_HYBRID_X86_ARM64) - if (!_STD is_constant_evaluated()) { - return _Checked_arm64_countl_zero(_Val); - } -#endif // defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_HYBRID_X86_ARM64) -#endif // _HAS_COUNTL_ZERO_INTRINSICS - - return _Countl_zero_fallback(_Val); + return _Countl_zero(_Val); } _EXPORT_STD template <_Standard_unsigned_integral _Ty> _NODISCARD constexpr int countl_one(const _Ty _Val) noexcept { - return _STD countl_zero(static_cast<_Ty>(~_Val)); + return _Countl_zero(static_cast<_Ty>(~_Val)); } _EXPORT_STD template <_Standard_unsigned_integral _Ty> diff --git a/stl/inc/random b/stl/inc/random index 90ae36415a5..a275ca4e7f0 100644 --- a/stl/inc/random +++ b/stl/inc/random @@ -2583,7 +2583,7 @@ _NODISCARD _Flt _Float_upper_bound(_Ty _Val) noexcept { constexpr auto _Mask = static_cast<_Ty>(-1) << (_Ty_digits - _Flt_digits); #ifdef _M_CEE_PURE constexpr auto _Ty_32or64_digits = numeric_limits<_Ty_32or64>::digits; - const auto _Log_plus1 = _Ty_32or64_digits - _Countl_zero_internal(static_cast<_Ty_32or64>(_Val | _Ty{1})); + const auto _Log_plus1 = _Ty_32or64_digits - _Countl_zero(static_cast<_Ty_32or64>(_Val | _Ty{1})); #else // ^^^ defined(_M_CEE_PURE) / !defined(_M_CEE_PURE) vvv const auto _Log_plus1 = _Bit_scan_reverse(static_cast<_Ty_32or64>(_Val | _Ty{1})); #endif // ^^^ !defined(_M_CEE_PURE) ^^^