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