mirror of
https://github.com/fastfloat/fast_float.git
synced 2026-06-15 08:26:08 +08:00
Merge pull request #382 from redis-performance/pr/four-digit-followup
Add a 4-digit SWAR follow-up to loop_parse_if_eight_digits (clang)
This commit is contained in:
commit
ed861322d8
@ -266,6 +266,21 @@ loop_parse_if_eight_digits(char const *&p, char const *const pend,
|
|||||||
p)); // in rare cases, this will overflow, but that's ok
|
p)); // in rare cases, this will overflow, but that's ok
|
||||||
p += 8;
|
p += 8;
|
||||||
}
|
}
|
||||||
|
// Consume a remaining 4-7 digit run in a single SWAR step instead of
|
||||||
|
// byte-by-byte (reuses the existing 4-digit helpers). The parsed result is
|
||||||
|
// identical either way. Gated to clang: on gcc the extra 4-digit check
|
||||||
|
// regresses inputs whose remainder is shorter than 4 digits (it becomes pure
|
||||||
|
// overhead there); clang does not show that.
|
||||||
|
#if defined(__clang__)
|
||||||
|
if ((pend - p) >= 4) {
|
||||||
|
uint32_t const val4 = read4_to_u32(p);
|
||||||
|
if (is_made_of_four_digits_fast(val4)) {
|
||||||
|
i = i * 10000 +
|
||||||
|
parse_four_digits_unrolled(val4); // may overflow, that's ok
|
||||||
|
p += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class parse_error {
|
enum class parse_error {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user