1 #include "simdjson/internal/jsoncharutils_tables.h"
2 #include "simdjson/internal/numberparsing_tables.h"
5 namespace SIMDJSON_IMPLEMENTATION {
7 namespace jsoncharutils {
11 simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
12 return internal::structural_or_whitespace_negated[c];
15 simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
16 return internal::structural_or_whitespace[c];
25 static inline uint32_t hex_to_u32_nocheck(
27 uint32_t v1 = internal::digit_to_val32[630 + src[0]];
28 uint32_t v2 = internal::digit_to_val32[420 + src[1]];
29 uint32_t v3 = internal::digit_to_val32[210 + src[2]];
30 uint32_t v4 = internal::digit_to_val32[0 + src[3]];
31 return v1 | v2 | v3 | v4;
46 simdjson_inline
size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
52 c[0] = uint8_t((cp >> 6) + 192);
53 c[1] = uint8_t((cp & 63) + 128);
58 }
else if (cp <= 0xFFFF) {
59 c[0] = uint8_t((cp >> 12) + 224);
60 c[1] = uint8_t(((cp >> 6) & 63) + 128);
61 c[2] = uint8_t((cp & 63) + 128);
63 }
else if (cp <= 0x10FFFF) {
65 c[0] = uint8_t((cp >> 18) + 240);
66 c[1] = uint8_t(((cp >> 12) & 63) + 128);
67 c[2] = uint8_t(((cp >> 6) & 63) + 128);
68 c[3] = uint8_t((cp & 63) + 128);
75 #if SIMDJSON_IS_32BITS
78 static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
79 return x * (uint64_t)y;
81 static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
82 uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
83 uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
84 uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
85 uint64_t adbc_carry = !!(adbc < ad);
86 uint64_t lo = bd + (adbc << 32);
87 *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
88 (adbc_carry << 32) + !!(lo < bd);
93 using internal::value128;
95 simdjson_inline value128 full_multiplication(uint64_t value1, uint64_t value2) {
97 #if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
100 answer.high = __umulh(value1, value2);
101 answer.low = value1 * value2;
103 answer.low = _umul128(value1, value2, &answer.high);
106 __uint128_t r = (
static_cast<__uint128_t
>(value1)) * value2;
107 answer.low = uint64_t(r);
108 answer.high = uint64_t(r >> 64);
We want to support argument-dependent lookup (ADL).