Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 0 additions & 97 deletions src/digits.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,47 +52,6 @@ champagne_lemire_really_inline std::pair<uint64_t, uint64_t> div10e16(uint64_t x
return {q, r};
}

champagne_lemire_really_inline std::array<char, 2> get_one_digit_with_dot(uint32_t value) {
constexpr static std::array<std::array<char, 2>, 10> digit_table = []() {
std::array<std::array<char, 2>, 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<char, 3> get_two_digits_with_dot(uint32_t value) {
constexpr static std::array<std::array<char, 3>, 100> hundreds_digit_table =
[]() {
std::array<std::array<char, 3>, 100> table{};
for (int i = 0; i < 100; ++i) {
table[i] = {static_cast<char>((i / 10) % 10 + '0'), '.',
static_cast<char>((i % 10) + '0')};
}
return table;
}();
return hundreds_digit_table[value];
}



champagne_lemire_really_inline std::array<char, 4> get_two_digits_with_dot_with_one_pad(uint32_t value) {
constexpr static std::array<std::array<char, 4>, 100> hundreds_digit_table =
[]() {
std::array<std::array<char, 4>, 100> table{};
for (int i = 0; i < 100; ++i) {
table[i] = {static_cast<char>((i / 10) % 10 + '0'), '.',
static_cast<char>((i % 10) + '0'), '0'}; // extra pad
}
return table;
}();
return hundreds_digit_table[value];
}

champagne_lemire_really_inline std::array<char, 2> get_two_digits_v(uint32_t value) {
constexpr static std::array<std::array<char, 2>, 256> hundreds_digit_table =
[]() {
Expand Down Expand Up @@ -121,68 +80,12 @@ champagne_lemire_really_inline std::array<char, 2> 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<char, 3> get_three_digits(uint32_t value) {
constexpr static std::array<std::array<char, 3>, 309> digit_table =
[]() {
std::array<std::array<char, 3>, 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);
Expand Down
1 change: 0 additions & 1 deletion src/ifma_avx512.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down