-
-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
For JsonEncoder implement SWAR (SIMD within a register) for detecting escaping 4 characters at a time:
// Checks if characters need escaping in a packed input (4 bytes in uint32_t).
constexpr bool NeedsEscape(uint32_t input) {
constexpr uint32_t mask_0x20 = 0x20202020u;
constexpr uint32_t mask_0x22 = 0x22222222u;
constexpr uint32_t mask_0x5c = 0x5C5C5C5Cu;
constexpr uint32_t mask_0x01 = 0x01010101u;
constexpr uint32_t mask_msb = 0x80808080u;
// Escape control characters (< 0x20).
const uint32_t has_lt_0x20 = input - mask_0x20;
// Escape double quotation mark (0x22).
const uint32_t has_0x22 = (input ^ mask_0x22) - mask_0x01;
// Escape backslash (0x5C).
const uint32_t has_0x5c = (input ^ mask_0x5c) - mask_0x01;
// Chars >= 0x7F don't need escaping.
const uint32_t result_mask = ~input & mask_msb;
const uint32_t result = ((has_lt_0x20 | has_0x22 | has_0x5c) & result_mask);
return result != 0;
}Metadata
Metadata
Assignees
Labels
No labels