#[allow(clippy::redundant_pub_crate, clippy::cast_possible_truncation)]
pub(crate) static TABLE: [bool; 256] = {
let mut t = [false; 256];
let mut i = 0u16;
while i < 256 {
t[i as usize] = matches!(
i as u8,
b'!' | b'#' | b'$' | b'%' | b'&' | b'\'' | b'*' | b'+'
| b'-' | b'.' | b'^' | b'_' | b'`' | b'|' | b'~'
| b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z'
);
i += 1;
}
t
};
#[cfg(any(
target_arch = "x86_64",
target_arch = "aarch64",
all(target_arch = "wasm32", target_feature = "simd128")
))]
#[allow(clippy::redundant_pub_crate)]
pub(crate) const LO_NIBBLES: [u8; 16] = [
0xE8, 0xFC, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF4, 0x54, 0xD0, 0x54, 0xF4, 0x70,
];
#[cfg(any(
target_arch = "x86_64",
target_arch = "aarch64",
all(target_arch = "wasm32", target_feature = "simd128")
))]
#[allow(clippy::redundant_pub_crate)]
pub(crate) const HI_NIBBLES: [u8; 16] = [
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
];
#[allow(clippy::redundant_pub_crate)]
pub(crate) trait TcharCheck {
unsafe fn mask16(ptr: *const u8) -> u32;
#[inline]
unsafe fn all16(ptr: *const u8) -> bool {
unsafe { Self::mask16(ptr) == 0xFFFF }
}
#[inline]
fn is_valid_token(buf: &[u8]) -> bool {
let len = buf.len();
if len == 0 {
return false;
}
let ptr = buf.as_ptr();
let mut i = 0;
while i + 16 <= len {
if unsafe { !Self::all16(ptr.add(i)) } {
return false;
}
i += 16;
}
while i < len {
if !TABLE[buf[i] as usize] {
return false;
}
i += 1;
}
true
}
}
#[cfg(target_arch = "x86_64")]
#[allow(clippy::redundant_pub_crate)]
pub(crate) struct Ssse3;
#[cfg(target_arch = "x86_64")]
impl TcharCheck for Ssse3 {
#[inline]
unsafe fn mask16(ptr: *const u8) -> u32 {
unsafe { ssse3_mask16(ptr) }
}
}
#[cfg(target_arch = "x86_64")]
#[target_feature(enable = "ssse3")]
#[inline]
#[allow(clippy::cast_sign_loss)]
unsafe fn ssse3_mask16(ptr: *const u8) -> u32 {
use std::arch::x86_64::{
_mm_and_si128, _mm_cmpeq_epi8, _mm_loadu_si128, _mm_movemask_epi8, _mm_set1_epi8,
_mm_setzero_si128, _mm_shuffle_epi8, _mm_srli_epi16,
};
unsafe {
let chunk = _mm_loadu_si128(ptr.cast());
let lo_tbl = _mm_loadu_si128(LO_NIBBLES.as_ptr().cast());
let hi_tbl = _mm_loadu_si128(HI_NIBBLES.as_ptr().cast());
let nibble_mask = _mm_set1_epi8(0x0F);
let lo_nib = _mm_and_si128(chunk, nibble_mask);
let hi_nib = _mm_and_si128(_mm_srli_epi16(chunk, 4), nibble_mask);
let lo_shuf = _mm_shuffle_epi8(lo_tbl, lo_nib);
let hi_shuf = _mm_shuffle_epi8(hi_tbl, hi_nib);
let valid = _mm_and_si128(lo_shuf, hi_shuf);
let invalid = _mm_cmpeq_epi8(valid, _mm_setzero_si128());
(!_mm_movemask_epi8(invalid)) as u32 & 0xFFFF
}
}
#[cfg(target_arch = "x86_64")]
#[allow(clippy::redundant_pub_crate)]
pub(crate) struct Avx2;
#[cfg(target_arch = "x86_64")]
impl Avx2 {
#[inline]
pub(crate) unsafe fn mask32(ptr: *const u8) -> u32 {
unsafe { avx2_mask32(ptr) }
}
}
#[cfg(target_arch = "x86_64")]
#[target_feature(enable = "avx2")]
#[inline]
#[allow(clippy::cast_sign_loss)]
unsafe fn avx2_mask32(ptr: *const u8) -> u32 {
use std::arch::x86_64::{
_mm_loadu_si128, _mm256_and_si256, _mm256_broadcastsi128_si256, _mm256_cmpeq_epi8,
_mm256_loadu_si256, _mm256_movemask_epi8, _mm256_set1_epi8, _mm256_setzero_si256,
_mm256_shuffle_epi8, _mm256_srli_epi16,
};
unsafe {
let chunk = _mm256_loadu_si256(ptr.cast());
let lo_tbl = _mm256_broadcastsi128_si256(_mm_loadu_si128(LO_NIBBLES.as_ptr().cast()));
let hi_tbl = _mm256_broadcastsi128_si256(_mm_loadu_si128(HI_NIBBLES.as_ptr().cast()));
let nibble_mask = _mm256_set1_epi8(0x0F);
let lo_nib = _mm256_and_si256(chunk, nibble_mask);
let hi_nib = _mm256_and_si256(_mm256_srli_epi16(chunk, 4), nibble_mask);
let lo_shuf = _mm256_shuffle_epi8(lo_tbl, lo_nib);
let hi_shuf = _mm256_shuffle_epi8(hi_tbl, hi_nib);
let valid = _mm256_and_si256(lo_shuf, hi_shuf);
let invalid = _mm256_cmpeq_epi8(valid, _mm256_setzero_si256());
!(_mm256_movemask_epi8(invalid) as u32)
}
}
#[cfg(target_arch = "x86_64")]
#[allow(clippy::redundant_pub_crate)]
pub(crate) struct Sse2Only;
#[cfg(target_arch = "x86_64")]
impl TcharCheck for Sse2Only {
#[inline]
unsafe fn mask16(ptr: *const u8) -> u32 {
let mut m = 0u32;
for i in 0..16 {
if TABLE[unsafe { *ptr.add(i) } as usize] {
m |= 1 << i;
}
}
m
}
}
#[cfg(target_arch = "x86_64")]
#[inline]
#[allow(clippy::redundant_pub_crate)]
pub(crate) fn has_ssse3() -> bool {
cfg!(target_feature = "ssse3") || std::is_x86_feature_detected!("ssse3")
}
#[cfg(target_arch = "x86_64")]
#[inline]
#[allow(clippy::redundant_pub_crate)]
pub(crate) fn has_avx2() -> bool {
cfg!(target_feature = "avx2") || std::is_x86_feature_detected!("avx2")
}
#[cfg(target_arch = "aarch64")]
pub(crate) struct Neon;
#[cfg(target_arch = "aarch64")]
impl TcharCheck for Neon {
#[inline]
unsafe fn mask16(ptr: *const u8) -> u32 {
let mut m = 0u32;
for i in 0..16 {
if TABLE[unsafe { *ptr.add(i) } as usize] {
m |= 1 << i;
}
}
m
}
#[inline]
unsafe fn all16(ptr: *const u8) -> bool {
use std::arch::aarch64::{
vandq_u8, vdupq_n_u8, vld1q_u8, vminvq_u8, vqtbl1q_u8, vshrq_n_u8,
};
unsafe {
let chunk = vld1q_u8(ptr);
let lo_tbl = vld1q_u8(LO_NIBBLES.as_ptr());
let hi_tbl = vld1q_u8(HI_NIBBLES.as_ptr());
let nibble_mask = vdupq_n_u8(0x0F);
let lo_nib = vandq_u8(chunk, nibble_mask);
let hi_nib = vandq_u8(vshrq_n_u8(chunk, 4), nibble_mask);
let lo_shuf = vqtbl1q_u8(lo_tbl, lo_nib);
let hi_shuf = vqtbl1q_u8(hi_tbl, hi_nib);
let valid = vandq_u8(lo_shuf, hi_shuf);
vminvq_u8(valid) != 0
}
}
}
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
pub(crate) struct WasmSimd;
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
impl TcharCheck for WasmSimd {
#[inline]
unsafe fn mask16(ptr: *const u8) -> u32 {
use std::arch::wasm32::{
u8x16_bitmask, u8x16_eq, u8x16_splat, u8x16_swizzle, v128_and, v128_load,
};
unsafe {
let chunk = v128_load(ptr.cast());
let lo_tbl = v128_load(LO_NIBBLES.as_ptr().cast());
let hi_tbl = v128_load(HI_NIBBLES.as_ptr().cast());
let nibble_mask = u8x16_splat(0x0F);
let lo_nib = v128_and(chunk, nibble_mask);
let hi_nib = v128_and(std::arch::wasm32::u16x8_shr(chunk, 4), nibble_mask);
let lo_shuf = u8x16_swizzle(lo_tbl, lo_nib);
let hi_shuf = u8x16_swizzle(hi_tbl, hi_nib);
let valid = v128_and(lo_shuf, hi_shuf);
let invalid = u8x16_eq(valid, u8x16_splat(0));
(!u8x16_bitmask(invalid)) as u32 & 0xFFFF
}
}
}
#[cfg(not(any(
target_arch = "x86_64",
target_arch = "aarch64",
all(target_arch = "wasm32", target_feature = "simd128")
)))]
pub(crate) struct Scalar;
#[cfg(not(any(
target_arch = "x86_64",
target_arch = "aarch64",
all(target_arch = "wasm32", target_feature = "simd128")
)))]
impl TcharCheck for Scalar {
#[inline]
unsafe fn mask16(ptr: *const u8) -> u32 {
let mut m = 0u32;
for i in 0..16 {
if TABLE[unsafe { *ptr.add(i) } as usize] {
m |= 1 << i;
}
}
m
}
}
#[cfg(target_arch = "aarch64")]
pub(crate) type Arch = Neon;
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
pub(crate) type Arch = WasmSimd;
#[cfg(not(any(
target_arch = "x86_64",
target_arch = "aarch64",
all(target_arch = "wasm32", target_feature = "simd128")
)))]
pub(crate) type Arch = Scalar;