From 625c1d9c746d78a978133b4647bf84d813657295 Mon Sep 17 00:00:00 2001 From: Hans Kratz Date: Sun, 14 Jun 2026 11:37:48 +0200 Subject: [PATCH] DRY - move must_be_2_3_continuation back into algorithm It is identical for all implementations again after the recent optimization,. --- src/implementation/aarch64/neon.rs | 9 --------- src/implementation/algorithm.rs | 8 ++++++++ src/implementation/armv7/neon.rs | 10 ---------- src/implementation/portable/simd128.rs | 9 --------- src/implementation/portable/simd256.rs | 9 --------- src/implementation/wasm32/simd128.rs | 9 --------- src/implementation/x86/avx2.rs | 10 ---------- src/implementation/x86/avx512.rs | 10 ---------- src/implementation/x86/sse42.rs | 10 ---------- 9 files changed, 8 insertions(+), 76 deletions(-) diff --git a/src/implementation/aarch64/neon.rs b/src/implementation/aarch64/neon.rs index c629c042..8c258c29 100644 --- a/src/implementation/aarch64/neon.rs +++ b/src/implementation/aarch64/neon.rs @@ -203,15 +203,6 @@ impl From for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[inline] - unsafe fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[inline] #[cfg(feature = "aarch64_neon_prefetch")] unsafe fn simd_prefetch(ptr: *const u8) { diff --git a/src/implementation/algorithm.rs b/src/implementation/algorithm.rs index 749d09d4..2da91405 100644 --- a/src/implementation/algorithm.rs +++ b/src/implementation/algorithm.rs @@ -136,6 +136,14 @@ macro_rules! algorithm_simd { byte_1_high.and(byte_1_low).and(byte_2_high) } + $(#[$feat])* + #[inline] + unsafe fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { + let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); + let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); + is_third_byte.or(is_fourth_byte) + } + $(#[$feat])* #[inline] unsafe fn check_multibyte_lengths( diff --git a/src/implementation/armv7/neon.rs b/src/implementation/armv7/neon.rs index b542a2db..3e5cde94 100644 --- a/src/implementation/armv7/neon.rs +++ b/src/implementation/armv7/neon.rs @@ -237,16 +237,6 @@ impl From for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[inline] - #[target_feature(enable = "neon")] - unsafe fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[inline] unsafe fn simd_prefetch(_ptr: *const u8) {} diff --git a/src/implementation/portable/simd128.rs b/src/implementation/portable/simd128.rs index abff67ff..55939ceb 100644 --- a/src/implementation/portable/simd128.rs +++ b/src/implementation/portable/simd128.rs @@ -202,15 +202,6 @@ impl From for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[inline] - fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[inline] unsafe fn simd_prefetch(_ptr: *const u8) {} diff --git a/src/implementation/portable/simd256.rs b/src/implementation/portable/simd256.rs index 644b52bc..ac01403c 100644 --- a/src/implementation/portable/simd256.rs +++ b/src/implementation/portable/simd256.rs @@ -207,15 +207,6 @@ impl From for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[inline] - fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[inline] unsafe fn simd_prefetch(_ptr: *const u8) {} diff --git a/src/implementation/wasm32/simd128.rs b/src/implementation/wasm32/simd128.rs index 11791d2a..94230d3a 100644 --- a/src/implementation/wasm32/simd128.rs +++ b/src/implementation/wasm32/simd128.rs @@ -246,15 +246,6 @@ impl From for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[inline] - unsafe fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[inline] const fn simd_prefetch(_ptr: *const u8) { // no-op diff --git a/src/implementation/x86/avx2.rs b/src/implementation/x86/avx2.rs index 8c3877f5..872ef1a4 100644 --- a/src/implementation/x86/avx2.rs +++ b/src/implementation/x86/avx2.rs @@ -230,16 +230,6 @@ impl From<__m256i> for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[target_feature(enable = "avx2")] #[inline] unsafe fn simd_prefetch(ptr: *const u8) { diff --git a/src/implementation/x86/avx512.rs b/src/implementation/x86/avx512.rs index f3b69a9e..f46e1a51 100644 --- a/src/implementation/x86/avx512.rs +++ b/src/implementation/x86/avx512.rs @@ -253,16 +253,6 @@ impl From<__m512i> for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[target_feature(enable = "avx512f,avx512bw,avx512vbmi")] - #[inline] - unsafe fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[target_feature(enable = "avx512f,avx512bw,avx512vbmi")] #[inline] unsafe fn simd_prefetch(ptr: *const u8) { diff --git a/src/implementation/x86/sse42.rs b/src/implementation/x86/sse42.rs index 39fdb059..309f64fd 100644 --- a/src/implementation/x86/sse42.rs +++ b/src/implementation/x86/sse42.rs @@ -215,16 +215,6 @@ impl From<__m128i> for SimdU8Value { } } -impl Utf8CheckAlgorithm { - #[target_feature(enable = "sse4.2")] - #[inline] - unsafe fn must_be_2_3_continuation(prev2: SimdU8Value, prev3: SimdU8Value) -> SimdU8Value { - let is_third_byte = prev2.saturating_sub(SimdU8Value::splat(0xe0 - 0x80)); - let is_fourth_byte = prev3.saturating_sub(SimdU8Value::splat(0xf0 - 0x80)); - is_third_byte.or(is_fourth_byte) - } -} - #[target_feature(enable = "sse4.2")] #[inline] unsafe fn simd_prefetch(ptr: *const u8) {