diff --git a/src/digits.h b/src/digits.h index d362293..33c9f91 100644 --- a/src/digits.h +++ b/src/digits.h @@ -52,47 +52,6 @@ champagne_lemire_really_inline std::pair div10e16(uint64_t x return {q, r}; } -champagne_lemire_really_inline std::array get_one_digit_with_dot(uint32_t value) { - constexpr static std::array, 10> digit_table = []() { - std::array, 10> table; - for (int i = 0; i < 10; ++i) { - // Calculate the tens digit - table[i][0] = i + '0'; - table[i][1] = '.'; - } - return table; - }(); - return digit_table[value]; -} - -champagne_lemire_really_inline std::array get_two_digits_with_dot(uint32_t value) { - constexpr static std::array, 100> hundreds_digit_table = - []() { - std::array, 100> table{}; - for (int i = 0; i < 100; ++i) { - table[i] = {static_cast((i / 10) % 10 + '0'), '.', - static_cast((i % 10) + '0')}; - } - return table; - }(); - return hundreds_digit_table[value]; -} - - - -champagne_lemire_really_inline std::array get_two_digits_with_dot_with_one_pad(uint32_t value) { - constexpr static std::array, 100> hundreds_digit_table = - []() { - std::array, 100> table{}; - for (int i = 0; i < 100; ++i) { - table[i] = {static_cast((i / 10) % 10 + '0'), '.', - static_cast((i % 10) + '0'), '0'}; // extra pad - } - return table; - }(); - return hundreds_digit_table[value]; -} - champagne_lemire_really_inline std::array get_two_digits_v(uint32_t value) { constexpr static std::array, 256> hundreds_digit_table = []() { @@ -121,68 +80,12 @@ champagne_lemire_really_inline std::array get_two_digits(uint32_t value return hundreds_digit_table[value]; } -// We stop at 309 because that is the upper bound for the exponent in a double -champagne_lemire_really_inline std::array get_three_digits(uint32_t value) { - constexpr static std::array, 309> digit_table = - []() { - std::array, 309> table; - for (int i = 0; i < 309; ++i) { - table[i][0] = (i / 100) + '0'; - // Calculate the tens digit - table[i][1] = ((i / 10) % 10) + '0'; - // Calculate the units digit - table[i][2] = (i % 10) + '0'; - } - return table; - }(); - return digit_table[value]; -} - -champagne_lemire_really_inline void write_one_digit_with_dot(char *buffer, uint32_t value) { - std::memcpy(buffer, get_one_digit_with_dot(value).data(), 2); -} - -champagne_lemire_really_inline void write_two_digits_with_dot(char *buffer, uint32_t value) { - std::memcpy(buffer, get_two_digits_with_dot(value).data(), 3); -} - -// writes two digits, a dot, and a padding zero, why the padding zero? because -// it is faster to copy four bytes than three bytes on most architectures. -champagne_lemire_really_inline void write_two_digits_with_dot_with_one_pad(char *buffer, uint32_t value) { - std::memcpy(buffer, get_two_digits_with_dot_with_one_pad(value).data(), 4); -} - -champagne_lemire_really_inline void write_two_digits(char *buffer, uint32_t value) { - std::memcpy(buffer, get_two_digits(value).data(), 2); -} - -champagne_lemire_really_inline void write_two_digits_v(char *buffer, uint32_t value) { - std::memcpy(buffer, get_two_digits_v(value).data(), 2); -} - -champagne_lemire_really_inline void write_three_digits(char *buffer, uint32_t value) { - std::memcpy(buffer, get_three_digits(value).data(), 3); -} - champagne_lemire_really_inline void write_four_digits_10000(char *buffer, uint64_t value) { auto [high, low] = div100v(value); std::memcpy(buffer, get_two_digits(high).data(), 2); std::memcpy(buffer + 2, get_two_digits_v(low).data(), 2); } -champagne_lemire_really_inline char* write_three_or_four_digits_10000(char *buffer, uint64_t value) { - auto [high, low] = div100v(value); - if (value < 1000) { - buffer[0] = char('0' + high); - std::memcpy(buffer + 1, get_two_digits_v(low).data(), 2); - return buffer + 3; - } else { - std::memcpy(buffer, get_two_digits(high).data(), 2); - std::memcpy(buffer + 2, get_two_digits_v(low).data(), 2); - return buffer + 4; - } -} - champagne_lemire_really_inline char* write_one_two_three_or_four_digits_10000(char *buffer, uint64_t value) { if(value >= 1000) { // four digits const auto [high, low] = div100v(value); diff --git a/src/ifma_avx512.h b/src/ifma_avx512.h index e5e9212..b294e90 100644 --- a/src/ifma_avx512.h +++ b/src/ifma_avx512.h @@ -92,7 +92,6 @@ champagne_lemire_really_inline __m512i to_string_avx512ifma_8digits(uint64_t n) twoto52 / 100000000, twoto52 / 10000000, twoto52 / 1000000, twoto52 / 100000, twoto52 / 10000, twoto52 / 1000, twoto52 / 100, twoto52 / 10 ); - __m512i zmmzero = _mm512_castsi128_si512(_mm_cvtsi64_si128(0x01A1A400)); __m512i zmmTen = _mm512_set1_epi64(10); __m512i asciiZero = _mm512_set1_epi64('0'); __m512i lowbits_l = _mm512_madd52lo_epu64(ifma_const, bcstq_l, ifma_const); // ifma_const * bcstq_l + ifma_const