1*4bdff4beSrobert //===----------------------------------------------------------------------===//
2*4bdff4beSrobert //
3*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information.
5*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*4bdff4beSrobert //
7*4bdff4beSrobert //===----------------------------------------------------------------------===//
8*4bdff4beSrobert
9*4bdff4beSrobert // Copyright (c) Microsoft Corporation.
10*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
11*4bdff4beSrobert
12*4bdff4beSrobert // Copyright 2018 Ulf Adams
13*4bdff4beSrobert // Copyright (c) Microsoft Corporation. All rights reserved.
14*4bdff4beSrobert
15*4bdff4beSrobert // Boost Software License - Version 1.0 - August 17th, 2003
16*4bdff4beSrobert
17*4bdff4beSrobert // Permission is hereby granted, free of charge, to any person or organization
18*4bdff4beSrobert // obtaining a copy of the software and accompanying documentation covered by
19*4bdff4beSrobert // this license (the "Software") to use, reproduce, display, distribute,
20*4bdff4beSrobert // execute, and transmit the Software, and to prepare derivative works of the
21*4bdff4beSrobert // Software, and to permit third-parties to whom the Software is furnished to
22*4bdff4beSrobert // do so, all subject to the following:
23*4bdff4beSrobert
24*4bdff4beSrobert // The copyright notices in the Software and this entire statement, including
25*4bdff4beSrobert // the above license grant, this restriction and the following disclaimer,
26*4bdff4beSrobert // must be included in all copies of the Software, in whole or in part, and
27*4bdff4beSrobert // all derivative works of the Software, unless such copies or derivative
28*4bdff4beSrobert // works are solely in the form of machine-executable object code generated by
29*4bdff4beSrobert // a source language processor.
30*4bdff4beSrobert
31*4bdff4beSrobert // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32*4bdff4beSrobert // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33*4bdff4beSrobert // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
34*4bdff4beSrobert // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
35*4bdff4beSrobert // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
36*4bdff4beSrobert // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
37*4bdff4beSrobert // DEALINGS IN THE SOFTWARE.
38*4bdff4beSrobert
39*4bdff4beSrobert // Avoid formatting to keep the changes with the original code minimal.
40*4bdff4beSrobert // clang-format off
41*4bdff4beSrobert
42*4bdff4beSrobert #include <__assert>
43*4bdff4beSrobert #include <__config>
44*4bdff4beSrobert #include <charconv>
45*4bdff4beSrobert #include <cstring>
46*4bdff4beSrobert #include <system_error>
47*4bdff4beSrobert
48*4bdff4beSrobert #include "include/ryu/common.h"
49*4bdff4beSrobert #include "include/ryu/d2fixed.h"
50*4bdff4beSrobert #include "include/ryu/d2fixed_full_table.h"
51*4bdff4beSrobert #include "include/ryu/d2s.h"
52*4bdff4beSrobert #include "include/ryu/d2s_intrinsics.h"
53*4bdff4beSrobert #include "include/ryu/digit_table.h"
54*4bdff4beSrobert
55*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_STD
56*4bdff4beSrobert
57*4bdff4beSrobert inline constexpr int __POW10_ADDITIONAL_BITS = 120;
58*4bdff4beSrobert
59*4bdff4beSrobert #ifdef _LIBCPP_INTRINSIC128
60*4bdff4beSrobert // Returns the low 64 bits of the high 128 bits of the 256-bit product of a and b.
__umul256_hi128_lo64(const uint64_t __aHi,const uint64_t __aLo,const uint64_t __bHi,const uint64_t __bLo)61*4bdff4beSrobert [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __umul256_hi128_lo64(
62*4bdff4beSrobert const uint64_t __aHi, const uint64_t __aLo, const uint64_t __bHi, const uint64_t __bLo) {
63*4bdff4beSrobert uint64_t __b00Hi;
64*4bdff4beSrobert const uint64_t __b00Lo = __ryu_umul128(__aLo, __bLo, &__b00Hi);
65*4bdff4beSrobert uint64_t __b01Hi;
66*4bdff4beSrobert const uint64_t __b01Lo = __ryu_umul128(__aLo, __bHi, &__b01Hi);
67*4bdff4beSrobert uint64_t __b10Hi;
68*4bdff4beSrobert const uint64_t __b10Lo = __ryu_umul128(__aHi, __bLo, &__b10Hi);
69*4bdff4beSrobert uint64_t __b11Hi;
70*4bdff4beSrobert const uint64_t __b11Lo = __ryu_umul128(__aHi, __bHi, &__b11Hi);
71*4bdff4beSrobert (void) __b00Lo; // unused
72*4bdff4beSrobert (void) __b11Hi; // unused
73*4bdff4beSrobert const uint64_t __temp1Lo = __b10Lo + __b00Hi;
74*4bdff4beSrobert const uint64_t __temp1Hi = __b10Hi + (__temp1Lo < __b10Lo);
75*4bdff4beSrobert const uint64_t __temp2Lo = __b01Lo + __temp1Lo;
76*4bdff4beSrobert const uint64_t __temp2Hi = __b01Hi + (__temp2Lo < __b01Lo);
77*4bdff4beSrobert return __b11Lo + __temp1Hi + __temp2Hi;
78*4bdff4beSrobert }
79*4bdff4beSrobert
__uint128_mod1e9(const uint64_t __vHi,const uint64_t __vLo)80*4bdff4beSrobert [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __uint128_mod1e9(const uint64_t __vHi, const uint64_t __vLo) {
81*4bdff4beSrobert // After multiplying, we're going to shift right by 29, then truncate to uint32_t.
82*4bdff4beSrobert // This means that we need only 29 + 32 = 61 bits, so we can truncate to uint64_t before shifting.
83*4bdff4beSrobert const uint64_t __multiplied = __umul256_hi128_lo64(__vHi, __vLo, 0x89705F4136B4A597u, 0x31680A88F8953031u);
84*4bdff4beSrobert
85*4bdff4beSrobert // For uint32_t truncation, see the __mod1e9() comment in d2s_intrinsics.h.
86*4bdff4beSrobert const uint32_t __shifted = static_cast<uint32_t>(__multiplied >> 29);
87*4bdff4beSrobert
88*4bdff4beSrobert return static_cast<uint32_t>(__vLo) - 1000000000 * __shifted;
89*4bdff4beSrobert }
90*4bdff4beSrobert #endif // ^^^ intrinsics available ^^^
91*4bdff4beSrobert
__mulShift_mod1e9(const uint64_t __m,const uint64_t * const __mul,const int32_t __j)92*4bdff4beSrobert [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulShift_mod1e9(const uint64_t __m, const uint64_t* const __mul, const int32_t __j) {
93*4bdff4beSrobert uint64_t __high0; // 64
94*4bdff4beSrobert const uint64_t __low0 = __ryu_umul128(__m, __mul[0], &__high0); // 0
95*4bdff4beSrobert uint64_t __high1; // 128
96*4bdff4beSrobert const uint64_t __low1 = __ryu_umul128(__m, __mul[1], &__high1); // 64
97*4bdff4beSrobert uint64_t __high2; // 192
98*4bdff4beSrobert const uint64_t __low2 = __ryu_umul128(__m, __mul[2], &__high2); // 128
99*4bdff4beSrobert const uint64_t __s0low = __low0; // 0
100*4bdff4beSrobert (void) __s0low; // unused
101*4bdff4beSrobert const uint64_t __s0high = __low1 + __high0; // 64
102*4bdff4beSrobert const uint32_t __c1 = __s0high < __low1;
103*4bdff4beSrobert const uint64_t __s1low = __low2 + __high1 + __c1; // 128
104*4bdff4beSrobert const uint32_t __c2 = __s1low < __low2; // __high1 + __c1 can't overflow, so compare against __low2
105*4bdff4beSrobert const uint64_t __s1high = __high2 + __c2; // 192
106*4bdff4beSrobert _LIBCPP_ASSERT(__j >= 128, "");
107*4bdff4beSrobert _LIBCPP_ASSERT(__j <= 180, "");
108*4bdff4beSrobert #ifdef _LIBCPP_INTRINSIC128
109*4bdff4beSrobert const uint32_t __dist = static_cast<uint32_t>(__j - 128); // __dist: [0, 52]
110*4bdff4beSrobert const uint64_t __shiftedhigh = __s1high >> __dist;
111*4bdff4beSrobert const uint64_t __shiftedlow = __ryu_shiftright128(__s1low, __s1high, __dist);
112*4bdff4beSrobert return __uint128_mod1e9(__shiftedhigh, __shiftedlow);
113*4bdff4beSrobert #else // ^^^ intrinsics available ^^^ / vvv intrinsics unavailable vvv
114*4bdff4beSrobert if (__j < 160) { // __j: [128, 160)
115*4bdff4beSrobert const uint64_t __r0 = __mod1e9(__s1high);
116*4bdff4beSrobert const uint64_t __r1 = __mod1e9((__r0 << 32) | (__s1low >> 32));
117*4bdff4beSrobert const uint64_t __r2 = ((__r1 << 32) | (__s1low & 0xffffffff));
118*4bdff4beSrobert return __mod1e9(__r2 >> (__j - 128));
119*4bdff4beSrobert } else { // __j: [160, 192)
120*4bdff4beSrobert const uint64_t __r0 = __mod1e9(__s1high);
121*4bdff4beSrobert const uint64_t __r1 = ((__r0 << 32) | (__s1low >> 32));
122*4bdff4beSrobert return __mod1e9(__r1 >> (__j - 160));
123*4bdff4beSrobert }
124*4bdff4beSrobert #endif // ^^^ intrinsics unavailable ^^^
125*4bdff4beSrobert }
126*4bdff4beSrobert
__append_n_digits(const uint32_t __olength,uint32_t __digits,char * const __result)127*4bdff4beSrobert void __append_n_digits(const uint32_t __olength, uint32_t __digits, char* const __result) {
128*4bdff4beSrobert uint32_t __i = 0;
129*4bdff4beSrobert while (__digits >= 10000) {
130*4bdff4beSrobert #ifdef __clang__ // TRANSITION, LLVM-38217
131*4bdff4beSrobert const uint32_t __c = __digits - 10000 * (__digits / 10000);
132*4bdff4beSrobert #else
133*4bdff4beSrobert const uint32_t __c = __digits % 10000;
134*4bdff4beSrobert #endif
135*4bdff4beSrobert __digits /= 10000;
136*4bdff4beSrobert const uint32_t __c0 = (__c % 100) << 1;
137*4bdff4beSrobert const uint32_t __c1 = (__c / 100) << 1;
138*4bdff4beSrobert _VSTD::memcpy(__result + __olength - __i - 2, __DIGIT_TABLE + __c0, 2);
139*4bdff4beSrobert _VSTD::memcpy(__result + __olength - __i - 4, __DIGIT_TABLE + __c1, 2);
140*4bdff4beSrobert __i += 4;
141*4bdff4beSrobert }
142*4bdff4beSrobert if (__digits >= 100) {
143*4bdff4beSrobert const uint32_t __c = (__digits % 100) << 1;
144*4bdff4beSrobert __digits /= 100;
145*4bdff4beSrobert _VSTD::memcpy(__result + __olength - __i - 2, __DIGIT_TABLE + __c, 2);
146*4bdff4beSrobert __i += 2;
147*4bdff4beSrobert }
148*4bdff4beSrobert if (__digits >= 10) {
149*4bdff4beSrobert const uint32_t __c = __digits << 1;
150*4bdff4beSrobert _VSTD::memcpy(__result + __olength - __i - 2, __DIGIT_TABLE + __c, 2);
151*4bdff4beSrobert } else {
152*4bdff4beSrobert __result[0] = static_cast<char>('0' + __digits);
153*4bdff4beSrobert }
154*4bdff4beSrobert }
155*4bdff4beSrobert
__append_d_digits(const uint32_t __olength,uint32_t __digits,char * const __result)156*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI inline void __append_d_digits(const uint32_t __olength, uint32_t __digits, char* const __result) {
157*4bdff4beSrobert uint32_t __i = 0;
158*4bdff4beSrobert while (__digits >= 10000) {
159*4bdff4beSrobert #ifdef __clang__ // TRANSITION, LLVM-38217
160*4bdff4beSrobert const uint32_t __c = __digits - 10000 * (__digits / 10000);
161*4bdff4beSrobert #else
162*4bdff4beSrobert const uint32_t __c = __digits % 10000;
163*4bdff4beSrobert #endif
164*4bdff4beSrobert __digits /= 10000;
165*4bdff4beSrobert const uint32_t __c0 = (__c % 100) << 1;
166*4bdff4beSrobert const uint32_t __c1 = (__c / 100) << 1;
167*4bdff4beSrobert _VSTD::memcpy(__result + __olength + 1 - __i - 2, __DIGIT_TABLE + __c0, 2);
168*4bdff4beSrobert _VSTD::memcpy(__result + __olength + 1 - __i - 4, __DIGIT_TABLE + __c1, 2);
169*4bdff4beSrobert __i += 4;
170*4bdff4beSrobert }
171*4bdff4beSrobert if (__digits >= 100) {
172*4bdff4beSrobert const uint32_t __c = (__digits % 100) << 1;
173*4bdff4beSrobert __digits /= 100;
174*4bdff4beSrobert _VSTD::memcpy(__result + __olength + 1 - __i - 2, __DIGIT_TABLE + __c, 2);
175*4bdff4beSrobert __i += 2;
176*4bdff4beSrobert }
177*4bdff4beSrobert if (__digits >= 10) {
178*4bdff4beSrobert const uint32_t __c = __digits << 1;
179*4bdff4beSrobert __result[2] = __DIGIT_TABLE[__c + 1];
180*4bdff4beSrobert __result[1] = '.';
181*4bdff4beSrobert __result[0] = __DIGIT_TABLE[__c];
182*4bdff4beSrobert } else {
183*4bdff4beSrobert __result[1] = '.';
184*4bdff4beSrobert __result[0] = static_cast<char>('0' + __digits);
185*4bdff4beSrobert }
186*4bdff4beSrobert }
187*4bdff4beSrobert
__append_c_digits(const uint32_t __count,uint32_t __digits,char * const __result)188*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI inline void __append_c_digits(const uint32_t __count, uint32_t __digits, char* const __result) {
189*4bdff4beSrobert uint32_t __i = 0;
190*4bdff4beSrobert for (; __i < __count - 1; __i += 2) {
191*4bdff4beSrobert const uint32_t __c = (__digits % 100) << 1;
192*4bdff4beSrobert __digits /= 100;
193*4bdff4beSrobert _VSTD::memcpy(__result + __count - __i - 2, __DIGIT_TABLE + __c, 2);
194*4bdff4beSrobert }
195*4bdff4beSrobert if (__i < __count) {
196*4bdff4beSrobert const char __c = static_cast<char>('0' + (__digits % 10));
197*4bdff4beSrobert __result[__count - __i - 1] = __c;
198*4bdff4beSrobert }
199*4bdff4beSrobert }
200*4bdff4beSrobert
__append_nine_digits(uint32_t __digits,char * const __result)201*4bdff4beSrobert void __append_nine_digits(uint32_t __digits, char* const __result) {
202*4bdff4beSrobert if (__digits == 0) {
203*4bdff4beSrobert _VSTD::memset(__result, '0', 9);
204*4bdff4beSrobert return;
205*4bdff4beSrobert }
206*4bdff4beSrobert
207*4bdff4beSrobert for (uint32_t __i = 0; __i < 5; __i += 4) {
208*4bdff4beSrobert #ifdef __clang__ // TRANSITION, LLVM-38217
209*4bdff4beSrobert const uint32_t __c = __digits - 10000 * (__digits / 10000);
210*4bdff4beSrobert #else
211*4bdff4beSrobert const uint32_t __c = __digits % 10000;
212*4bdff4beSrobert #endif
213*4bdff4beSrobert __digits /= 10000;
214*4bdff4beSrobert const uint32_t __c0 = (__c % 100) << 1;
215*4bdff4beSrobert const uint32_t __c1 = (__c / 100) << 1;
216*4bdff4beSrobert _VSTD::memcpy(__result + 7 - __i, __DIGIT_TABLE + __c0, 2);
217*4bdff4beSrobert _VSTD::memcpy(__result + 5 - __i, __DIGIT_TABLE + __c1, 2);
218*4bdff4beSrobert }
219*4bdff4beSrobert __result[0] = static_cast<char>('0' + __digits);
220*4bdff4beSrobert }
221*4bdff4beSrobert
__indexForExponent(const uint32_t __e)222*4bdff4beSrobert [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __indexForExponent(const uint32_t __e) {
223*4bdff4beSrobert return (__e + 15) / 16;
224*4bdff4beSrobert }
225*4bdff4beSrobert
__pow10BitsForIndex(const uint32_t __idx)226*4bdff4beSrobert [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __pow10BitsForIndex(const uint32_t __idx) {
227*4bdff4beSrobert return 16 * __idx + __POW10_ADDITIONAL_BITS;
228*4bdff4beSrobert }
229*4bdff4beSrobert
__lengthForIndex(const uint32_t __idx)230*4bdff4beSrobert [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __lengthForIndex(const uint32_t __idx) {
231*4bdff4beSrobert // +1 for ceil, +16 for mantissa, +8 to round up when dividing by 9
232*4bdff4beSrobert return (__log10Pow2(16 * static_cast<int32_t>(__idx)) + 1 + 16 + 8) / 9;
233*4bdff4beSrobert }
234*4bdff4beSrobert
__d2fixed_buffered_n(char * _First,char * const _Last,const double __d,const uint32_t __precision)235*4bdff4beSrobert [[nodiscard]] to_chars_result __d2fixed_buffered_n(char* _First, char* const _Last, const double __d,
236*4bdff4beSrobert const uint32_t __precision) {
237*4bdff4beSrobert char* const _Original_first = _First;
238*4bdff4beSrobert
239*4bdff4beSrobert const uint64_t __bits = __double_to_bits(__d);
240*4bdff4beSrobert
241*4bdff4beSrobert // Case distinction; exit early for the easy cases.
242*4bdff4beSrobert if (__bits == 0) {
243*4bdff4beSrobert const int32_t _Total_zero_length = 1 // leading zero
244*4bdff4beSrobert + static_cast<int32_t>(__precision != 0) // possible decimal point
245*4bdff4beSrobert + static_cast<int32_t>(__precision); // zeroes after decimal point
246*4bdff4beSrobert
247*4bdff4beSrobert if (_Last - _First < _Total_zero_length) {
248*4bdff4beSrobert return { _Last, errc::value_too_large };
249*4bdff4beSrobert }
250*4bdff4beSrobert
251*4bdff4beSrobert *_First++ = '0';
252*4bdff4beSrobert if (__precision > 0) {
253*4bdff4beSrobert *_First++ = '.';
254*4bdff4beSrobert _VSTD::memset(_First, '0', __precision);
255*4bdff4beSrobert _First += __precision;
256*4bdff4beSrobert }
257*4bdff4beSrobert return { _First, errc{} };
258*4bdff4beSrobert }
259*4bdff4beSrobert
260*4bdff4beSrobert // Decode __bits into mantissa and exponent.
261*4bdff4beSrobert const uint64_t __ieeeMantissa = __bits & ((1ull << __DOUBLE_MANTISSA_BITS) - 1);
262*4bdff4beSrobert const uint32_t __ieeeExponent = static_cast<uint32_t>(__bits >> __DOUBLE_MANTISSA_BITS);
263*4bdff4beSrobert
264*4bdff4beSrobert int32_t __e2;
265*4bdff4beSrobert uint64_t __m2;
266*4bdff4beSrobert if (__ieeeExponent == 0) {
267*4bdff4beSrobert __e2 = 1 - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
268*4bdff4beSrobert __m2 = __ieeeMantissa;
269*4bdff4beSrobert } else {
270*4bdff4beSrobert __e2 = static_cast<int32_t>(__ieeeExponent) - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
271*4bdff4beSrobert __m2 = (1ull << __DOUBLE_MANTISSA_BITS) | __ieeeMantissa;
272*4bdff4beSrobert }
273*4bdff4beSrobert
274*4bdff4beSrobert bool __nonzero = false;
275*4bdff4beSrobert if (__e2 >= -52) {
276*4bdff4beSrobert const uint32_t __idx = __e2 < 0 ? 0 : __indexForExponent(static_cast<uint32_t>(__e2));
277*4bdff4beSrobert const uint32_t __p10bits = __pow10BitsForIndex(__idx);
278*4bdff4beSrobert const int32_t __len = static_cast<int32_t>(__lengthForIndex(__idx));
279*4bdff4beSrobert for (int32_t __i = __len - 1; __i >= 0; --__i) {
280*4bdff4beSrobert const uint32_t __j = __p10bits - __e2;
281*4bdff4beSrobert // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
282*4bdff4beSrobert // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
283*4bdff4beSrobert const uint32_t __digits = __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT[__POW10_OFFSET[__idx] + __i],
284*4bdff4beSrobert static_cast<int32_t>(__j + 8));
285*4bdff4beSrobert if (__nonzero) {
286*4bdff4beSrobert if (_Last - _First < 9) {
287*4bdff4beSrobert return { _Last, errc::value_too_large };
288*4bdff4beSrobert }
289*4bdff4beSrobert __append_nine_digits(__digits, _First);
290*4bdff4beSrobert _First += 9;
291*4bdff4beSrobert } else if (__digits != 0) {
292*4bdff4beSrobert const uint32_t __olength = __decimalLength9(__digits);
293*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__olength)) {
294*4bdff4beSrobert return { _Last, errc::value_too_large };
295*4bdff4beSrobert }
296*4bdff4beSrobert __append_n_digits(__olength, __digits, _First);
297*4bdff4beSrobert _First += __olength;
298*4bdff4beSrobert __nonzero = true;
299*4bdff4beSrobert }
300*4bdff4beSrobert }
301*4bdff4beSrobert }
302*4bdff4beSrobert if (!__nonzero) {
303*4bdff4beSrobert if (_First == _Last) {
304*4bdff4beSrobert return { _Last, errc::value_too_large };
305*4bdff4beSrobert }
306*4bdff4beSrobert *_First++ = '0';
307*4bdff4beSrobert }
308*4bdff4beSrobert if (__precision > 0) {
309*4bdff4beSrobert if (_First == _Last) {
310*4bdff4beSrobert return { _Last, errc::value_too_large };
311*4bdff4beSrobert }
312*4bdff4beSrobert *_First++ = '.';
313*4bdff4beSrobert }
314*4bdff4beSrobert if (__e2 < 0) {
315*4bdff4beSrobert const int32_t __idx = -__e2 / 16;
316*4bdff4beSrobert const uint32_t __blocks = __precision / 9 + 1;
317*4bdff4beSrobert // 0 = don't round up; 1 = round up unconditionally; 2 = round up if odd.
318*4bdff4beSrobert int __roundUp = 0;
319*4bdff4beSrobert uint32_t __i = 0;
320*4bdff4beSrobert if (__blocks <= __MIN_BLOCK_2[__idx]) {
321*4bdff4beSrobert __i = __blocks;
322*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__precision)) {
323*4bdff4beSrobert return { _Last, errc::value_too_large };
324*4bdff4beSrobert }
325*4bdff4beSrobert _VSTD::memset(_First, '0', __precision);
326*4bdff4beSrobert _First += __precision;
327*4bdff4beSrobert } else if (__i < __MIN_BLOCK_2[__idx]) {
328*4bdff4beSrobert __i = __MIN_BLOCK_2[__idx];
329*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(9 * __i)) {
330*4bdff4beSrobert return { _Last, errc::value_too_large };
331*4bdff4beSrobert }
332*4bdff4beSrobert _VSTD::memset(_First, '0', 9 * __i);
333*4bdff4beSrobert _First += 9 * __i;
334*4bdff4beSrobert }
335*4bdff4beSrobert for (; __i < __blocks; ++__i) {
336*4bdff4beSrobert const int32_t __j = __ADDITIONAL_BITS_2 + (-__e2 - 16 * __idx);
337*4bdff4beSrobert const uint32_t __p = __POW10_OFFSET_2[__idx] + __i - __MIN_BLOCK_2[__idx];
338*4bdff4beSrobert if (__p >= __POW10_OFFSET_2[__idx + 1]) {
339*4bdff4beSrobert // If the remaining digits are all 0, then we might as well use memset.
340*4bdff4beSrobert // No rounding required in this case.
341*4bdff4beSrobert const uint32_t __fill = __precision - 9 * __i;
342*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__fill)) {
343*4bdff4beSrobert return { _Last, errc::value_too_large };
344*4bdff4beSrobert }
345*4bdff4beSrobert _VSTD::memset(_First, '0', __fill);
346*4bdff4beSrobert _First += __fill;
347*4bdff4beSrobert break;
348*4bdff4beSrobert }
349*4bdff4beSrobert // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
350*4bdff4beSrobert // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
351*4bdff4beSrobert uint32_t __digits = __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT_2[__p], __j + 8);
352*4bdff4beSrobert if (__i < __blocks - 1) {
353*4bdff4beSrobert if (_Last - _First < 9) {
354*4bdff4beSrobert return { _Last, errc::value_too_large };
355*4bdff4beSrobert }
356*4bdff4beSrobert __append_nine_digits(__digits, _First);
357*4bdff4beSrobert _First += 9;
358*4bdff4beSrobert } else {
359*4bdff4beSrobert const uint32_t __maximum = __precision - 9 * __i;
360*4bdff4beSrobert uint32_t __lastDigit = 0;
361*4bdff4beSrobert for (uint32_t __k = 0; __k < 9 - __maximum; ++__k) {
362*4bdff4beSrobert __lastDigit = __digits % 10;
363*4bdff4beSrobert __digits /= 10;
364*4bdff4beSrobert }
365*4bdff4beSrobert if (__lastDigit != 5) {
366*4bdff4beSrobert __roundUp = __lastDigit > 5;
367*4bdff4beSrobert } else {
368*4bdff4beSrobert // Is m * 10^(additionalDigits + 1) / 2^(-__e2) integer?
369*4bdff4beSrobert const int32_t __requiredTwos = -__e2 - static_cast<int32_t>(__precision) - 1;
370*4bdff4beSrobert const bool __trailingZeros = __requiredTwos <= 0
371*4bdff4beSrobert || (__requiredTwos < 60 && __multipleOfPowerOf2(__m2, static_cast<uint32_t>(__requiredTwos)));
372*4bdff4beSrobert __roundUp = __trailingZeros ? 2 : 1;
373*4bdff4beSrobert }
374*4bdff4beSrobert if (__maximum > 0) {
375*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__maximum)) {
376*4bdff4beSrobert return { _Last, errc::value_too_large };
377*4bdff4beSrobert }
378*4bdff4beSrobert __append_c_digits(__maximum, __digits, _First);
379*4bdff4beSrobert _First += __maximum;
380*4bdff4beSrobert }
381*4bdff4beSrobert break;
382*4bdff4beSrobert }
383*4bdff4beSrobert }
384*4bdff4beSrobert if (__roundUp != 0) {
385*4bdff4beSrobert char* _Round = _First;
386*4bdff4beSrobert char* _Dot = _Last;
387*4bdff4beSrobert while (true) {
388*4bdff4beSrobert if (_Round == _Original_first) {
389*4bdff4beSrobert _Round[0] = '1';
390*4bdff4beSrobert if (_Dot != _Last) {
391*4bdff4beSrobert _Dot[0] = '0';
392*4bdff4beSrobert _Dot[1] = '.';
393*4bdff4beSrobert }
394*4bdff4beSrobert if (_First == _Last) {
395*4bdff4beSrobert return { _Last, errc::value_too_large };
396*4bdff4beSrobert }
397*4bdff4beSrobert *_First++ = '0';
398*4bdff4beSrobert break;
399*4bdff4beSrobert }
400*4bdff4beSrobert --_Round;
401*4bdff4beSrobert const char __c = _Round[0];
402*4bdff4beSrobert if (__c == '.') {
403*4bdff4beSrobert _Dot = _Round;
404*4bdff4beSrobert } else if (__c == '9') {
405*4bdff4beSrobert _Round[0] = '0';
406*4bdff4beSrobert __roundUp = 1;
407*4bdff4beSrobert } else {
408*4bdff4beSrobert if (__roundUp == 1 || __c % 2 != 0) {
409*4bdff4beSrobert _Round[0] = __c + 1;
410*4bdff4beSrobert }
411*4bdff4beSrobert break;
412*4bdff4beSrobert }
413*4bdff4beSrobert }
414*4bdff4beSrobert }
415*4bdff4beSrobert } else {
416*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__precision)) {
417*4bdff4beSrobert return { _Last, errc::value_too_large };
418*4bdff4beSrobert }
419*4bdff4beSrobert _VSTD::memset(_First, '0', __precision);
420*4bdff4beSrobert _First += __precision;
421*4bdff4beSrobert }
422*4bdff4beSrobert return { _First, errc{} };
423*4bdff4beSrobert }
424*4bdff4beSrobert
__d2exp_buffered_n(char * _First,char * const _Last,const double __d,uint32_t __precision)425*4bdff4beSrobert [[nodiscard]] to_chars_result __d2exp_buffered_n(char* _First, char* const _Last, const double __d,
426*4bdff4beSrobert uint32_t __precision) {
427*4bdff4beSrobert char* const _Original_first = _First;
428*4bdff4beSrobert
429*4bdff4beSrobert const uint64_t __bits = __double_to_bits(__d);
430*4bdff4beSrobert
431*4bdff4beSrobert // Case distinction; exit early for the easy cases.
432*4bdff4beSrobert if (__bits == 0) {
433*4bdff4beSrobert const int32_t _Total_zero_length = 1 // leading zero
434*4bdff4beSrobert + static_cast<int32_t>(__precision != 0) // possible decimal point
435*4bdff4beSrobert + static_cast<int32_t>(__precision) // zeroes after decimal point
436*4bdff4beSrobert + 4; // "e+00"
437*4bdff4beSrobert if (_Last - _First < _Total_zero_length) {
438*4bdff4beSrobert return { _Last, errc::value_too_large };
439*4bdff4beSrobert }
440*4bdff4beSrobert *_First++ = '0';
441*4bdff4beSrobert if (__precision > 0) {
442*4bdff4beSrobert *_First++ = '.';
443*4bdff4beSrobert _VSTD::memset(_First, '0', __precision);
444*4bdff4beSrobert _First += __precision;
445*4bdff4beSrobert }
446*4bdff4beSrobert _VSTD::memcpy(_First, "e+00", 4);
447*4bdff4beSrobert _First += 4;
448*4bdff4beSrobert return { _First, errc{} };
449*4bdff4beSrobert }
450*4bdff4beSrobert
451*4bdff4beSrobert // Decode __bits into mantissa and exponent.
452*4bdff4beSrobert const uint64_t __ieeeMantissa = __bits & ((1ull << __DOUBLE_MANTISSA_BITS) - 1);
453*4bdff4beSrobert const uint32_t __ieeeExponent = static_cast<uint32_t>(__bits >> __DOUBLE_MANTISSA_BITS);
454*4bdff4beSrobert
455*4bdff4beSrobert int32_t __e2;
456*4bdff4beSrobert uint64_t __m2;
457*4bdff4beSrobert if (__ieeeExponent == 0) {
458*4bdff4beSrobert __e2 = 1 - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
459*4bdff4beSrobert __m2 = __ieeeMantissa;
460*4bdff4beSrobert } else {
461*4bdff4beSrobert __e2 = static_cast<int32_t>(__ieeeExponent) - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
462*4bdff4beSrobert __m2 = (1ull << __DOUBLE_MANTISSA_BITS) | __ieeeMantissa;
463*4bdff4beSrobert }
464*4bdff4beSrobert
465*4bdff4beSrobert const bool __printDecimalPoint = __precision > 0;
466*4bdff4beSrobert ++__precision;
467*4bdff4beSrobert uint32_t __digits = 0;
468*4bdff4beSrobert uint32_t __printedDigits = 0;
469*4bdff4beSrobert uint32_t __availableDigits = 0;
470*4bdff4beSrobert int32_t __exp = 0;
471*4bdff4beSrobert if (__e2 >= -52) {
472*4bdff4beSrobert const uint32_t __idx = __e2 < 0 ? 0 : __indexForExponent(static_cast<uint32_t>(__e2));
473*4bdff4beSrobert const uint32_t __p10bits = __pow10BitsForIndex(__idx);
474*4bdff4beSrobert const int32_t __len = static_cast<int32_t>(__lengthForIndex(__idx));
475*4bdff4beSrobert for (int32_t __i = __len - 1; __i >= 0; --__i) {
476*4bdff4beSrobert const uint32_t __j = __p10bits - __e2;
477*4bdff4beSrobert // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
478*4bdff4beSrobert // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
479*4bdff4beSrobert __digits = __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT[__POW10_OFFSET[__idx] + __i],
480*4bdff4beSrobert static_cast<int32_t>(__j + 8));
481*4bdff4beSrobert if (__printedDigits != 0) {
482*4bdff4beSrobert if (__printedDigits + 9 > __precision) {
483*4bdff4beSrobert __availableDigits = 9;
484*4bdff4beSrobert break;
485*4bdff4beSrobert }
486*4bdff4beSrobert if (_Last - _First < 9) {
487*4bdff4beSrobert return { _Last, errc::value_too_large };
488*4bdff4beSrobert }
489*4bdff4beSrobert __append_nine_digits(__digits, _First);
490*4bdff4beSrobert _First += 9;
491*4bdff4beSrobert __printedDigits += 9;
492*4bdff4beSrobert } else if (__digits != 0) {
493*4bdff4beSrobert __availableDigits = __decimalLength9(__digits);
494*4bdff4beSrobert __exp = __i * 9 + static_cast<int32_t>(__availableDigits) - 1;
495*4bdff4beSrobert if (__availableDigits > __precision) {
496*4bdff4beSrobert break;
497*4bdff4beSrobert }
498*4bdff4beSrobert if (__printDecimalPoint) {
499*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__availableDigits + 1)) {
500*4bdff4beSrobert return { _Last, errc::value_too_large };
501*4bdff4beSrobert }
502*4bdff4beSrobert __append_d_digits(__availableDigits, __digits, _First);
503*4bdff4beSrobert _First += __availableDigits + 1; // +1 for decimal point
504*4bdff4beSrobert } else {
505*4bdff4beSrobert if (_First == _Last) {
506*4bdff4beSrobert return { _Last, errc::value_too_large };
507*4bdff4beSrobert }
508*4bdff4beSrobert *_First++ = static_cast<char>('0' + __digits);
509*4bdff4beSrobert }
510*4bdff4beSrobert __printedDigits = __availableDigits;
511*4bdff4beSrobert __availableDigits = 0;
512*4bdff4beSrobert }
513*4bdff4beSrobert }
514*4bdff4beSrobert }
515*4bdff4beSrobert
516*4bdff4beSrobert if (__e2 < 0 && __availableDigits == 0) {
517*4bdff4beSrobert const int32_t __idx = -__e2 / 16;
518*4bdff4beSrobert for (int32_t __i = __MIN_BLOCK_2[__idx]; __i < 200; ++__i) {
519*4bdff4beSrobert const int32_t __j = __ADDITIONAL_BITS_2 + (-__e2 - 16 * __idx);
520*4bdff4beSrobert const uint32_t __p = __POW10_OFFSET_2[__idx] + static_cast<uint32_t>(__i) - __MIN_BLOCK_2[__idx];
521*4bdff4beSrobert // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
522*4bdff4beSrobert // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
523*4bdff4beSrobert __digits = (__p >= __POW10_OFFSET_2[__idx + 1]) ? 0 : __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT_2[__p], __j + 8);
524*4bdff4beSrobert if (__printedDigits != 0) {
525*4bdff4beSrobert if (__printedDigits + 9 > __precision) {
526*4bdff4beSrobert __availableDigits = 9;
527*4bdff4beSrobert break;
528*4bdff4beSrobert }
529*4bdff4beSrobert if (_Last - _First < 9) {
530*4bdff4beSrobert return { _Last, errc::value_too_large };
531*4bdff4beSrobert }
532*4bdff4beSrobert __append_nine_digits(__digits, _First);
533*4bdff4beSrobert _First += 9;
534*4bdff4beSrobert __printedDigits += 9;
535*4bdff4beSrobert } else if (__digits != 0) {
536*4bdff4beSrobert __availableDigits = __decimalLength9(__digits);
537*4bdff4beSrobert __exp = -(__i + 1) * 9 + static_cast<int32_t>(__availableDigits) - 1;
538*4bdff4beSrobert if (__availableDigits > __precision) {
539*4bdff4beSrobert break;
540*4bdff4beSrobert }
541*4bdff4beSrobert if (__printDecimalPoint) {
542*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__availableDigits + 1)) {
543*4bdff4beSrobert return { _Last, errc::value_too_large };
544*4bdff4beSrobert }
545*4bdff4beSrobert __append_d_digits(__availableDigits, __digits, _First);
546*4bdff4beSrobert _First += __availableDigits + 1; // +1 for decimal point
547*4bdff4beSrobert } else {
548*4bdff4beSrobert if (_First == _Last) {
549*4bdff4beSrobert return { _Last, errc::value_too_large };
550*4bdff4beSrobert }
551*4bdff4beSrobert *_First++ = static_cast<char>('0' + __digits);
552*4bdff4beSrobert }
553*4bdff4beSrobert __printedDigits = __availableDigits;
554*4bdff4beSrobert __availableDigits = 0;
555*4bdff4beSrobert }
556*4bdff4beSrobert }
557*4bdff4beSrobert }
558*4bdff4beSrobert
559*4bdff4beSrobert const uint32_t __maximum = __precision - __printedDigits;
560*4bdff4beSrobert if (__availableDigits == 0) {
561*4bdff4beSrobert __digits = 0;
562*4bdff4beSrobert }
563*4bdff4beSrobert uint32_t __lastDigit = 0;
564*4bdff4beSrobert if (__availableDigits > __maximum) {
565*4bdff4beSrobert for (uint32_t __k = 0; __k < __availableDigits - __maximum; ++__k) {
566*4bdff4beSrobert __lastDigit = __digits % 10;
567*4bdff4beSrobert __digits /= 10;
568*4bdff4beSrobert }
569*4bdff4beSrobert }
570*4bdff4beSrobert // 0 = don't round up; 1 = round up unconditionally; 2 = round up if odd.
571*4bdff4beSrobert int __roundUp = 0;
572*4bdff4beSrobert if (__lastDigit != 5) {
573*4bdff4beSrobert __roundUp = __lastDigit > 5;
574*4bdff4beSrobert } else {
575*4bdff4beSrobert // Is m * 2^__e2 * 10^(__precision + 1 - __exp) integer?
576*4bdff4beSrobert // __precision was already increased by 1, so we don't need to write + 1 here.
577*4bdff4beSrobert const int32_t __rexp = static_cast<int32_t>(__precision) - __exp;
578*4bdff4beSrobert const int32_t __requiredTwos = -__e2 - __rexp;
579*4bdff4beSrobert bool __trailingZeros = __requiredTwos <= 0
580*4bdff4beSrobert || (__requiredTwos < 60 && __multipleOfPowerOf2(__m2, static_cast<uint32_t>(__requiredTwos)));
581*4bdff4beSrobert if (__rexp < 0) {
582*4bdff4beSrobert const int32_t __requiredFives = -__rexp;
583*4bdff4beSrobert __trailingZeros = __trailingZeros && __multipleOfPowerOf5(__m2, static_cast<uint32_t>(__requiredFives));
584*4bdff4beSrobert }
585*4bdff4beSrobert __roundUp = __trailingZeros ? 2 : 1;
586*4bdff4beSrobert }
587*4bdff4beSrobert if (__printedDigits != 0) {
588*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__maximum)) {
589*4bdff4beSrobert return { _Last, errc::value_too_large };
590*4bdff4beSrobert }
591*4bdff4beSrobert if (__digits == 0) {
592*4bdff4beSrobert _VSTD::memset(_First, '0', __maximum);
593*4bdff4beSrobert } else {
594*4bdff4beSrobert __append_c_digits(__maximum, __digits, _First);
595*4bdff4beSrobert }
596*4bdff4beSrobert _First += __maximum;
597*4bdff4beSrobert } else {
598*4bdff4beSrobert if (__printDecimalPoint) {
599*4bdff4beSrobert if (_Last - _First < static_cast<ptrdiff_t>(__maximum + 1)) {
600*4bdff4beSrobert return { _Last, errc::value_too_large };
601*4bdff4beSrobert }
602*4bdff4beSrobert __append_d_digits(__maximum, __digits, _First);
603*4bdff4beSrobert _First += __maximum + 1; // +1 for decimal point
604*4bdff4beSrobert } else {
605*4bdff4beSrobert if (_First == _Last) {
606*4bdff4beSrobert return { _Last, errc::value_too_large };
607*4bdff4beSrobert }
608*4bdff4beSrobert *_First++ = static_cast<char>('0' + __digits);
609*4bdff4beSrobert }
610*4bdff4beSrobert }
611*4bdff4beSrobert if (__roundUp != 0) {
612*4bdff4beSrobert char* _Round = _First;
613*4bdff4beSrobert while (true) {
614*4bdff4beSrobert if (_Round == _Original_first) {
615*4bdff4beSrobert _Round[0] = '1';
616*4bdff4beSrobert ++__exp;
617*4bdff4beSrobert break;
618*4bdff4beSrobert }
619*4bdff4beSrobert --_Round;
620*4bdff4beSrobert const char __c = _Round[0];
621*4bdff4beSrobert if (__c == '.') {
622*4bdff4beSrobert // Keep going.
623*4bdff4beSrobert } else if (__c == '9') {
624*4bdff4beSrobert _Round[0] = '0';
625*4bdff4beSrobert __roundUp = 1;
626*4bdff4beSrobert } else {
627*4bdff4beSrobert if (__roundUp == 1 || __c % 2 != 0) {
628*4bdff4beSrobert _Round[0] = __c + 1;
629*4bdff4beSrobert }
630*4bdff4beSrobert break;
631*4bdff4beSrobert }
632*4bdff4beSrobert }
633*4bdff4beSrobert }
634*4bdff4beSrobert
635*4bdff4beSrobert char _Sign_character;
636*4bdff4beSrobert
637*4bdff4beSrobert if (__exp < 0) {
638*4bdff4beSrobert _Sign_character = '-';
639*4bdff4beSrobert __exp = -__exp;
640*4bdff4beSrobert } else {
641*4bdff4beSrobert _Sign_character = '+';
642*4bdff4beSrobert }
643*4bdff4beSrobert
644*4bdff4beSrobert const int _Exponent_part_length = __exp >= 100
645*4bdff4beSrobert ? 5 // "e+NNN"
646*4bdff4beSrobert : 4; // "e+NN"
647*4bdff4beSrobert
648*4bdff4beSrobert if (_Last - _First < _Exponent_part_length) {
649*4bdff4beSrobert return { _Last, errc::value_too_large };
650*4bdff4beSrobert }
651*4bdff4beSrobert
652*4bdff4beSrobert *_First++ = 'e';
653*4bdff4beSrobert *_First++ = _Sign_character;
654*4bdff4beSrobert
655*4bdff4beSrobert if (__exp >= 100) {
656*4bdff4beSrobert const int32_t __c = __exp % 10;
657*4bdff4beSrobert _VSTD::memcpy(_First, __DIGIT_TABLE + 2 * (__exp / 10), 2);
658*4bdff4beSrobert _First[2] = static_cast<char>('0' + __c);
659*4bdff4beSrobert _First += 3;
660*4bdff4beSrobert } else {
661*4bdff4beSrobert _VSTD::memcpy(_First, __DIGIT_TABLE + 2 * __exp, 2);
662*4bdff4beSrobert _First += 2;
663*4bdff4beSrobert }
664*4bdff4beSrobert
665*4bdff4beSrobert return { _First, errc{} };
666*4bdff4beSrobert }
667*4bdff4beSrobert
668*4bdff4beSrobert _LIBCPP_END_NAMESPACE_STD
669*4bdff4beSrobert
670*4bdff4beSrobert // clang-format on
671