Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions stl/inc/__msvc_bit_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <class _Ty>
_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 <class _Ty, enable_if_t<_Is_standard_unsigned_integer<_Ty>, int> = 0>
_NODISCARD _CONSTEXPR20 int _Popcount(const _Ty _Val) noexcept {
#if _HAS_POPCNT_INTRINSICS
Expand Down
28 changes: 5 additions & 23 deletions stl/inc/__msvc_int128.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,24 +48,6 @@ _STD_BEGIN
#define _STL_128_DIV_INTRINSICS 0
#endif // ^^^ intrinsics unavailable ^^^

template <class _Ty>
_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];

Expand Down Expand Up @@ -258,7 +240,7 @@ struct alignas(16) _Base128 {
}
#endif // _STL_128_DIV_INTRINSICS

const auto __d = _Countl_zero_internal(static_cast<uint32_t>(_Div >> 32));
const auto __d = _Countl_zero(static_cast<uint32_t>(_Div >> 32));
if (__d >= 32) { // _Div < 2^32
auto _Rem = (_High << 32) | (_Low >> 32);
auto _Result = _Rem / static_cast<uint32_t>(_Div);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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]{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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]{
Expand Down
16 changes: 2 additions & 14 deletions stl/inc/bit
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
2 changes: 1 addition & 1 deletion stl/inc/random
Original file line number Diff line number Diff line change
Expand Up @@ -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) ^^^
Expand Down