From d3c2847a1f3f1289cbe556ba266f4963547ea9f9 Mon Sep 17 00:00:00 2001 From: Marc Auberer Date: Fri, 29 Mar 2024 18:43:57 +0100 Subject: [PATCH] Use optional second parameter of c{l|t}z builtins Co-authored-by: Nick Desaulniers --- libcxx/include/__bit/countl.h | 6 +++--- libcxx/include/__bit/countr.h | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/libcxx/include/__bit/countl.h b/libcxx/include/__bit/countl.h index e64e435f80a0b..13df8d4e66c40 100644 --- a/libcxx/include/__bit/countl.h +++ b/libcxx/include/__bit/countl.h @@ -62,12 +62,12 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_clz(__uint128_t __x) template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countl_zero(_Tp __t) _NOEXCEPT { static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__countl_zero requires an unsigned integer type"); +#if __has_builtin(__builtin_clzg) + return __builtin_clzg(__t, numeric_limits<_Tp>::digits); +#else // __has_builtin(__builtin_clzg) if (__t == 0) return numeric_limits<_Tp>::digits; -#if __has_builtin(__builtin_clzg) - return __builtin_clzg(__t); -#else // __has_builtin(__builtin_clzg) if (sizeof(_Tp) <= sizeof(unsigned int)) return std::__libcpp_clz(static_cast(__t)) - (numeric_limits::digits - numeric_limits<_Tp>::digits); diff --git a/libcxx/include/__bit/countr.h b/libcxx/include/__bit/countr.h index 5907f6fc9c745..724a0bc23801c 100644 --- a/libcxx/include/__bit/countr.h +++ b/libcxx/include/__bit/countr.h @@ -40,12 +40,11 @@ _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int __libcpp_ct template _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int __countr_zero(_Tp __t) _NOEXCEPT { - if (__t == 0) - return numeric_limits<_Tp>::digits; - #if __has_builtin(__builtin_ctzg) - return __builtin_ctzg(__t); + return __builtin_ctzg(__t, numeric_limits<_Tp>::digits); #else // __has_builtin(__builtin_ctzg) + if (__t == 0) + return numeric_limits<_Tp>::digits; if (sizeof(_Tp) <= sizeof(unsigned int)) return std::__libcpp_ctz(static_cast(__t)); else if (sizeof(_Tp) <= sizeof(unsigned long))