1 #ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
2 #define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
4 #ifndef SIMDJSON_CONDITIONAL_INCLUDE
5 #include "simdjson/icelake/base.h"
6 #include "simdjson/icelake/intrinsics.h"
7 #include "simdjson/internal/numberparsing_tables.h"
12 namespace numberparsing {
14 static simdjson_inline uint32_t parse_eight_digits_unrolled(
const uint8_t *chars) {
16 const __m128i ascii0 = _mm_set1_epi8(
'0');
17 const __m128i mul_1_10 =
18 _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
19 const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
20 const __m128i mul_1_10000 =
21 _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
22 const __m128i input = _mm_sub_epi8(
23 _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(chars)), ascii0);
24 const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
25 const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
26 const __m128i t3 = _mm_packus_epi32(t2, t2);
27 const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
28 return _mm_cvtsi128_si32(
33 simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
34 internal::value128 answer;
35 #if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
38 answer.high = __umulh(value1, value2);
39 answer.low = value1 * value2;
41 answer.low = _umul128(value1, value2, &answer.high);
44 __uint128_t r = (
static_cast<__uint128_t
>(value1)) * value2;
45 answer.low = uint64_t(r);
46 answer.high = uint64_t(r >> 64);
55 #define SIMDJSON_SWAR_NUMBER_PARSING 1
The top level simdjson namespace, containing everything the library provides.