diff --git a/include/fast_float/ascii_number.h b/include/fast_float/ascii_number.h index 6c79509..371f3da 100644 --- a/include/fast_float/ascii_number.h +++ b/include/fast_float/ascii_number.h @@ -294,6 +294,17 @@ loop_parse_if_eight_digits(char const *&p, char const *const pend, p)); // in rare cases, this will overflow, but that's ok p += 8; } + // 4-digit SWAR follow-up (ported from ffc EXP-001): consume a remaining 4-7 + // digit run in one step rather than byte-by-byte. GCC path only — on Clang + // the follow-up's presence bloated the 2x-unroll codegen and regressed random. + 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); // in rare cases overflows, that's ok + p += 4; + } + } #endif }