Skip to main content

rsonpath/classification/quotes/shared/
vector_128.rs

1#[cfg(target_arch = "x86")]
2use ::core::arch::x86::*;
3#[cfg(target_arch = "x86_64")]
4use ::core::arch::x86_64::*;
5
6#[inline(always)]
7pub(crate) unsafe fn quote_mask() -> __m128i {
8    _mm_set1_epi8(b'"' as i8)
9}
10
11#[inline(always)]
12pub(crate) unsafe fn slash_mask() -> __m128i {
13    _mm_set1_epi8(b'\\' as i8)
14}
15
16#[target_feature(enable = "sse2")]
17pub(crate) unsafe fn classify_block(block: &[u8]) -> BlockClassification128 {
18    let byte_vector = _mm_loadu_si128(block.as_ptr().cast::<__m128i>());
19
20    let slash_cmp = _mm_cmpeq_epi8(byte_vector, slash_mask());
21    let slashes = _mm_movemask_epi8(slash_cmp) as u16;
22
23    let quote_cmp = _mm_cmpeq_epi8(byte_vector, quote_mask());
24    let quotes = _mm_movemask_epi8(quote_cmp) as u16;
25
26    BlockClassification128 { slashes, quotes }
27}
28
29pub(crate) struct BlockClassification128 {
30    pub(crate) slashes: u16,
31    pub(crate) quotes: u16,
32}