diff --git a/include/fast_float/ascii_number.h b/include/fast_float/ascii_number.h index cac9160..aa2761a 100644 --- a/include/fast_float/ascii_number.h +++ b/include/fast_float/ascii_number.h @@ -42,6 +42,11 @@ fastfloat_really_inline constexpr uint64_t byteswap(uint64_t val) { (val & 0x000000000000FF00) << 40 | (val & 0x00000000000000FF) << 56; } +fastfloat_really_inline constexpr uint32_t byteswap_32(uint32_t val) { + return (val >> 24) | ((val >> 8) & 0x0000FF00u) | ((val << 8) & 0x00FF0000u) | + (val << 24); +} + // Read 8 UC into a u64. Truncates UC if not char. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t @@ -533,7 +538,7 @@ parse_int_string(UC const *p, UC const *pend, T &value, } digits = std::bit_cast(str); #if FASTFLOAT_IS_BIG_ENDIAN - digits = byteswap(digits); + digits = byteswap_32(digits); #endif } #else @@ -543,18 +548,14 @@ parse_int_string(UC const *p, UC const *pend, T &value, else if (len >= 4) { ::memcpy(&digits, p, 4); #if FASTFLOAT_IS_BIG_ENDIAN - digits = byteswap(digits); + digits = byteswap_32(digits); #endif } else { uint32_t b0 = static_cast(p[0]); uint32_t b1 = (len > 1) ? static_cast(p[1]) : 0xFFu; uint32_t b2 = (len > 2) ? static_cast(p[2]) : 0xFFu; uint32_t b3 = 0xFFu; -#if FASTFLOAT_IS_BIG_ENDIAN - digits = (b0 << 24) | (b1 << 16) | (b2 << 8) | b3; -#else digits = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24); -#endif } uint32_t magic =