Skip to content

Commit

Permalink
Fix ABI overhead issue
Browse files Browse the repository at this point in the history
  • Loading branch information
jk-jeon committed Feb 22, 2022
1 parent d4f164b commit 478edcc
Showing 1 changed file with 43 additions and 38 deletions.
81 changes: 43 additions & 38 deletions include/dragonbox/dragonbox_to_chars.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,47 @@ namespace jkj::dragonbox {
template <class Float, class FloatTraits>
extern char* to_chars(typename FloatTraits::carrier_uint significand, int exponent,
char* buffer) noexcept;

// Avoid needless ABI overhead incurred by tag dispatch.
template <class PolicyHolder, class Float, class FloatTraits>
char* to_chars_n_impl(float_bits<Float, FloatTraits> br, char* buffer) noexcept {
auto const exponent_bits = br.extract_exponent_bits();
auto const s = br.remove_exponent_bits(exponent_bits);

if (br.is_finite(exponent_bits)) {
if (s.is_negative()) {
*buffer = '-';
++buffer;
}
if (br.is_nonzero()) {
auto result = to_decimal<Float, FloatTraits>(
s, exponent_bits, policy::sign::ignore, policy::trailing_zero::remove,
typename PolicyHolder::decimal_to_binary_rounding_policy{},
typename PolicyHolder::binary_to_decimal_rounding_policy{},
typename PolicyHolder::cache_policy{});
return to_chars_detail::to_chars<Float, FloatTraits>(result.significand,
result.exponent, buffer);
}
else {
std::memcpy(buffer, "0E0", 3);
return buffer + 3;
}
}
else {
if (s.has_all_zero_significand_bits()) {
if (s.is_negative()) {
*buffer = '-';
++buffer;
}
std::memcpy(buffer, "Infinity", 8);
return buffer + 8;
}
else {
std::memcpy(buffer, "NaN", 3);
return buffer + 3;
}
}
}
}

// Returns the next-to-end position
Expand All @@ -39,44 +80,8 @@ namespace jkj::dragonbox {
base_default_pair<cache::base, cache::full>>{},
policies...));

auto const br = float_bits<Float, FloatTraits>(x);
auto const exponent_bits = br.extract_exponent_bits();
auto const s = br.remove_exponent_bits(exponent_bits);

if (br.is_finite(exponent_bits)) {
if (s.is_negative()) {
*buffer = '-';
++buffer;
}
if (br.is_nonzero()) {
auto result = to_decimal<Float, FloatTraits>(
s, exponent_bits, policy::sign::ignore,
policy::trailing_zero::remove,
typename policy_holder::decimal_to_binary_rounding_policy{},
typename policy_holder::binary_to_decimal_rounding_policy{},
typename policy_holder::cache_policy{});
return to_chars_detail::to_chars<Float, FloatTraits>(result.significand,
result.exponent, buffer);
}
else {
std::memcpy(buffer, "0E0", 3);
return buffer + 3;
}
}
else {
if (s.has_all_zero_significand_bits()) {
if (s.is_negative()) {
*buffer = '-';
++buffer;
}
std::memcpy(buffer, "Infinity", 8);
return buffer + 8;
}
else {
std::memcpy(buffer, "NaN", 3);
return buffer + 3;
}
}
return to_chars_detail::to_chars_n_impl<policy_holder>(float_bits<Float, FloatTraits>(x),
buffer);
}

// Null-terminate and bypass the return value of fp_to_chars_n
Expand Down

0 comments on commit 478edcc

Please sign in to comment.