xref: /llvm-project/libcxx/src/ryu/f2s.cpp (revision bed1a5b3426059f2418f7be90c53a247ce082680)
1abb5dd6eSMark de Wever //===----------------------------------------------------------------------===//
2abb5dd6eSMark de Wever //
3abb5dd6eSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4abb5dd6eSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5abb5dd6eSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6abb5dd6eSMark de Wever //
7abb5dd6eSMark de Wever //===----------------------------------------------------------------------===//
8abb5dd6eSMark de Wever 
9abb5dd6eSMark de Wever // Copyright (c) Microsoft Corporation.
10abb5dd6eSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
11abb5dd6eSMark de Wever 
12abb5dd6eSMark de Wever // Copyright 2018 Ulf Adams
13abb5dd6eSMark de Wever // Copyright (c) Microsoft Corporation. All rights reserved.
14abb5dd6eSMark de Wever 
15abb5dd6eSMark de Wever // Boost Software License - Version 1.0 - August 17th, 2003
16abb5dd6eSMark de Wever 
17abb5dd6eSMark de Wever // Permission is hereby granted, free of charge, to any person or organization
18abb5dd6eSMark de Wever // obtaining a copy of the software and accompanying documentation covered by
19abb5dd6eSMark de Wever // this license (the "Software") to use, reproduce, display, distribute,
20abb5dd6eSMark de Wever // execute, and transmit the Software, and to prepare derivative works of the
21abb5dd6eSMark de Wever // Software, and to permit third-parties to whom the Software is furnished to
22abb5dd6eSMark de Wever // do so, all subject to the following:
23abb5dd6eSMark de Wever 
24abb5dd6eSMark de Wever // The copyright notices in the Software and this entire statement, including
25abb5dd6eSMark de Wever // the above license grant, this restriction and the following disclaimer,
26abb5dd6eSMark de Wever // must be included in all copies of the Software, in whole or in part, and
27abb5dd6eSMark de Wever // all derivative works of the Software, unless such copies or derivative
28abb5dd6eSMark de Wever // works are solely in the form of machine-executable object code generated by
29abb5dd6eSMark de Wever // a source language processor.
30abb5dd6eSMark de Wever 
31abb5dd6eSMark de Wever // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32abb5dd6eSMark de Wever // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33abb5dd6eSMark de Wever // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
34abb5dd6eSMark de Wever // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
35abb5dd6eSMark de Wever // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
36abb5dd6eSMark de Wever // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
37abb5dd6eSMark de Wever // DEALINGS IN THE SOFTWARE.
38abb5dd6eSMark de Wever 
39abb5dd6eSMark de Wever // Avoid formatting to keep the changes with the original code minimal.
40abb5dd6eSMark de Wever // clang-format off
41abb5dd6eSMark de Wever 
42f87aa19bSLouis Dionne #include <__assert>
43bbb0f2c7SArthur O'Dwyer #include <__config>
44bbb0f2c7SArthur O'Dwyer #include <charconv>
45abb5dd6eSMark de Wever 
46abb5dd6eSMark de Wever #include "include/ryu/common.h"
47abb5dd6eSMark de Wever #include "include/ryu/d2fixed.h"
48abb5dd6eSMark de Wever #include "include/ryu/d2s_intrinsics.h"
49abb5dd6eSMark de Wever #include "include/ryu/digit_table.h"
50abb5dd6eSMark de Wever #include "include/ryu/f2s.h"
51abb5dd6eSMark de Wever #include "include/ryu/ryu.h"
52abb5dd6eSMark de Wever 
53abb5dd6eSMark de Wever _LIBCPP_BEGIN_NAMESPACE_STD
54abb5dd6eSMark de Wever 
55abb5dd6eSMark de Wever inline constexpr int __FLOAT_MANTISSA_BITS = 23;
56abb5dd6eSMark de Wever inline constexpr int __FLOAT_EXPONENT_BITS = 8;
57abb5dd6eSMark de Wever inline constexpr int __FLOAT_BIAS = 127;
58abb5dd6eSMark de Wever 
59abb5dd6eSMark de Wever inline constexpr int __FLOAT_POW5_INV_BITCOUNT = 59;
60abb5dd6eSMark de Wever inline constexpr uint64_t __FLOAT_POW5_INV_SPLIT[31] = {
61abb5dd6eSMark de Wever   576460752303423489u, 461168601842738791u, 368934881474191033u, 295147905179352826u,
62abb5dd6eSMark de Wever   472236648286964522u, 377789318629571618u, 302231454903657294u, 483570327845851670u,
63abb5dd6eSMark de Wever   386856262276681336u, 309485009821345069u, 495176015714152110u, 396140812571321688u,
64abb5dd6eSMark de Wever   316912650057057351u, 507060240091291761u, 405648192073033409u, 324518553658426727u,
65abb5dd6eSMark de Wever   519229685853482763u, 415383748682786211u, 332306998946228969u, 531691198313966350u,
66abb5dd6eSMark de Wever   425352958651173080u, 340282366920938464u, 544451787073501542u, 435561429658801234u,
67abb5dd6eSMark de Wever   348449143727040987u, 557518629963265579u, 446014903970612463u, 356811923176489971u,
68abb5dd6eSMark de Wever   570899077082383953u, 456719261665907162u, 365375409332725730u
69abb5dd6eSMark de Wever };
70abb5dd6eSMark de Wever inline constexpr int __FLOAT_POW5_BITCOUNT = 61;
71abb5dd6eSMark de Wever inline constexpr uint64_t __FLOAT_POW5_SPLIT[47] = {
72abb5dd6eSMark de Wever   1152921504606846976u, 1441151880758558720u, 1801439850948198400u, 2251799813685248000u,
73abb5dd6eSMark de Wever   1407374883553280000u, 1759218604441600000u, 2199023255552000000u, 1374389534720000000u,
74abb5dd6eSMark de Wever   1717986918400000000u, 2147483648000000000u, 1342177280000000000u, 1677721600000000000u,
75abb5dd6eSMark de Wever   2097152000000000000u, 1310720000000000000u, 1638400000000000000u, 2048000000000000000u,
76abb5dd6eSMark de Wever   1280000000000000000u, 1600000000000000000u, 2000000000000000000u, 1250000000000000000u,
77abb5dd6eSMark de Wever   1562500000000000000u, 1953125000000000000u, 1220703125000000000u, 1525878906250000000u,
78abb5dd6eSMark de Wever   1907348632812500000u, 1192092895507812500u, 1490116119384765625u, 1862645149230957031u,
79abb5dd6eSMark de Wever   1164153218269348144u, 1455191522836685180u, 1818989403545856475u, 2273736754432320594u,
80abb5dd6eSMark de Wever   1421085471520200371u, 1776356839400250464u, 2220446049250313080u, 1387778780781445675u,
81abb5dd6eSMark de Wever   1734723475976807094u, 2168404344971008868u, 1355252715606880542u, 1694065894508600678u,
82abb5dd6eSMark de Wever   2117582368135750847u, 1323488980084844279u, 1654361225106055349u, 2067951531382569187u,
83abb5dd6eSMark de Wever   1292469707114105741u, 1615587133892632177u, 2019483917365790221u
84abb5dd6eSMark de Wever };
85abb5dd6eSMark de Wever 
__pow5Factor(uint32_t __value)86abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __pow5Factor(uint32_t __value) {
87abb5dd6eSMark de Wever   uint32_t __count = 0;
88abb5dd6eSMark de Wever   for (;;) {
89*bed1a5b3SKonstantin Varlamov     _LIBCPP_ASSERT_INTERNAL(__value != 0, "");
90abb5dd6eSMark de Wever     const uint32_t __q = __value / 5;
91abb5dd6eSMark de Wever     const uint32_t __r = __value % 5;
92abb5dd6eSMark de Wever     if (__r != 0) {
93abb5dd6eSMark de Wever       break;
94abb5dd6eSMark de Wever     }
95abb5dd6eSMark de Wever     __value = __q;
96abb5dd6eSMark de Wever     ++__count;
97abb5dd6eSMark de Wever   }
98abb5dd6eSMark de Wever   return __count;
99abb5dd6eSMark de Wever }
100abb5dd6eSMark de Wever 
101abb5dd6eSMark de Wever // Returns true if __value is divisible by 5^__p.
__multipleOfPowerOf5(const uint32_t __value,const uint32_t __p)102abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf5(const uint32_t __value, const uint32_t __p) {
103abb5dd6eSMark de Wever   return __pow5Factor(__value) >= __p;
104abb5dd6eSMark de Wever }
105abb5dd6eSMark de Wever 
106abb5dd6eSMark de Wever // Returns true if __value is divisible by 2^__p.
__multipleOfPowerOf2(const uint32_t __value,const uint32_t __p)107abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf2(const uint32_t __value, const uint32_t __p) {
108*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(__value != 0, "");
109*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(__p < 32, "");
110abb5dd6eSMark de Wever   // __builtin_ctz doesn't appear to be faster here.
111abb5dd6eSMark de Wever   return (__value & ((1u << __p) - 1)) == 0;
112abb5dd6eSMark de Wever }
113abb5dd6eSMark de Wever 
__mulShift(const uint32_t __m,const uint64_t __factor,const int32_t __shift)114abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulShift(const uint32_t __m, const uint64_t __factor, const int32_t __shift) {
115*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(__shift > 32, "");
116abb5dd6eSMark de Wever 
117abb5dd6eSMark de Wever   // The casts here help MSVC to avoid calls to the __allmul library
118abb5dd6eSMark de Wever   // function.
119abb5dd6eSMark de Wever   const uint32_t __factorLo = static_cast<uint32_t>(__factor);
120abb5dd6eSMark de Wever   const uint32_t __factorHi = static_cast<uint32_t>(__factor >> 32);
121abb5dd6eSMark de Wever   const uint64_t __bits0 = static_cast<uint64_t>(__m) * __factorLo;
122abb5dd6eSMark de Wever   const uint64_t __bits1 = static_cast<uint64_t>(__m) * __factorHi;
123abb5dd6eSMark de Wever 
124abb5dd6eSMark de Wever #ifndef _LIBCPP_64_BIT
125abb5dd6eSMark de Wever   // On 32-bit platforms we can avoid a 64-bit shift-right since we only
126abb5dd6eSMark de Wever   // need the upper 32 bits of the result and the shift value is > 32.
127abb5dd6eSMark de Wever   const uint32_t __bits0Hi = static_cast<uint32_t>(__bits0 >> 32);
128abb5dd6eSMark de Wever   uint32_t __bits1Lo = static_cast<uint32_t>(__bits1);
129abb5dd6eSMark de Wever   uint32_t __bits1Hi = static_cast<uint32_t>(__bits1 >> 32);
130abb5dd6eSMark de Wever   __bits1Lo += __bits0Hi;
131abb5dd6eSMark de Wever   __bits1Hi += (__bits1Lo < __bits0Hi);
132abb5dd6eSMark de Wever   const int32_t __s = __shift - 32;
133abb5dd6eSMark de Wever   return (__bits1Hi << (32 - __s)) | (__bits1Lo >> __s);
134abb5dd6eSMark de Wever #else // ^^^ 32-bit ^^^ / vvv 64-bit vvv
135abb5dd6eSMark de Wever   const uint64_t __sum = (__bits0 >> 32) + __bits1;
136abb5dd6eSMark de Wever   const uint64_t __shiftedSum = __sum >> (__shift - 32);
137*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(__shiftedSum <= UINT32_MAX, "");
138abb5dd6eSMark de Wever   return static_cast<uint32_t>(__shiftedSum);
139abb5dd6eSMark de Wever #endif // ^^^ 64-bit ^^^
140abb5dd6eSMark de Wever }
141abb5dd6eSMark de Wever 
__mulPow5InvDivPow2(const uint32_t __m,const uint32_t __q,const int32_t __j)142abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulPow5InvDivPow2(const uint32_t __m, const uint32_t __q, const int32_t __j) {
143abb5dd6eSMark de Wever   return __mulShift(__m, __FLOAT_POW5_INV_SPLIT[__q], __j);
144abb5dd6eSMark de Wever }
145abb5dd6eSMark de Wever 
__mulPow5divPow2(const uint32_t __m,const uint32_t __i,const int32_t __j)146abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulPow5divPow2(const uint32_t __m, const uint32_t __i, const int32_t __j) {
147abb5dd6eSMark de Wever   return __mulShift(__m, __FLOAT_POW5_SPLIT[__i], __j);
148abb5dd6eSMark de Wever }
149abb5dd6eSMark de Wever 
150abb5dd6eSMark de Wever // A floating decimal representing m * 10^e.
151abb5dd6eSMark de Wever struct __floating_decimal_32 {
152abb5dd6eSMark de Wever   uint32_t __mantissa;
153abb5dd6eSMark de Wever   int32_t __exponent;
154abb5dd6eSMark de Wever };
155abb5dd6eSMark de Wever 
__f2d(const uint32_t __ieeeMantissa,const uint32_t __ieeeExponent)156abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline __floating_decimal_32 __f2d(const uint32_t __ieeeMantissa, const uint32_t __ieeeExponent) {
157abb5dd6eSMark de Wever   int32_t __e2;
158abb5dd6eSMark de Wever   uint32_t __m2;
159abb5dd6eSMark de Wever   if (__ieeeExponent == 0) {
160abb5dd6eSMark de Wever     // We subtract 2 so that the bounds computation has 2 additional bits.
161abb5dd6eSMark de Wever     __e2 = 1 - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS - 2;
162abb5dd6eSMark de Wever     __m2 = __ieeeMantissa;
163abb5dd6eSMark de Wever   } else {
164abb5dd6eSMark de Wever     __e2 = static_cast<int32_t>(__ieeeExponent) - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS - 2;
165abb5dd6eSMark de Wever     __m2 = (1u << __FLOAT_MANTISSA_BITS) | __ieeeMantissa;
166abb5dd6eSMark de Wever   }
167abb5dd6eSMark de Wever   const bool __even = (__m2 & 1) == 0;
168abb5dd6eSMark de Wever   const bool __acceptBounds = __even;
169abb5dd6eSMark de Wever 
170abb5dd6eSMark de Wever   // Step 2: Determine the interval of valid decimal representations.
171abb5dd6eSMark de Wever   const uint32_t __mv = 4 * __m2;
172abb5dd6eSMark de Wever   const uint32_t __mp = 4 * __m2 + 2;
173abb5dd6eSMark de Wever   // Implicit bool -> int conversion. True is 1, false is 0.
174abb5dd6eSMark de Wever   const uint32_t __mmShift = __ieeeMantissa != 0 || __ieeeExponent <= 1;
175abb5dd6eSMark de Wever   const uint32_t __mm = 4 * __m2 - 1 - __mmShift;
176abb5dd6eSMark de Wever 
177abb5dd6eSMark de Wever   // Step 3: Convert to a decimal power base using 64-bit arithmetic.
178abb5dd6eSMark de Wever   uint32_t __vr, __vp, __vm;
179abb5dd6eSMark de Wever   int32_t __e10;
180abb5dd6eSMark de Wever   bool __vmIsTrailingZeros = false;
181abb5dd6eSMark de Wever   bool __vrIsTrailingZeros = false;
182abb5dd6eSMark de Wever   uint8_t __lastRemovedDigit = 0;
183abb5dd6eSMark de Wever   if (__e2 >= 0) {
184abb5dd6eSMark de Wever     const uint32_t __q = __log10Pow2(__e2);
185abb5dd6eSMark de Wever     __e10 = static_cast<int32_t>(__q);
186abb5dd6eSMark de Wever     const int32_t __k = __FLOAT_POW5_INV_BITCOUNT + __pow5bits(static_cast<int32_t>(__q)) - 1;
187abb5dd6eSMark de Wever     const int32_t __i = -__e2 + static_cast<int32_t>(__q) + __k;
188abb5dd6eSMark de Wever     __vr = __mulPow5InvDivPow2(__mv, __q, __i);
189abb5dd6eSMark de Wever     __vp = __mulPow5InvDivPow2(__mp, __q, __i);
190abb5dd6eSMark de Wever     __vm = __mulPow5InvDivPow2(__mm, __q, __i);
191abb5dd6eSMark de Wever     if (__q != 0 && (__vp - 1) / 10 <= __vm / 10) {
192abb5dd6eSMark de Wever       // We need to know one removed digit even if we are not going to loop below. We could use
193abb5dd6eSMark de Wever       // __q = X - 1 above, except that would require 33 bits for the result, and we've found that
194abb5dd6eSMark de Wever       // 32-bit arithmetic is faster even on 64-bit machines.
195abb5dd6eSMark de Wever       const int32_t __l = __FLOAT_POW5_INV_BITCOUNT + __pow5bits(static_cast<int32_t>(__q - 1)) - 1;
196abb5dd6eSMark de Wever       __lastRemovedDigit = static_cast<uint8_t>(__mulPow5InvDivPow2(__mv, __q - 1,
197abb5dd6eSMark de Wever         -__e2 + static_cast<int32_t>(__q) - 1 + __l) % 10);
198abb5dd6eSMark de Wever     }
199abb5dd6eSMark de Wever     if (__q <= 9) {
200abb5dd6eSMark de Wever       // The largest power of 5 that fits in 24 bits is 5^10, but __q <= 9 seems to be safe as well.
201abb5dd6eSMark de Wever       // Only one of __mp, __mv, and __mm can be a multiple of 5, if any.
202abb5dd6eSMark de Wever       if (__mv % 5 == 0) {
203abb5dd6eSMark de Wever         __vrIsTrailingZeros = __multipleOfPowerOf5(__mv, __q);
204abb5dd6eSMark de Wever       } else if (__acceptBounds) {
205abb5dd6eSMark de Wever         __vmIsTrailingZeros = __multipleOfPowerOf5(__mm, __q);
206abb5dd6eSMark de Wever       } else {
207abb5dd6eSMark de Wever         __vp -= __multipleOfPowerOf5(__mp, __q);
208abb5dd6eSMark de Wever       }
209abb5dd6eSMark de Wever     }
210abb5dd6eSMark de Wever   } else {
211abb5dd6eSMark de Wever     const uint32_t __q = __log10Pow5(-__e2);
212abb5dd6eSMark de Wever     __e10 = static_cast<int32_t>(__q) + __e2;
213abb5dd6eSMark de Wever     const int32_t __i = -__e2 - static_cast<int32_t>(__q);
214abb5dd6eSMark de Wever     const int32_t __k = __pow5bits(__i) - __FLOAT_POW5_BITCOUNT;
215abb5dd6eSMark de Wever     int32_t __j = static_cast<int32_t>(__q) - __k;
216abb5dd6eSMark de Wever     __vr = __mulPow5divPow2(__mv, static_cast<uint32_t>(__i), __j);
217abb5dd6eSMark de Wever     __vp = __mulPow5divPow2(__mp, static_cast<uint32_t>(__i), __j);
218abb5dd6eSMark de Wever     __vm = __mulPow5divPow2(__mm, static_cast<uint32_t>(__i), __j);
219abb5dd6eSMark de Wever     if (__q != 0 && (__vp - 1) / 10 <= __vm / 10) {
220abb5dd6eSMark de Wever       __j = static_cast<int32_t>(__q) - 1 - (__pow5bits(__i + 1) - __FLOAT_POW5_BITCOUNT);
221abb5dd6eSMark de Wever       __lastRemovedDigit = static_cast<uint8_t>(__mulPow5divPow2(__mv, static_cast<uint32_t>(__i + 1), __j) % 10);
222abb5dd6eSMark de Wever     }
223abb5dd6eSMark de Wever     if (__q <= 1) {
224abb5dd6eSMark de Wever       // {__vr,__vp,__vm} is trailing zeros if {__mv,__mp,__mm} has at least __q trailing 0 bits.
225abb5dd6eSMark de Wever       // __mv = 4 * __m2, so it always has at least two trailing 0 bits.
226abb5dd6eSMark de Wever       __vrIsTrailingZeros = true;
227abb5dd6eSMark de Wever       if (__acceptBounds) {
228abb5dd6eSMark de Wever         // __mm = __mv - 1 - __mmShift, so it has 1 trailing 0 bit iff __mmShift == 1.
229abb5dd6eSMark de Wever         __vmIsTrailingZeros = __mmShift == 1;
230abb5dd6eSMark de Wever       } else {
231abb5dd6eSMark de Wever         // __mp = __mv + 2, so it always has at least one trailing 0 bit.
232abb5dd6eSMark de Wever         --__vp;
233abb5dd6eSMark de Wever       }
234abb5dd6eSMark de Wever     } else if (__q < 31) { // TRANSITION(ulfjack): Use a tighter bound here.
235abb5dd6eSMark de Wever       __vrIsTrailingZeros = __multipleOfPowerOf2(__mv, __q - 1);
236abb5dd6eSMark de Wever     }
237abb5dd6eSMark de Wever   }
238abb5dd6eSMark de Wever 
239abb5dd6eSMark de Wever   // Step 4: Find the shortest decimal representation in the interval of valid representations.
240abb5dd6eSMark de Wever   int32_t __removed = 0;
241abb5dd6eSMark de Wever   uint32_t _Output;
242abb5dd6eSMark de Wever   if (__vmIsTrailingZeros || __vrIsTrailingZeros) {
243abb5dd6eSMark de Wever     // General case, which happens rarely (~4.0%).
244abb5dd6eSMark de Wever     while (__vp / 10 > __vm / 10) {
245abb5dd6eSMark de Wever #ifdef __clang__ // TRANSITION, LLVM-23106
246abb5dd6eSMark de Wever       __vmIsTrailingZeros &= __vm - (__vm / 10) * 10 == 0;
247abb5dd6eSMark de Wever #else
248abb5dd6eSMark de Wever       __vmIsTrailingZeros &= __vm % 10 == 0;
249abb5dd6eSMark de Wever #endif
250abb5dd6eSMark de Wever       __vrIsTrailingZeros &= __lastRemovedDigit == 0;
251abb5dd6eSMark de Wever       __lastRemovedDigit = static_cast<uint8_t>(__vr % 10);
252abb5dd6eSMark de Wever       __vr /= 10;
253abb5dd6eSMark de Wever       __vp /= 10;
254abb5dd6eSMark de Wever       __vm /= 10;
255abb5dd6eSMark de Wever       ++__removed;
256abb5dd6eSMark de Wever     }
257abb5dd6eSMark de Wever     if (__vmIsTrailingZeros) {
258abb5dd6eSMark de Wever       while (__vm % 10 == 0) {
259abb5dd6eSMark de Wever         __vrIsTrailingZeros &= __lastRemovedDigit == 0;
260abb5dd6eSMark de Wever         __lastRemovedDigit = static_cast<uint8_t>(__vr % 10);
261abb5dd6eSMark de Wever         __vr /= 10;
262abb5dd6eSMark de Wever         __vp /= 10;
263abb5dd6eSMark de Wever         __vm /= 10;
264abb5dd6eSMark de Wever         ++__removed;
265abb5dd6eSMark de Wever       }
266abb5dd6eSMark de Wever     }
267abb5dd6eSMark de Wever     if (__vrIsTrailingZeros && __lastRemovedDigit == 5 && __vr % 2 == 0) {
268abb5dd6eSMark de Wever       // Round even if the exact number is .....50..0.
269abb5dd6eSMark de Wever       __lastRemovedDigit = 4;
270abb5dd6eSMark de Wever     }
271abb5dd6eSMark de Wever     // We need to take __vr + 1 if __vr is outside bounds or we need to round up.
272abb5dd6eSMark de Wever     _Output = __vr + ((__vr == __vm && (!__acceptBounds || !__vmIsTrailingZeros)) || __lastRemovedDigit >= 5);
273abb5dd6eSMark de Wever   } else {
274abb5dd6eSMark de Wever     // Specialized for the common case (~96.0%). Percentages below are relative to this.
275abb5dd6eSMark de Wever     // Loop iterations below (approximately):
276abb5dd6eSMark de Wever     // 0: 13.6%, 1: 70.7%, 2: 14.1%, 3: 1.39%, 4: 0.14%, 5+: 0.01%
277abb5dd6eSMark de Wever     while (__vp / 10 > __vm / 10) {
278abb5dd6eSMark de Wever       __lastRemovedDigit = static_cast<uint8_t>(__vr % 10);
279abb5dd6eSMark de Wever       __vr /= 10;
280abb5dd6eSMark de Wever       __vp /= 10;
281abb5dd6eSMark de Wever       __vm /= 10;
282abb5dd6eSMark de Wever       ++__removed;
283abb5dd6eSMark de Wever     }
284abb5dd6eSMark de Wever     // We need to take __vr + 1 if __vr is outside bounds or we need to round up.
285abb5dd6eSMark de Wever     _Output = __vr + (__vr == __vm || __lastRemovedDigit >= 5);
286abb5dd6eSMark de Wever   }
287abb5dd6eSMark de Wever   const int32_t __exp = __e10 + __removed;
288abb5dd6eSMark de Wever 
289abb5dd6eSMark de Wever   __floating_decimal_32 __fd;
290abb5dd6eSMark de Wever   __fd.__exponent = __exp;
291abb5dd6eSMark de Wever   __fd.__mantissa = _Output;
292abb5dd6eSMark de Wever   return __fd;
293abb5dd6eSMark de Wever }
294abb5dd6eSMark de Wever 
_Large_integer_to_chars(char * const _First,char * const _Last,const uint32_t _Mantissa2,const int32_t _Exponent2)295abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline to_chars_result _Large_integer_to_chars(char* const _First, char* const _Last,
296abb5dd6eSMark de Wever   const uint32_t _Mantissa2, const int32_t _Exponent2) {
297abb5dd6eSMark de Wever 
298abb5dd6eSMark de Wever   // Print the integer _Mantissa2 * 2^_Exponent2 exactly.
299abb5dd6eSMark de Wever 
300abb5dd6eSMark de Wever   // For nonzero integers, _Exponent2 >= -23. (The minimum value occurs when _Mantissa2 * 2^_Exponent2 is 1.
301abb5dd6eSMark de Wever   // In that case, _Mantissa2 is the implicit 1 bit followed by 23 zeros, so _Exponent2 is -23 to shift away
302abb5dd6eSMark de Wever   // the zeros.) The dense range of exactly representable integers has negative or zero exponents
303abb5dd6eSMark de Wever   // (as positive exponents make the range non-dense). For that dense range, Ryu will always be used:
304abb5dd6eSMark de Wever   // every digit is necessary to uniquely identify the value, so Ryu must print them all.
305abb5dd6eSMark de Wever 
306abb5dd6eSMark de Wever   // Positive exponents are the non-dense range of exactly representable integers.
307abb5dd6eSMark de Wever   // This contains all of the values for which Ryu can't be used (and a few Ryu-friendly values).
308abb5dd6eSMark de Wever 
309abb5dd6eSMark de Wever   // Performance note: Long division appears to be faster than losslessly widening float to double and calling
310abb5dd6eSMark de Wever   // __d2fixed_buffered_n(). If __f2fixed_buffered_n() is implemented, it might be faster than long division.
311abb5dd6eSMark de Wever 
312*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(_Exponent2 > 0, "");
313*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(_Exponent2 <= 104, ""); // because __ieeeExponent <= 254
314abb5dd6eSMark de Wever 
315abb5dd6eSMark de Wever   // Manually represent _Mantissa2 * 2^_Exponent2 as a large integer. _Mantissa2 is always 24 bits
316abb5dd6eSMark de Wever   // (due to the implicit bit), while _Exponent2 indicates a shift of at most 104 bits.
317abb5dd6eSMark de Wever   // 24 + 104 equals 128 equals 4 * 32, so we need exactly 4 32-bit elements.
318abb5dd6eSMark de Wever   // We use a little-endian representation, visualized like this:
319abb5dd6eSMark de Wever 
320abb5dd6eSMark de Wever   // << left shift <<
321abb5dd6eSMark de Wever   // most significant
322abb5dd6eSMark de Wever   // _Data[3] _Data[2] _Data[1] _Data[0]
323abb5dd6eSMark de Wever   //                   least significant
324abb5dd6eSMark de Wever   //                   >> right shift >>
325abb5dd6eSMark de Wever 
326abb5dd6eSMark de Wever   constexpr uint32_t _Data_size = 4;
327abb5dd6eSMark de Wever   uint32_t _Data[_Data_size]{};
328abb5dd6eSMark de Wever 
329abb5dd6eSMark de Wever   // _Maxidx is the index of the most significant nonzero element.
330abb5dd6eSMark de Wever   uint32_t _Maxidx = ((24 + static_cast<uint32_t>(_Exponent2) + 31) / 32) - 1;
331*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(_Maxidx < _Data_size, "");
332abb5dd6eSMark de Wever 
333abb5dd6eSMark de Wever   const uint32_t _Bit_shift = static_cast<uint32_t>(_Exponent2) % 32;
334abb5dd6eSMark de Wever   if (_Bit_shift <= 8) { // _Mantissa2's 24 bits don't cross an element boundary
335abb5dd6eSMark de Wever     _Data[_Maxidx] = _Mantissa2 << _Bit_shift;
336abb5dd6eSMark de Wever   } else { // _Mantissa2's 24 bits cross an element boundary
337abb5dd6eSMark de Wever     _Data[_Maxidx - 1] = _Mantissa2 << _Bit_shift;
338abb5dd6eSMark de Wever     _Data[_Maxidx] = _Mantissa2 >> (32 - _Bit_shift);
339abb5dd6eSMark de Wever   }
340abb5dd6eSMark de Wever 
341abb5dd6eSMark de Wever   // If Ryu hasn't determined the total output length, we need to buffer the digits generated from right to left
342abb5dd6eSMark de Wever   // by long division. The largest possible float is: 340'282346638'528859811'704183484'516925440
343abb5dd6eSMark de Wever   uint32_t _Blocks[4];
344abb5dd6eSMark de Wever   int32_t _Filled_blocks = 0;
345abb5dd6eSMark de Wever   // From left to right, we're going to print:
346abb5dd6eSMark de Wever   // _Data[0] will be [1, 10] digits.
347abb5dd6eSMark de Wever   // Then if _Filled_blocks > 0:
348abb5dd6eSMark de Wever   // _Blocks[_Filled_blocks - 1], ..., _Blocks[0] will be 0-filled 9-digit blocks.
349abb5dd6eSMark de Wever 
350abb5dd6eSMark de Wever   if (_Maxidx != 0) { // If the integer is actually large, perform long division.
351abb5dd6eSMark de Wever                       // Otherwise, skip to printing _Data[0].
352abb5dd6eSMark de Wever     for (;;) {
353abb5dd6eSMark de Wever       // Loop invariant: _Maxidx != 0 (i.e. the integer is actually large)
354abb5dd6eSMark de Wever 
355abb5dd6eSMark de Wever       const uint32_t _Most_significant_elem = _Data[_Maxidx];
356abb5dd6eSMark de Wever       const uint32_t _Initial_remainder = _Most_significant_elem % 1000000000;
357abb5dd6eSMark de Wever       const uint32_t _Initial_quotient = _Most_significant_elem / 1000000000;
358abb5dd6eSMark de Wever       _Data[_Maxidx] = _Initial_quotient;
359abb5dd6eSMark de Wever       uint64_t _Remainder = _Initial_remainder;
360abb5dd6eSMark de Wever 
361abb5dd6eSMark de Wever       // Process less significant elements.
362abb5dd6eSMark de Wever       uint32_t _Idx = _Maxidx;
363abb5dd6eSMark de Wever       do {
364abb5dd6eSMark de Wever         --_Idx; // Initially, _Remainder is at most 10^9 - 1.
365abb5dd6eSMark de Wever 
366abb5dd6eSMark de Wever         // Now, _Remainder is at most (10^9 - 1) * 2^32 + 2^32 - 1, simplified to 10^9 * 2^32 - 1.
367abb5dd6eSMark de Wever         _Remainder = (_Remainder << 32) | _Data[_Idx];
368abb5dd6eSMark de Wever 
369abb5dd6eSMark de Wever         // floor((10^9 * 2^32 - 1) / 10^9) == 2^32 - 1, so uint32_t _Quotient is lossless.
370abb5dd6eSMark de Wever         const uint32_t _Quotient = static_cast<uint32_t>(__div1e9(_Remainder));
371abb5dd6eSMark de Wever 
372abb5dd6eSMark de Wever         // _Remainder is at most 10^9 - 1 again.
373abb5dd6eSMark de Wever         // For uint32_t truncation, see the __mod1e9() comment in d2s_intrinsics.h.
374abb5dd6eSMark de Wever         _Remainder = static_cast<uint32_t>(_Remainder) - 1000000000u * _Quotient;
375abb5dd6eSMark de Wever 
376abb5dd6eSMark de Wever         _Data[_Idx] = _Quotient;
377abb5dd6eSMark de Wever       } while (_Idx != 0);
378abb5dd6eSMark de Wever 
379abb5dd6eSMark de Wever       // Store a 0-filled 9-digit block.
380abb5dd6eSMark de Wever       _Blocks[_Filled_blocks++] = static_cast<uint32_t>(_Remainder);
381abb5dd6eSMark de Wever 
382abb5dd6eSMark de Wever       if (_Initial_quotient == 0) { // Is the large integer shrinking?
383abb5dd6eSMark de Wever         --_Maxidx; // log2(10^9) is 29.9, so we can't shrink by more than one element.
384abb5dd6eSMark de Wever         if (_Maxidx == 0) {
385abb5dd6eSMark de Wever           break; // We've finished long division. Now we need to print _Data[0].
386abb5dd6eSMark de Wever         }
387abb5dd6eSMark de Wever       }
388abb5dd6eSMark de Wever     }
389abb5dd6eSMark de Wever   }
390abb5dd6eSMark de Wever 
391*bed1a5b3SKonstantin Varlamov   _LIBCPP_ASSERT_INTERNAL(_Data[0] != 0, "");
392abb5dd6eSMark de Wever   for (uint32_t _Idx = 1; _Idx < _Data_size; ++_Idx) {
393*bed1a5b3SKonstantin Varlamov     _LIBCPP_ASSERT_INTERNAL(_Data[_Idx] == 0, "");
394abb5dd6eSMark de Wever   }
395abb5dd6eSMark de Wever 
396abb5dd6eSMark de Wever   const uint32_t _Data_olength = _Data[0] >= 1000000000 ? 10 : __decimalLength9(_Data[0]);
397abb5dd6eSMark de Wever   const uint32_t _Total_fixed_length = _Data_olength + 9 * _Filled_blocks;
398abb5dd6eSMark de Wever 
399abb5dd6eSMark de Wever   if (_Last - _First < static_cast<ptrdiff_t>(_Total_fixed_length)) {
400abb5dd6eSMark de Wever     return { _Last, errc::value_too_large };
401abb5dd6eSMark de Wever   }
402abb5dd6eSMark de Wever 
403abb5dd6eSMark de Wever   char* _Result = _First;
404abb5dd6eSMark de Wever 
405abb5dd6eSMark de Wever   // Print _Data[0]. While it's up to 10 digits,
406abb5dd6eSMark de Wever   // which is more than Ryu generates, the code below can handle this.
407abb5dd6eSMark de Wever   __append_n_digits(_Data_olength, _Data[0], _Result);
408abb5dd6eSMark de Wever   _Result += _Data_olength;
409abb5dd6eSMark de Wever 
410abb5dd6eSMark de Wever   // Print 0-filled 9-digit blocks.
411abb5dd6eSMark de Wever   for (int32_t _Idx = _Filled_blocks - 1; _Idx >= 0; --_Idx) {
412abb5dd6eSMark de Wever     __append_nine_digits(_Blocks[_Idx], _Result);
413abb5dd6eSMark de Wever     _Result += 9;
414abb5dd6eSMark de Wever   }
415abb5dd6eSMark de Wever 
416abb5dd6eSMark de Wever   return { _Result, errc{} };
417abb5dd6eSMark de Wever }
418abb5dd6eSMark de Wever 
__to_chars(char * const _First,char * const _Last,const __floating_decimal_32 __v,chars_format _Fmt,const uint32_t __ieeeMantissa,const uint32_t __ieeeExponent)419abb5dd6eSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline to_chars_result __to_chars(char* const _First, char* const _Last, const __floating_decimal_32 __v,
420abb5dd6eSMark de Wever   chars_format _Fmt, const uint32_t __ieeeMantissa, const uint32_t __ieeeExponent) {
421abb5dd6eSMark de Wever   // Step 5: Print the decimal representation.
422abb5dd6eSMark de Wever   uint32_t _Output = __v.__mantissa;
423abb5dd6eSMark de Wever   int32_t _Ryu_exponent = __v.__exponent;
424abb5dd6eSMark de Wever   const uint32_t __olength = __decimalLength9(_Output);
425abb5dd6eSMark de Wever   int32_t _Scientific_exponent = _Ryu_exponent + static_cast<int32_t>(__olength) - 1;
426abb5dd6eSMark de Wever 
427abb5dd6eSMark de Wever   if (_Fmt == chars_format{}) {
428abb5dd6eSMark de Wever     int32_t _Lower;
429abb5dd6eSMark de Wever     int32_t _Upper;
430abb5dd6eSMark de Wever 
431abb5dd6eSMark de Wever     if (__olength == 1) {
432abb5dd6eSMark de Wever       // Value | Fixed   | Scientific
433abb5dd6eSMark de Wever       // 1e-3  | "0.001" | "1e-03"
434abb5dd6eSMark de Wever       // 1e4   | "10000" | "1e+04"
435abb5dd6eSMark de Wever       _Lower = -3;
436abb5dd6eSMark de Wever       _Upper = 4;
437abb5dd6eSMark de Wever     } else {
438abb5dd6eSMark de Wever       // Value   | Fixed       | Scientific
439abb5dd6eSMark de Wever       // 1234e-7 | "0.0001234" | "1.234e-04"
440abb5dd6eSMark de Wever       // 1234e5  | "123400000" | "1.234e+08"
441abb5dd6eSMark de Wever       _Lower = -static_cast<int32_t>(__olength + 3);
442abb5dd6eSMark de Wever       _Upper = 5;
443abb5dd6eSMark de Wever     }
444abb5dd6eSMark de Wever 
445abb5dd6eSMark de Wever     if (_Lower <= _Ryu_exponent && _Ryu_exponent <= _Upper) {
446abb5dd6eSMark de Wever       _Fmt = chars_format::fixed;
447abb5dd6eSMark de Wever     } else {
448abb5dd6eSMark de Wever       _Fmt = chars_format::scientific;
449abb5dd6eSMark de Wever     }
450abb5dd6eSMark de Wever   } else if (_Fmt == chars_format::general) {
451abb5dd6eSMark de Wever     // C11 7.21.6.1 "The fprintf function"/8:
452abb5dd6eSMark de Wever     // "Let P equal [...] 6 if the precision is omitted [...].
453abb5dd6eSMark de Wever     // Then, if a conversion with style E would have an exponent of X:
454abb5dd6eSMark de Wever     // - if P > X >= -4, the conversion is with style f [...].
455abb5dd6eSMark de Wever     // - otherwise, the conversion is with style e [...]."
456abb5dd6eSMark de Wever     if (-4 <= _Scientific_exponent && _Scientific_exponent < 6) {
457abb5dd6eSMark de Wever       _Fmt = chars_format::fixed;
458abb5dd6eSMark de Wever     } else {
459abb5dd6eSMark de Wever       _Fmt = chars_format::scientific;
460abb5dd6eSMark de Wever     }
461abb5dd6eSMark de Wever   }
462abb5dd6eSMark de Wever 
463abb5dd6eSMark de Wever   if (_Fmt == chars_format::fixed) {
464abb5dd6eSMark de Wever     // Example: _Output == 1729, __olength == 4
465abb5dd6eSMark de Wever 
466abb5dd6eSMark de Wever     // _Ryu_exponent | Printed  | _Whole_digits | _Total_fixed_length  | Notes
467abb5dd6eSMark de Wever     // --------------|----------|---------------|----------------------|---------------------------------------
468abb5dd6eSMark de Wever     //             2 | 172900   |  6            | _Whole_digits        | Ryu can't be used for printing
469abb5dd6eSMark de Wever     //             1 | 17290    |  5            | (sometimes adjusted) | when the trimmed digits are nonzero.
470abb5dd6eSMark de Wever     // --------------|----------|---------------|----------------------|---------------------------------------
471abb5dd6eSMark de Wever     //             0 | 1729     |  4            | _Whole_digits        | Unified length cases.
472abb5dd6eSMark de Wever     // --------------|----------|---------------|----------------------|---------------------------------------
473abb5dd6eSMark de Wever     //            -1 | 172.9    |  3            | __olength + 1        | This case can't happen for
474abb5dd6eSMark de Wever     //            -2 | 17.29    |  2            |                      | __olength == 1, but no additional
475abb5dd6eSMark de Wever     //            -3 | 1.729    |  1            |                      | code is needed to avoid it.
476abb5dd6eSMark de Wever     // --------------|----------|---------------|----------------------|---------------------------------------
477abb5dd6eSMark de Wever     //            -4 | 0.1729   |  0            | 2 - _Ryu_exponent    | C11 7.21.6.1 "The fprintf function"/8:
478abb5dd6eSMark de Wever     //            -5 | 0.01729  | -1            |                      | "If a decimal-point character appears,
479abb5dd6eSMark de Wever     //            -6 | 0.001729 | -2            |                      | at least one digit appears before it."
480abb5dd6eSMark de Wever 
481abb5dd6eSMark de Wever     const int32_t _Whole_digits = static_cast<int32_t>(__olength) + _Ryu_exponent;
482abb5dd6eSMark de Wever 
483abb5dd6eSMark de Wever     uint32_t _Total_fixed_length;
484abb5dd6eSMark de Wever     if (_Ryu_exponent >= 0) { // cases "172900" and "1729"
485abb5dd6eSMark de Wever       _Total_fixed_length = static_cast<uint32_t>(_Whole_digits);
486abb5dd6eSMark de Wever       if (_Output == 1) {
487abb5dd6eSMark de Wever         // Rounding can affect the number of digits.
488abb5dd6eSMark de Wever         // For example, 1e11f is exactly "99999997952" which is 11 digits instead of 12.
489abb5dd6eSMark de Wever         // We can use a lookup table to detect this and adjust the total length.
490abb5dd6eSMark de Wever         static constexpr uint8_t _Adjustment[39] = {
491abb5dd6eSMark de Wever           0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,1,1,0,0,1,0,1,1,0,1,1,1 };
492abb5dd6eSMark de Wever         _Total_fixed_length -= _Adjustment[_Ryu_exponent];
493abb5dd6eSMark de Wever         // _Whole_digits doesn't need to be adjusted because these cases won't refer to it later.
494abb5dd6eSMark de Wever       }
495abb5dd6eSMark de Wever     } else if (_Whole_digits > 0) { // case "17.29"
496abb5dd6eSMark de Wever       _Total_fixed_length = __olength + 1;
497abb5dd6eSMark de Wever     } else { // case "0.001729"
498abb5dd6eSMark de Wever       _Total_fixed_length = static_cast<uint32_t>(2 - _Ryu_exponent);
499abb5dd6eSMark de Wever     }
500abb5dd6eSMark de Wever 
501abb5dd6eSMark de Wever     if (_Last - _First < static_cast<ptrdiff_t>(_Total_fixed_length)) {
502abb5dd6eSMark de Wever       return { _Last, errc::value_too_large };
503abb5dd6eSMark de Wever     }
504abb5dd6eSMark de Wever 
505abb5dd6eSMark de Wever     char* _Mid;
506abb5dd6eSMark de Wever     if (_Ryu_exponent > 0) { // case "172900"
507abb5dd6eSMark de Wever       bool _Can_use_ryu;
508abb5dd6eSMark de Wever 
509abb5dd6eSMark de Wever       if (_Ryu_exponent > 10) { // 10^10 is the largest power of 10 that's exactly representable as a float.
510abb5dd6eSMark de Wever         _Can_use_ryu = false;
511abb5dd6eSMark de Wever       } else {
512abb5dd6eSMark de Wever         // Ryu generated X: __v.__mantissa * 10^_Ryu_exponent
513abb5dd6eSMark de Wever         // __v.__mantissa == 2^_Trailing_zero_bits * (__v.__mantissa >> _Trailing_zero_bits)
514abb5dd6eSMark de Wever         // 10^_Ryu_exponent == 2^_Ryu_exponent * 5^_Ryu_exponent
515abb5dd6eSMark de Wever 
516abb5dd6eSMark de Wever         // _Trailing_zero_bits is [0, 29] (aside: because 2^29 is the largest power of 2
517abb5dd6eSMark de Wever         // with 9 decimal digits, which is float's round-trip limit.)
518abb5dd6eSMark de Wever         // _Ryu_exponent is [1, 10].
519abb5dd6eSMark de Wever         // Normalization adds [2, 23] (aside: at least 2 because the pre-normalized mantissa is at least 5).
520abb5dd6eSMark de Wever         // This adds up to [3, 62], which is well below float's maximum binary exponent 127.
521abb5dd6eSMark de Wever 
522abb5dd6eSMark de Wever         // Therefore, we just need to consider (__v.__mantissa >> _Trailing_zero_bits) * 5^_Ryu_exponent.
523abb5dd6eSMark de Wever 
524abb5dd6eSMark de Wever         // If that product would exceed 24 bits, then X can't be exactly represented as a float.
525abb5dd6eSMark de Wever         // (That's not a problem for round-tripping, because X is close enough to the original float,
526abb5dd6eSMark de Wever         // but X isn't mathematically equal to the original float.) This requires a high-precision fallback.
527abb5dd6eSMark de Wever 
528abb5dd6eSMark de Wever         // If the product is 24 bits or smaller, then X can be exactly represented as a float (and we don't
529abb5dd6eSMark de Wever         // need to re-synthesize it; the original float must have been X, because Ryu wouldn't produce the
530abb5dd6eSMark de Wever         // same output for two different floats X and Y). This allows Ryu's output to be used (zero-filled).
531abb5dd6eSMark de Wever 
532abb5dd6eSMark de Wever         // (2^24 - 1) / 5^0 (for indexing), (2^24 - 1) / 5^1, ..., (2^24 - 1) / 5^10
533abb5dd6eSMark de Wever         static constexpr uint32_t _Max_shifted_mantissa[11] = {
534abb5dd6eSMark de Wever           16777215, 3355443, 671088, 134217, 26843, 5368, 1073, 214, 42, 8, 1 };
535abb5dd6eSMark de Wever 
536abb5dd6eSMark de Wever         unsigned long _Trailing_zero_bits;
537abb5dd6eSMark de Wever         (void) _BitScanForward(&_Trailing_zero_bits, __v.__mantissa); // __v.__mantissa is guaranteed nonzero
538abb5dd6eSMark de Wever         const uint32_t _Shifted_mantissa = __v.__mantissa >> _Trailing_zero_bits;
539abb5dd6eSMark de Wever         _Can_use_ryu = _Shifted_mantissa <= _Max_shifted_mantissa[_Ryu_exponent];
540abb5dd6eSMark de Wever       }
541abb5dd6eSMark de Wever 
542abb5dd6eSMark de Wever       if (!_Can_use_ryu) {
543abb5dd6eSMark de Wever         const uint32_t _Mantissa2 = __ieeeMantissa | (1u << __FLOAT_MANTISSA_BITS); // restore implicit bit
544abb5dd6eSMark de Wever         const int32_t _Exponent2 = static_cast<int32_t>(__ieeeExponent)
545abb5dd6eSMark de Wever           - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS; // bias and normalization
546abb5dd6eSMark de Wever 
547abb5dd6eSMark de Wever         // Performance note: We've already called Ryu, so this will redundantly perform buffering and bounds checking.
548abb5dd6eSMark de Wever         return _Large_integer_to_chars(_First, _Last, _Mantissa2, _Exponent2);
549abb5dd6eSMark de Wever       }
550abb5dd6eSMark de Wever 
551abb5dd6eSMark de Wever       // _Can_use_ryu
552abb5dd6eSMark de Wever       // Print the decimal digits, left-aligned within [_First, _First + _Total_fixed_length).
553abb5dd6eSMark de Wever       _Mid = _First + __olength;
554abb5dd6eSMark de Wever     } else { // cases "1729", "17.29", and "0.001729"
555abb5dd6eSMark de Wever       // Print the decimal digits, right-aligned within [_First, _First + _Total_fixed_length).
556abb5dd6eSMark de Wever       _Mid = _First + _Total_fixed_length;
557abb5dd6eSMark de Wever     }
558abb5dd6eSMark de Wever 
559abb5dd6eSMark de Wever     while (_Output >= 10000) {
560abb5dd6eSMark de Wever #ifdef __clang__ // TRANSITION, LLVM-38217
561abb5dd6eSMark de Wever       const uint32_t __c = _Output - 10000 * (_Output / 10000);
562abb5dd6eSMark de Wever #else
563abb5dd6eSMark de Wever       const uint32_t __c = _Output % 10000;
564abb5dd6eSMark de Wever #endif
565abb5dd6eSMark de Wever       _Output /= 10000;
566abb5dd6eSMark de Wever       const uint32_t __c0 = (__c % 100) << 1;
567abb5dd6eSMark de Wever       const uint32_t __c1 = (__c / 100) << 1;
5686e679286SLouis Dionne       std::memcpy(_Mid -= 2, __DIGIT_TABLE + __c0, 2);
5696e679286SLouis Dionne       std::memcpy(_Mid -= 2, __DIGIT_TABLE + __c1, 2);
570abb5dd6eSMark de Wever     }
571abb5dd6eSMark de Wever     if (_Output >= 100) {
572abb5dd6eSMark de Wever       const uint32_t __c = (_Output % 100) << 1;
573abb5dd6eSMark de Wever       _Output /= 100;
5746e679286SLouis Dionne       std::memcpy(_Mid -= 2, __DIGIT_TABLE + __c, 2);
575abb5dd6eSMark de Wever     }
576abb5dd6eSMark de Wever     if (_Output >= 10) {
577abb5dd6eSMark de Wever       const uint32_t __c = _Output << 1;
5786e679286SLouis Dionne       std::memcpy(_Mid -= 2, __DIGIT_TABLE + __c, 2);
579abb5dd6eSMark de Wever     } else {
580abb5dd6eSMark de Wever       *--_Mid = static_cast<char>('0' + _Output);
581abb5dd6eSMark de Wever     }
582abb5dd6eSMark de Wever 
583abb5dd6eSMark de Wever     if (_Ryu_exponent > 0) { // case "172900" with _Can_use_ryu
584abb5dd6eSMark de Wever       // Performance note: it might be more efficient to do this immediately after setting _Mid.
5856e679286SLouis Dionne       std::memset(_First + __olength, '0', static_cast<size_t>(_Ryu_exponent));
586abb5dd6eSMark de Wever     } else if (_Ryu_exponent == 0) { // case "1729"
587abb5dd6eSMark de Wever       // Done!
588abb5dd6eSMark de Wever     } else if (_Whole_digits > 0) { // case "17.29"
589abb5dd6eSMark de Wever       // Performance note: moving digits might not be optimal.
5906e679286SLouis Dionne       std::memmove(_First, _First + 1, static_cast<size_t>(_Whole_digits));
591abb5dd6eSMark de Wever       _First[_Whole_digits] = '.';
592abb5dd6eSMark de Wever     } else { // case "0.001729"
593abb5dd6eSMark de Wever       // Performance note: a larger memset() followed by overwriting '.' might be more efficient.
594abb5dd6eSMark de Wever       _First[0] = '0';
595abb5dd6eSMark de Wever       _First[1] = '.';
5966e679286SLouis Dionne       std::memset(_First + 2, '0', static_cast<size_t>(-_Whole_digits));
597abb5dd6eSMark de Wever     }
598abb5dd6eSMark de Wever 
599abb5dd6eSMark de Wever     return { _First + _Total_fixed_length, errc{} };
600abb5dd6eSMark de Wever   }
601abb5dd6eSMark de Wever 
602abb5dd6eSMark de Wever   const uint32_t _Total_scientific_length =
603abb5dd6eSMark de Wever     __olength + (__olength > 1) + 4; // digits + possible decimal point + scientific exponent
604abb5dd6eSMark de Wever   if (_Last - _First < static_cast<ptrdiff_t>(_Total_scientific_length)) {
605abb5dd6eSMark de Wever     return { _Last, errc::value_too_large };
606abb5dd6eSMark de Wever   }
607abb5dd6eSMark de Wever   char* const __result = _First;
608abb5dd6eSMark de Wever 
609abb5dd6eSMark de Wever   // Print the decimal digits.
610abb5dd6eSMark de Wever   uint32_t __i = 0;
611abb5dd6eSMark de Wever   while (_Output >= 10000) {
612abb5dd6eSMark de Wever #ifdef __clang__ // TRANSITION, LLVM-38217
613abb5dd6eSMark de Wever     const uint32_t __c = _Output - 10000 * (_Output / 10000);
614abb5dd6eSMark de Wever #else
615abb5dd6eSMark de Wever     const uint32_t __c = _Output % 10000;
616abb5dd6eSMark de Wever #endif
617abb5dd6eSMark de Wever     _Output /= 10000;
618abb5dd6eSMark de Wever     const uint32_t __c0 = (__c % 100) << 1;
619abb5dd6eSMark de Wever     const uint32_t __c1 = (__c / 100) << 1;
6206e679286SLouis Dionne     std::memcpy(__result + __olength - __i - 1, __DIGIT_TABLE + __c0, 2);
6216e679286SLouis Dionne     std::memcpy(__result + __olength - __i - 3, __DIGIT_TABLE + __c1, 2);
622abb5dd6eSMark de Wever     __i += 4;
623abb5dd6eSMark de Wever   }
624abb5dd6eSMark de Wever   if (_Output >= 100) {
625abb5dd6eSMark de Wever     const uint32_t __c = (_Output % 100) << 1;
626abb5dd6eSMark de Wever     _Output /= 100;
6276e679286SLouis Dionne     std::memcpy(__result + __olength - __i - 1, __DIGIT_TABLE + __c, 2);
628abb5dd6eSMark de Wever     __i += 2;
629abb5dd6eSMark de Wever   }
630abb5dd6eSMark de Wever   if (_Output >= 10) {
631abb5dd6eSMark de Wever     const uint32_t __c = _Output << 1;
632abb5dd6eSMark de Wever     // We can't use memcpy here: the decimal dot goes between these two digits.
633abb5dd6eSMark de Wever     __result[2] = __DIGIT_TABLE[__c + 1];
634abb5dd6eSMark de Wever     __result[0] = __DIGIT_TABLE[__c];
635abb5dd6eSMark de Wever   } else {
636abb5dd6eSMark de Wever     __result[0] = static_cast<char>('0' + _Output);
637abb5dd6eSMark de Wever   }
638abb5dd6eSMark de Wever 
639abb5dd6eSMark de Wever   // Print decimal point if needed.
640abb5dd6eSMark de Wever   uint32_t __index;
641abb5dd6eSMark de Wever   if (__olength > 1) {
642abb5dd6eSMark de Wever     __result[1] = '.';
643abb5dd6eSMark de Wever     __index = __olength + 1;
644abb5dd6eSMark de Wever   } else {
645abb5dd6eSMark de Wever     __index = 1;
646abb5dd6eSMark de Wever   }
647abb5dd6eSMark de Wever 
648abb5dd6eSMark de Wever   // Print the exponent.
649abb5dd6eSMark de Wever   __result[__index++] = 'e';
650abb5dd6eSMark de Wever   if (_Scientific_exponent < 0) {
651abb5dd6eSMark de Wever     __result[__index++] = '-';
652abb5dd6eSMark de Wever     _Scientific_exponent = -_Scientific_exponent;
653abb5dd6eSMark de Wever   } else {
654abb5dd6eSMark de Wever     __result[__index++] = '+';
655abb5dd6eSMark de Wever   }
656abb5dd6eSMark de Wever 
6576e679286SLouis Dionne   std::memcpy(__result + __index, __DIGIT_TABLE + 2 * _Scientific_exponent, 2);
658abb5dd6eSMark de Wever   __index += 2;
659abb5dd6eSMark de Wever 
660abb5dd6eSMark de Wever   return { _First + _Total_scientific_length, errc{} };
661abb5dd6eSMark de Wever }
662abb5dd6eSMark de Wever 
__f2s_buffered_n(char * const _First,char * const _Last,const float __f,const chars_format _Fmt)663abb5dd6eSMark de Wever [[nodiscard]] to_chars_result __f2s_buffered_n(char* const _First, char* const _Last, const float __f,
664abb5dd6eSMark de Wever   const chars_format _Fmt) {
665abb5dd6eSMark de Wever 
666abb5dd6eSMark de Wever   // Step 1: Decode the floating-point number, and unify normalized and subnormal cases.
667abb5dd6eSMark de Wever   const uint32_t __bits = __float_to_bits(__f);
668abb5dd6eSMark de Wever 
669abb5dd6eSMark de Wever   // Case distinction; exit early for the easy cases.
670abb5dd6eSMark de Wever   if (__bits == 0) {
671abb5dd6eSMark de Wever     if (_Fmt == chars_format::scientific) {
672abb5dd6eSMark de Wever       if (_Last - _First < 5) {
673abb5dd6eSMark de Wever         return { _Last, errc::value_too_large };
674abb5dd6eSMark de Wever       }
675abb5dd6eSMark de Wever 
6766e679286SLouis Dionne       std::memcpy(_First, "0e+00", 5);
677abb5dd6eSMark de Wever 
678abb5dd6eSMark de Wever       return { _First + 5, errc{} };
679abb5dd6eSMark de Wever     }
680abb5dd6eSMark de Wever 
681abb5dd6eSMark de Wever     // Print "0" for chars_format::fixed, chars_format::general, and chars_format{}.
682abb5dd6eSMark de Wever     if (_First == _Last) {
683abb5dd6eSMark de Wever       return { _Last, errc::value_too_large };
684abb5dd6eSMark de Wever     }
685abb5dd6eSMark de Wever 
686abb5dd6eSMark de Wever     *_First = '0';
687abb5dd6eSMark de Wever 
688abb5dd6eSMark de Wever     return { _First + 1, errc{} };
689abb5dd6eSMark de Wever   }
690abb5dd6eSMark de Wever 
691abb5dd6eSMark de Wever   // Decode __bits into mantissa and exponent.
692abb5dd6eSMark de Wever   const uint32_t __ieeeMantissa = __bits & ((1u << __FLOAT_MANTISSA_BITS) - 1);
693abb5dd6eSMark de Wever   const uint32_t __ieeeExponent = __bits >> __FLOAT_MANTISSA_BITS;
694abb5dd6eSMark de Wever 
695abb5dd6eSMark de Wever   // When _Fmt == chars_format::fixed and the floating-point number is a large integer,
696abb5dd6eSMark de Wever   // it's faster to skip Ryu and immediately print the integer exactly.
697abb5dd6eSMark de Wever   if (_Fmt == chars_format::fixed) {
698abb5dd6eSMark de Wever     const uint32_t _Mantissa2 = __ieeeMantissa | (1u << __FLOAT_MANTISSA_BITS); // restore implicit bit
699abb5dd6eSMark de Wever     const int32_t _Exponent2 = static_cast<int32_t>(__ieeeExponent)
700abb5dd6eSMark de Wever       - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS; // bias and normalization
701abb5dd6eSMark de Wever 
702abb5dd6eSMark de Wever     // Normal values are equal to _Mantissa2 * 2^_Exponent2.
703abb5dd6eSMark de Wever     // (Subnormals are different, but they'll be rejected by the _Exponent2 test here, so they can be ignored.)
704abb5dd6eSMark de Wever 
705abb5dd6eSMark de Wever     if (_Exponent2 > 0) {
706abb5dd6eSMark de Wever       return _Large_integer_to_chars(_First, _Last, _Mantissa2, _Exponent2);
707abb5dd6eSMark de Wever     }
708abb5dd6eSMark de Wever   }
709abb5dd6eSMark de Wever 
710abb5dd6eSMark de Wever   const __floating_decimal_32 __v = __f2d(__ieeeMantissa, __ieeeExponent);
711abb5dd6eSMark de Wever   return __to_chars(_First, _Last, __v, _Fmt, __ieeeMantissa, __ieeeExponent);
712abb5dd6eSMark de Wever }
713abb5dd6eSMark de Wever 
714abb5dd6eSMark de Wever _LIBCPP_END_NAMESPACE_STD
715abb5dd6eSMark de Wever 
716abb5dd6eSMark de Wever // clang-format on
717