#[target_feature(enable = "sse4.2")]
#[allow(unused_unsafe)]
pub unsafe fn scan_quote_or_backslash(input: &[u8]) -> usize {
use core::arch::x86_64::*;
let quote = unsafe { _mm_set1_epi8(b'"' as i8) };
let backslash = unsafe { _mm_set1_epi8(b'\\' as i8) };
let mut i = 0usize;
while i + 16 <= input.len() {
let chunk = unsafe { _mm_loadu_si128(input.as_ptr().add(i) as *const __m128i) };
let eq_q = unsafe { _mm_cmpeq_epi8(chunk, quote) };
let eq_bs = unsafe { _mm_cmpeq_epi8(chunk, backslash) };
let mask = unsafe { _mm_movemask_epi8(_mm_or_si128(eq_q, eq_bs)) as u32 };
if mask != 0 {
return i + mask.trailing_zeros() as usize;
}
i += 16;
}
i + super::scalar::scan_quote_or_backslash(&input[i..])
}
#[target_feature(enable = "sse4.2")]
#[allow(unused_unsafe)]
pub unsafe fn skip_whitespace(input: &[u8]) -> usize {
use core::arch::x86_64::*;
let sp = unsafe { _mm_set1_epi8(b' ' as i8) };
let tab = unsafe { _mm_set1_epi8(b'\t' as i8) };
let lf = unsafe { _mm_set1_epi8(b'\n' as i8) };
let cr = unsafe { _mm_set1_epi8(b'\r' as i8) };
let mut i = 0usize;
while i + 16 <= input.len() {
let chunk = unsafe { _mm_loadu_si128(input.as_ptr().add(i) as *const __m128i) };
let is_sp = unsafe { _mm_cmpeq_epi8(chunk, sp) };
let is_tab = unsafe { _mm_cmpeq_epi8(chunk, tab) };
let is_lf = unsafe { _mm_cmpeq_epi8(chunk, lf) };
let is_cr = unsafe { _mm_cmpeq_epi8(chunk, cr) };
let is_ws =
unsafe { _mm_or_si128(_mm_or_si128(is_sp, is_tab), _mm_or_si128(is_lf, is_cr)) };
let mask = unsafe { _mm_movemask_epi8(is_ws) as u32 };
if mask != 0xFFFF {
return i + (!mask).trailing_zeros() as usize;
}
i += 16;
}
i + super::scalar::skip_whitespace(&input[i..])
}
#[target_feature(enable = "sse4.2")]
#[allow(unused_unsafe)]
pub unsafe fn is_all_ascii(input: &[u8]) -> bool {
use core::arch::x86_64::*;
let mut i = 0usize;
let mut acc = unsafe { _mm_setzero_si128() };
while i + 16 <= input.len() {
let chunk = unsafe { _mm_loadu_si128(input.as_ptr().add(i) as *const __m128i) };
acc = unsafe { _mm_or_si128(acc, chunk) };
i += 16;
}
let mask = unsafe { _mm_movemask_epi8(acc) };
if mask != 0 {
return false;
}
input[i..].iter().all(|b| b.is_ascii())
}