@@ -507,8 +507,7 @@ inline auto read8(char* buffer) noexcept -> uint64_t {
507507// buffer[0] may contain '0' after this function if the leading digit is zero.
508508template <int num_bits, bool use_sse = ZMIJ_USE_SSE != 0 && num_bits == 64 >
509509ZMIJ_INLINE auto write_significand (char * buffer, uint64_t value,
510- bool extra_digit,
511- long long value_div10) noexcept -> char* {
510+ bool extra_digit) noexcept -> char* {
512511 if (num_bits == 32 ) {
513512 buffer = write_if (buffer, value / 100'000'000 , extra_digit);
514513 uint64_t bcd = to_bcd8 (value % 100'000'000 );
@@ -697,14 +696,6 @@ ZMIJ_INLINE auto write_significand(char* buffer, uint64_t value,
697696struct to_decimal_result {
698697 long long sig;
699698 int exp;
700-
701- #if ZMIJ_USE_SSE
702- long long sig_div10;
703- void set_div10 (long long value) { sig_div10 = value; }
704- #else
705- static constexpr long long sig_div10 = 0 ;
706- void set_div10 (long long ) {}
707- #endif
708699};
709700
710701template <typename UInt>
@@ -736,11 +727,7 @@ ZMIJ_INLINE auto to_decimal_schubfach(UInt bin_sig, int64_t bin_exp,
736727 // It is less or equal to the upper bound by construction.
737728 long long div10 = (upper >> bound_shift) / 10 ;
738729 UInt shorter = div10 * 10 ;
739- if ((shorter << bound_shift) >= lower) {
740- to_decimal_result result = {int64_t (shorter), dec_exp};
741- result.set_div10 (div10);
742- return result;
743- }
730+ if ((shorter << bound_shift) >= lower) return {int64_t (shorter), dec_exp};
744731
745732 UInt scaled_sig =
746733 umulhi_inexact_to_odd (pow10.hi , pow10.lo , bin_sig_shifted << exp_shift);
@@ -754,9 +741,7 @@ ZMIJ_INLINE auto to_decimal_schubfach(UInt bin_sig, int64_t bin_exp,
754741 bool below_closer = cmp < 0 || (cmp == 0 && (longer_below & 1 ) == 0 );
755742 bool below_in = (longer_below << bound_shift) >= lower;
756743 UInt dec_sig = (below_closer & below_in) ? longer_below : longer_above;
757- to_decimal_result result = {int64_t (dec_sig), dec_exp};
758- result.set_div10 (dec_sig / 10 );
759- return result;
744+ return {int64_t (dec_sig), dec_exp};
760745}
761746
762747// Here be 🐉s.
@@ -857,21 +842,19 @@ ZMIJ_INLINE auto to_decimal_fast(UInt bin_sig, int64_t raw_exp,
857842 }
858843 shorter += round_up * 10 ;
859844 bool use_shorter = (scaled_sig_mod10 <= scaled_half_ulp) + round_up != 0 ;
860- to_decimal_result result = {use_shorter ? shorter : longer, dec_exp};
861- result.set_div10 (div10 + use_shorter * round_up);
862- return result;
845+ return {use_shorter ? shorter : longer, dec_exp};
863846 }
864847 return to_decimal_schubfach (bin_sig, bin_exp, regular);
865848}
866849
867850template <int num_bits>
868- auto write_fixed (char * buffer, uint64_t dec_sig, int dec_exp, bool extra_digit,
869- long long dec_sig_div10 ) noexcept -> char* {
851+ auto write_fixed (char * buffer, uint64_t dec_sig, int dec_exp,
852+ bool extra_digit ) noexcept -> char* {
870853 if (dec_exp < 0 ) {
871854 char * point = buffer + 1 ;
872855 memcpy (buffer, " 0.000000" , 8 );
873- buffer = write_significand<num_bits>(buffer + 1 - dec_exp, dec_sig,
874- extra_digit, dec_sig_div10 );
856+ buffer =
857+ write_significand<num_bits>(buffer + 1 - dec_exp, dec_sig, extra_digit );
875858 if (ZMIJ_USE_SSE) *point = ' .' ;
876859 *buffer = ' \0 ' ;
877860 return buffer;
@@ -881,8 +864,7 @@ auto write_fixed(char* buffer, uint64_t dec_sig, int dec_exp, bool extra_digit,
881864 write8 (buffer + (num_bits == 64 ? 16 : 7 ), 0 );
882865
883866 char * start = buffer;
884- buffer = write_significand<num_bits, false >(buffer, dec_sig, extra_digit,
885- dec_sig_div10);
867+ buffer = write_significand<num_bits, false >(buffer, dec_sig, extra_digit);
886868
887869 // Branchless move to make space for the '.' without OOB accesses.
888870 char * part1 = start + dec_exp + (dec_exp < 2 );
@@ -955,7 +937,6 @@ auto write(Float value, char* buffer) noexcept -> char* {
955937 dec.sig *= 10 ;
956938 --dec.exp ;
957939 }
958- dec.set_div10 (dec.sig / 10 );
959940 } else {
960941 dec = to_decimal_fast<Float>(bin_sig | traits::implicit_bit, bin_exp,
961942 bin_sig != 0 );
@@ -970,12 +951,11 @@ auto write(Float value, char* buffer) noexcept -> char* {
970951
971952 // Write significand.
972953 if (dec_exp >= -4 && dec_exp < compute_dec_exp (traits::digits + 1 )) {
973- return write_fixed<traits::num_bits>(buffer, dec.sig , dec_exp, extra_digit,
974- dec.sig_div10 );
954+ return write_fixed<traits::num_bits>(buffer, dec.sig , dec_exp, extra_digit);
975955 }
976956 char * start = buffer;
977- buffer = write_significand<traits::num_bits>(buffer + 1 , dec. sig , extra_digit,
978- dec.sig_div10 );
957+ buffer =
958+ write_significand<traits::num_bits>(buffer + 1 , dec.sig , extra_digit );
979959 start[0 ] = start[1 ];
980960 start[1 ] = ' .' ;
981961 buffer -= (buffer - 1 == start + 1 ); // Remove trailing point.
0 commit comments