Skip to content

Commit 782fc0b

Browse files
committed
Re-use sse2_hash for the 8 lanes case instead of using a new hash
1 parent 5b32695 commit 782fc0b

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

src/x86.rs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,16 @@ impl<V: Vector> VectorHash<V> {
195195
}
196196
}
197197

198+
impl From<&VectorHash<__m128i>> for VectorHash<__m64i> {
199+
#[inline]
200+
fn from(hash: &VectorHash<__m128i>) -> Self {
201+
Self {
202+
first: __m64i(hash.first),
203+
last: __m64i(hash.last),
204+
}
205+
}
206+
}
207+
198208
/// Single-substring searcher using an AVX2 algorithm based on the "Generic
199209
/// SIMD" algorithm [presented by Wojciech
200210
/// Muła](http://0x80.pl/articles/simd-strfind.html).
@@ -227,7 +237,6 @@ impl<V: Vector> VectorHash<V> {
227237
pub struct Avx2Searcher<N: Needle> {
228238
position: usize,
229239
scalar_hash: ScalarHash,
230-
u64_hash: VectorHash<__m64i>,
231240
sse2_hash: VectorHash<__m128i>,
232241
avx2_hash: VectorHash<__m256i>,
233242
needle: N,
@@ -268,14 +277,12 @@ impl<N: Needle> Avx2Searcher<N> {
268277
}
269278

270279
let scalar_hash = ScalarHash::from(bytes);
271-
let u64_hash = VectorHash::new(bytes[0], bytes[position]);
272280
let sse2_hash = VectorHash::new(bytes[0], bytes[position]);
273281
let avx2_hash = VectorHash::new(bytes[0], bytes[position]);
274282

275283
Self {
276284
position,
277285
scalar_hash,
278-
u64_hash,
279286
sse2_hash,
280287
avx2_hash,
281288
needle,
@@ -397,7 +404,8 @@ impl<N: Needle> Avx2Searcher<N> {
397404
#[inline]
398405
#[target_feature(enable = "avx2")]
399406
unsafe fn u64_search_in(&self, haystack: &[u8]) -> bool {
400-
self.vector_search_in(haystack, &self.u64_hash, Self::scalar_search_in)
407+
let hash = VectorHash::<__m64i>::from(&self.sse2_hash);
408+
self.vector_search_in(haystack, &hash, Self::scalar_search_in)
401409
}
402410

403411
#[inline]
@@ -753,20 +761,20 @@ mod tests {
753761
fn size_of_avx2_searcher() {
754762
use std::mem::size_of;
755763

756-
assert_eq!(size_of::<Avx2Searcher::<&[u8]>>(), 160);
757-
assert_eq!(size_of::<Avx2Searcher::<[u8; 0]>>(), 160);
758-
assert_eq!(size_of::<Avx2Searcher::<[u8; 16]>>(), 160);
759-
assert_eq!(size_of::<Avx2Searcher::<Box<[u8]>>>(), 160);
764+
assert_eq!(size_of::<Avx2Searcher::<&[u8]>>(), 128);
765+
assert_eq!(size_of::<Avx2Searcher::<[u8; 0]>>(), 128);
766+
assert_eq!(size_of::<Avx2Searcher::<[u8; 16]>>(), 128);
767+
assert_eq!(size_of::<Avx2Searcher::<Box<[u8]>>>(), 128);
760768
}
761769

762770
#[test]
763771
#[cfg(target_pointer_width = "64")]
764772
fn size_of_dynamic_avx2_searcher() {
765773
use std::mem::size_of;
766774

767-
assert_eq!(size_of::<DynamicAvx2Searcher::<&[u8]>>(), 192);
768-
assert_eq!(size_of::<DynamicAvx2Searcher::<[u8; 0]>>(), 192);
769-
assert_eq!(size_of::<DynamicAvx2Searcher::<[u8; 16]>>(), 192);
770-
assert_eq!(size_of::<DynamicAvx2Searcher::<Box<[u8]>>>(), 192);
775+
assert_eq!(size_of::<DynamicAvx2Searcher::<&[u8]>>(), 160);
776+
assert_eq!(size_of::<DynamicAvx2Searcher::<[u8; 0]>>(), 160);
777+
assert_eq!(size_of::<DynamicAvx2Searcher::<[u8; 16]>>(), 160);
778+
assert_eq!(size_of::<DynamicAvx2Searcher::<Box<[u8]>>>(), 160);
771779
}
772780
}

0 commit comments

Comments
 (0)