@@ -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> {
227237pub 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