From a00e4118cd0de302230c16170c2eb8511da2b3eb Mon Sep 17 00:00:00 2001 From: Joel Wurtz Date: Tue, 17 Sep 2024 17:16:58 +0200 Subject: [PATCH] feat(utf8): support utf8 in path for neon also --- src/simd/neon.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/simd/neon.rs b/src/simd/neon.rs index c6b86a8..62b41a7 100644 --- a/src/simd/neon.rs +++ b/src/simd/neon.rs @@ -121,6 +121,7 @@ unsafe fn match_header_name_char_16_neon(ptr: *const u8) -> usize { offsetz(result) as usize } +#[cfg(not(feature = "utf8_in_path"))] #[inline] unsafe fn match_url_char_16_neon(ptr: *const u8) -> usize { let input = vld1q_u8(ptr); @@ -140,6 +141,21 @@ unsafe fn match_url_char_16_neon(ptr: *const u8) -> usize { offsetz(result) as usize } +#[cfg(feature = "utf8_in_path")] +#[inline] +unsafe fn match_url_char_16_neon(ptr: *const u8) -> usize { + let input = vld1q_u8(ptr); + + // Check that b'!' <= and b != 127 + let result = vcleq_u8(vdupq_n_u8(b'!'), input); + + // Disallow del + let del = vceqq_u8(input, vdupq_n_u8(0x7F)); + let result = vbicq_u8(result, del); + + offsetz(result) as usize +} + #[inline] unsafe fn match_header_value_char_16_neon(ptr: *const u8) -> usize { let input = vld1q_u8(ptr);