|
17 | 17 |
|
18 | 18 | #pragma once |
19 | 19 |
|
20 | | -#include "../common/base.h" |
21 | | - |
22 | 20 | namespace sonic_json { |
23 | 21 | namespace internal { |
24 | 22 | namespace common { |
@@ -268,25 +266,19 @@ sonic_force_inline bool handle_unicode_codepoint(const uint8_t **src_ptr, |
268 | 266 | return offset > 0; |
269 | 267 | } |
270 | 268 |
|
271 | | -template <size_t BLOK_SIZE> |
272 | | -sonic_force_inline uint64_t GetEscapedBranchless(uint64_t &prev_escaped, |
273 | | - uint64_t backslash) { |
274 | | - static_assert(BLOK_SIZE == 32 || BLOK_SIZE == 64, |
275 | | - "escaped branchless block only support 32 or 64 bytes"); |
276 | | - backslash &= ~prev_escaped; |
277 | | - uint64_t follows_escape = backslash << 1 | prev_escaped; |
278 | | - const uint64_t even_bits = 0x5555555555555555ULL; |
279 | | - uint64_t odd_sequence_starts = backslash & ~even_bits & ~follows_escape; |
280 | | - uint64_t sequences_starting_on_even_bits; |
281 | | - if (BLOK_SIZE == 64) { |
282 | | - prev_escaped = AddOverflow64(odd_sequence_starts, backslash, |
283 | | - &sequences_starting_on_even_bits); |
284 | | - } else if (BLOK_SIZE == 32) { |
285 | | - prev_escaped = AddOverflow32(odd_sequence_starts, backslash, |
286 | | - &sequences_starting_on_even_bits); |
287 | | - } |
288 | | - uint64_t invert_mask = sequences_starting_on_even_bits << 1; |
289 | | - return (even_bits ^ invert_mask) & follows_escape; |
| 269 | +template <size_t BLOCK_SIZE> |
| 270 | +sonic_force_inline uint64_t GetEscaped(uint64_t &prev_escaped, |
| 271 | + uint64_t backslash) { |
| 272 | + uint64_t with_prev_backslash = backslash & ~prev_escaped; |
| 273 | + static const uint64_t odd_bits = 0xAAAAAAAAAAAAAAAAULL; |
| 274 | + // see: https://github.com/simdjson/simdjson/pull/2042 |
| 275 | + uint64_t escaped = |
| 276 | + (((with_prev_backslash << 1) | odd_bits) - with_prev_backslash) ^ |
| 277 | + odd_bits; |
| 278 | + // & backslash to clear escaped char |
| 279 | + uint64_t escaped_with_prev = (escaped ^ (backslash | prev_escaped)); |
| 280 | + prev_escaped = ((escaped & backslash) >> (BLOCK_SIZE - 1)) & 0x1ULL; |
| 281 | + return escaped_with_prev; |
290 | 282 | } |
291 | 283 |
|
292 | 284 | } // namespace common |
|
0 commit comments