[libcxx-commits] [libcxx] [libc++] Remove _BitScanForward{, 64} (PR #205551)

via libcxx-commits libcxx-commits at lists.llvm.org
Wed Jun 24 07:49:03 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Nikolas Klauser (philnik777)

<details>
<summary>Changes</summary>

`std::countr_zero` can be used instead, which is a standard API.


---
Full diff: https://github.com/llvm/llvm-project/pull/205551.diff


5 Files Affected:

- (modified) libcxx/include/__config (-6) 
- (modified) libcxx/include/__cxx03/__config (-3) 
- (modified) libcxx/src/include/ryu/ryu.h (-18) 
- (modified) libcxx/src/ryu/d2s.cpp (+2-13) 
- (modified) libcxx/src/ryu/f2s.cpp (+2-2) 


``````````diff
diff --git a/libcxx/include/__config b/libcxx/include/__config
index fc7a121d52783..a4991c3b4662f 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -76,15 +76,9 @@
 #    if defined(_MSC_VER) && !defined(__MINGW32__)
 #      define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
 #    endif
-#    if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__))
-#      define _LIBCPP_HAS_BITSCAN64 1
-#    else
-#      define _LIBCPP_HAS_BITSCAN64 0
-#    endif
 #    define _LIBCPP_HAS_OPEN_WITH_WCHAR 1
 #  else
 #    define _LIBCPP_HAS_OPEN_WITH_WCHAR 0
-#    define _LIBCPP_HAS_BITSCAN64 0
 #  endif // defined(_WIN32)
 
 #  if defined(_AIX) && !defined(__64BIT__)
diff --git a/libcxx/include/__cxx03/__config b/libcxx/include/__cxx03/__config
index 27c26084da4b1..383b87e44618b 100644
--- a/libcxx/include/__cxx03/__config
+++ b/libcxx/include/__cxx03/__config
@@ -229,9 +229,6 @@ _LIBCPP_HARDENING_MODE_DEBUG
 #    if defined(_MSC_VER) && !defined(__MINGW32__)
 #      define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
 #    endif
-#    if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__))
-#      define _LIBCPP_HAS_BITSCAN64
-#    endif
 #    define _LIBCPP_HAS_OPEN_WITH_WCHAR
 #  endif // defined(_WIN32)
 
diff --git a/libcxx/src/include/ryu/ryu.h b/libcxx/src/include/ryu/ryu.h
index 7b19ecfec5915..4f64f4a6fe80f 100644
--- a/libcxx/src/include/ryu/ryu.h
+++ b/libcxx/src/include/ryu/ryu.h
@@ -67,24 +67,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 // https://github.com/ulfjack/ryu/tree/59661c3/ryu
 
-#if !defined(_MSC_VER)
-_LIBCPP_HIDE_FROM_ABI inline unsigned char _BitScanForward64(unsigned long* __index, unsigned long long __mask) {
-  if (__mask == 0) {
-    return false;
-  }
-  *__index = __builtin_ctzll(__mask);
-  return true;
-}
-
-_LIBCPP_HIDE_FROM_ABI inline unsigned char _BitScanForward(unsigned long* __index, unsigned int __mask) {
-  if (__mask == 0) {
-    return false;
-  }
-  *__index = __builtin_ctz(__mask);
-  return true;
-}
-#endif  // !_MSC_VER
-
 template <class _Floating>
 [[nodiscard]] to_chars_result _Floating_to_chars_ryu(
     char* const _First, char* const _Last, const _Floating _Value, const chars_format _Fmt) noexcept {
diff --git a/libcxx/src/ryu/d2s.cpp b/libcxx/src/ryu/d2s.cpp
index c0d11107f880b..0000333244b86 100644
--- a/libcxx/src/ryu/d2s.cpp
+++ b/libcxx/src/ryu/d2s.cpp
@@ -41,6 +41,7 @@
 
 #include <__assert>
 #include <__config>
+#include <bit>
 #include <charconv>
 #include <cstddef>
 
@@ -478,19 +479,7 @@ struct __floating_decimal_64 {
           2882303761517u, 576460752303u, 115292150460u, 23058430092u, 4611686018u, 922337203u, 184467440u,
           36893488u, 7378697u, 1475739u, 295147u, 59029u, 11805u, 2361u, 472u, 94u, 18u, 3u };
 
-        unsigned long _Trailing_zero_bits;
-#if _LIBCPP_HAS_BITSCAN64
-        (void) _BitScanForward64(&_Trailing_zero_bits, __v.__mantissa); // __v.__mantissa is guaranteed nonzero
-#else // ^^^ 64-bit ^^^ / vvv 32-bit vvv
-        const uint32_t _Low_mantissa = static_cast<uint32_t>(__v.__mantissa);
-        if (_Low_mantissa != 0) {
-          (void) _BitScanForward(&_Trailing_zero_bits, _Low_mantissa);
-        } else {
-          const uint32_t _High_mantissa = static_cast<uint32_t>(__v.__mantissa >> 32); // nonzero here
-          (void) _BitScanForward(&_Trailing_zero_bits, _High_mantissa);
-          _Trailing_zero_bits += 32;
-        }
-#endif // ^^^ 32-bit ^^^
+        unsigned long _Trailing_zero_bits = std::countr_zero(__v.__mantissa);
         const uint64_t _Shifted_mantissa = __v.__mantissa >> _Trailing_zero_bits;
         _Can_use_ryu = _Shifted_mantissa <= _Max_shifted_mantissa[_Ryu_exponent];
       }
diff --git a/libcxx/src/ryu/f2s.cpp b/libcxx/src/ryu/f2s.cpp
index f1f8cdf83f86a..aef41601056b8 100644
--- a/libcxx/src/ryu/f2s.cpp
+++ b/libcxx/src/ryu/f2s.cpp
@@ -41,6 +41,7 @@
 
 #include <__assert>
 #include <__config>
+#include <bit>
 #include <charconv>
 #include <cstdint>
 #include <cstddef>
@@ -535,8 +536,7 @@ struct __floating_decimal_32 {
         static constexpr uint32_t _Max_shifted_mantissa[11] = {
           16777215, 3355443, 671088, 134217, 26843, 5368, 1073, 214, 42, 8, 1 };
 
-        unsigned long _Trailing_zero_bits;
-        (void) _BitScanForward(&_Trailing_zero_bits, __v.__mantissa); // __v.__mantissa is guaranteed nonzero
+        unsigned long _Trailing_zero_bits = std::countr_zero(__v.__mantissa); // __v.__mantissa is guaranteed nonzero
         const uint32_t _Shifted_mantissa = __v.__mantissa >> _Trailing_zero_bits;
         _Can_use_ryu = _Shifted_mantissa <= _Max_shifted_mantissa[_Ryu_exponent];
       }

``````````

</details>


https://github.com/llvm/llvm-project/pull/205551


More information about the libcxx-commits mailing list