[libcxx-commits] [libcxx] [libc++] Optimize `to_chars` for bases 2, 8 and 16 (PR #223222)
David Bayer via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Sep 13 04:21:32 PDT 2026
================
@@ -126,21 +131,32 @@ struct _LIBCPP_HIDDEN __integral<2> {
int __n = __width(__value);
if (__n > __cap)
return {__last, errc::value_too_large};
-
__last = __first + __n;
char* __p = __last;
- const unsigned __divisor = 16;
- while (__value > __divisor) {
- unsigned __c = __value % __divisor;
+
+ constexpr auto __ncs_per_word = 8u;
+ constexpr auto __divisor = 1u << __ncs_per_word;
+ constexpr auto __dep_mask = uint64_t{0x0101'0101'0101'0101};
+ constexpr auto __c0_offset_mask = uint64_t{0x3030'3030'3030'3030};
+ while (__value >= __divisor) {
+ const auto __digits = __builtin_elementwise_pdep(static_cast<uint64_t>(__value), __dep_mask);
----------------
davebayer wrote:
Absolutely, I just wanted to discuss first whether you want this thing in before spending the time on portability and more performance analysis
https://github.com/llvm/llvm-project/pull/223222
More information about the libcxx-commits
mailing list