diff --git a/libcxx/include/__bit/countl.h b/libcxx/include/__bit/countl.h index a1998ba5f27b4..21bdde9bbe4c8 100644 --- a/libcxx/include/__bit/countl.h +++ b/libcxx/include/__bit/countl.h @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// ToDo: __builtin_clzg is available since Clang 19 and GCC 14. When support for older versions is dropped, we can +// refactor this code to exclusively use __builtin_clzg. + #ifndef _LIBCPP___BIT_COUNTL_H #define _LIBCPP___BIT_COUNTL_H @@ -25,31 +28,22 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(unsigned __x) _NOEXCEPT { -#if __has_builtin(__builtin_clzg) - return __builtin_clzg(__x); -#else return __builtin_clz(__x); -#endif } _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(unsigned long __x) _NOEXCEPT { -#if __has_builtin(__builtin_clzg) - return __builtin_clzg(__x); -#else return __builtin_clzl(__x); -#endif } _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(unsigned long long __x) _NOEXCEPT { -#if __has_builtin(__builtin_clzg) - return __builtin_clzg(__x); -#else return __builtin_clzll(__x); -#endif } #ifndef _LIBCPP_HAS_NO_INT128 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(__uint128_t __x) _NOEXCEPT { +# if __has_builtin(__builtin_clzg) + return __builtin_clzg(__x); +# else // The function is written in this form due to C++ constexpr limitations. // The algorithm: // - Test whether any bit in the high 64-bits is set @@ -59,9 +53,6 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(__uint128_t __x) // - Any bits set: // - The number of leading zeros of the input is the number of leading // zeros in the high 64-bits. -# if __has_builtin(__builtin_clzg) - return __builtin_clzg(__x); -# else return ((__x >> 64) == 0) ? (64 + __builtin_clzll(static_cast(__x))) : __builtin_clzll(static_cast(__x >> 64)); # endif @@ -76,7 +67,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countl_zero(_Tp __t) _ if (__t == 0) return numeric_limits<_Tp>::digits; - return __builtin_clzg(__t) - (numeric_limits::digits - numeric_limits<_Tp>::digits); + return __builtin_clzg(__t); } #else // __has_builtin(__builtin_clzg) diff --git a/libcxx/include/__bit/countr.h b/libcxx/include/__bit/countr.h index b2feaf7d97bce..a01ec96417f08 100644 --- a/libcxx/include/__bit/countr.h +++ b/libcxx/include/__bit/countr.h @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// ToDo: __builtin_ctzg is available since Clang 19 and GCC 14. When support for older versions is dropped, we can +// refactor this code to exclusively use __builtin_ctzg. + #ifndef _LIBCPP___BIT_COUNTR_H #define _LIBCPP___BIT_COUNTR_H @@ -24,27 +27,15 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_ctz(unsigned __x) _NOEXCEPT { -#if __has_builtin(__builtin_ctzg) - return __builtin_ctzg(__x); -#else return __builtin_ctz(__x); -#endif } _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_ctz(unsigned long __x) _NOEXCEPT { -#if __has_builtin(__builtin_ctzg) - return __builtin_ctzg(__x); -#else return __builtin_ctzl(__x); -#endif } _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_ctz(unsigned long long __x) _NOEXCEPT { -#if __has_builtin(__builtin_ctzg) - return __builtin_ctzg(__x); -#else return __builtin_ctzll(__x); -#endif } #if __has_builtin(__builtin_ctzg) diff --git a/libcxx/include/__bit/popcount.h b/libcxx/include/__bit/popcount.h index 68a723bcce63e..88c967d67c60a 100644 --- a/libcxx/include/__bit/popcount.h +++ b/libcxx/include/__bit/popcount.h @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// ToDo: __builtin_popcountg is available since Clang 19 and GCC 14. When support for older versions is dropped, we can +// refactor this code to exclusively use __builtin_popcountg. + #ifndef _LIBCPP___BIT_POPCOUNT_H #define _LIBCPP___BIT_POPCOUNT_H @@ -24,27 +27,15 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_popcount(unsigned __x) _NOEXCEPT { -#if __has_builtin(__builtin_popcountg) - return __builtin_popcountg(__x); -#else return __builtin_popcount(__x); -#endif } inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_popcount(unsigned long __x) _NOEXCEPT { -#if __has_builtin(__builtin_popcountg) - return __builtin_popcountg(__x); -#else return __builtin_popcountl(__x); -#endif } inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_popcount(unsigned long long __x) _NOEXCEPT { -#if __has_builtin(__builtin_popcountg) - return __builtin_popcountg(__x); -#else return __builtin_popcountll(__x); -#endif } #if _LIBCPP_STD_VER >= 20 diff --git a/libcxx/src/include/ryu/d2s_intrinsics.h b/libcxx/src/include/ryu/d2s_intrinsics.h index afe64649a0be1..be50361fb3b33 100644 --- a/libcxx/src/include/ryu/d2s_intrinsics.h +++ b/libcxx/src/include/ryu/d2s_intrinsics.h @@ -249,7 +249,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf2(const uint64_t __value, const uint32_t __p) { _LIBCPP_ASSERT_INTERNAL(__value != 0, ""); _LIBCPP_ASSERT_INTERNAL(__p < 64, ""); - // __builtin_ctzll/__builtin_ctzg doesn't appear to be faster here. + // __builtin_ctzll doesn't appear to be faster here. return (__value & ((1ull << __p) - 1)) == 0; } diff --git a/libcxx/src/include/ryu/ryu.h b/libcxx/src/include/ryu/ryu.h index 85831bed61b21..de1744ba20a0e 100644 --- a/libcxx/src/include/ryu/ryu.h +++ b/libcxx/src/include/ryu/ryu.h @@ -73,7 +73,7 @@ _LIBCPP_HIDE_FROM_ABI inline unsigned char _BitScanForward64(unsigned long* __in if (__mask == 0) { return false; } - *__index = __libcpp_ctz(__mask); + *__index = __builtin_ctzll(__mask); return true; } @@ -81,7 +81,7 @@ _LIBCPP_HIDE_FROM_ABI inline unsigned char _BitScanForward(unsigned long* __inde if (__mask == 0) { return false; } - *__index = __libcpp_ctz(__mask); + *__index = __builtin_ctz(__mask); return true; } #endif // !_MSC_VER diff --git a/libcxx/src/ryu/f2s.cpp b/libcxx/src/ryu/f2s.cpp index e7b5d39669f99..f42fbd68c91d2 100644 --- a/libcxx/src/ryu/f2s.cpp +++ b/libcxx/src/ryu/f2s.cpp @@ -107,7 +107,7 @@ inline constexpr uint64_t __FLOAT_POW5_SPLIT[47] = { [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf2(const uint32_t __value, const uint32_t __p) { _LIBCPP_ASSERT_INTERNAL(__value != 0, ""); _LIBCPP_ASSERT_INTERNAL(__p < 32, ""); - // __builtin_ctz/__builtin_ctzg doesn't appear to be faster here. + // __builtin_ctz doesn't appear to be faster here. return (__value & ((1u << __p) - 1)) == 0; }