Finding quote pairs with PCLMULQDQ
really_inline uint64_t find_quote_mask_and_bits( | |
__m256i input_lo, __m256i input_hi, uint64_t odd_ends, | |
uint64_t &prev_iter_inside_quote, uint64_t "e_bits) { | |
quote_bits = | |
cmp_mask_against_input(input_lo, input_hi, _mm256_set1_epi8('"')); | |
quote_bits = quote_bits & ~odd_ends; | |
uint64_t quote_mask = _mm_cvtsi128_si64(_mm_clmulepi64_si128( | |
_mm_set_epi64x(0ULL, quote_bits), _mm_set1_epi8(0xFF), 0)); | |
quote_mask ^= prev_iter_inside_quote; | |
// right shift of a signed value expected to be well-defined and standard | |
// compliant as of C++20, | |
// John Regher from Utah U. says this is fine code | |
prev_iter_inside_quote = | |
static_cast<uint64_t>(static_cast<int64_t>(quote_mask) >> 63); | |
return quote_mask; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment