@@ -235,24 +235,24 @@ pub fn sliding_min_mapper_simd<const LEFT: bool>(
235235 let pos_mask = S :: splat ( 0x0000_ffff ) ;
236236 let max_pos = S :: splat ( ( 1 << 16 ) - 1 ) ;
237237 let mut pos = S :: splat ( 0 ) ;
238- let one = S :: splat ( 1 ) ;
239238 // Sliding min is over w+k-1 characters, so chunks overlap w+k-2.
240239 // Thus, the true length of each lane is len-(k+w-2).
241240 //
242241 // The k-mer starting at position 0 is done after processing the char at
243242 // position k-1, so we compensate for that as well.
244243 let mut pos_offset: S = from_fn ( |l| ( l * len. saturating_sub ( w - 1 ) ) as u32 ) . into ( ) ;
244+ let delta = S :: splat ( ( 1 << 16 ) - 2 - w as u32 ) ;
245245
246246 #[ inline( always) ]
247247 move |val| {
248248 // Make sure the position does not interfere with the hash value.
249249 if pos == max_pos {
250250 // Slow case extracted to a function to have better inlining here.
251- reset_positions_offsets ( w , & mut pos, & mut prefix_min, & mut pos_offset, ring_buf) ;
251+ reset_positions_offsets ( delta , & mut pos, & mut prefix_min, & mut pos_offset, ring_buf) ;
252252 }
253253 // slightly faster than assigning S::splat(u32::MAX)
254254 let elem = ( if LEFT { val } else { !val } & val_mask) | pos;
255- pos += one ;
255+ pos += S :: ONE ;
256256 ring_buf. push ( elem) ;
257257 prefix_min = simd_min :: < LEFT > ( prefix_min, elem) ;
258258 // After a chunk has been filled, compute suffix minima.
@@ -284,13 +284,12 @@ fn suffix_minima<const LEFT: bool>(
284284}
285285
286286fn reset_positions_offsets (
287- w : usize ,
287+ delta : S ,
288288 pos : & mut S ,
289289 prefix_min : & mut S ,
290290 pos_offset : & mut S ,
291291 ring_buf : & mut RingBuf < S > ,
292292) {
293- let delta = S :: splat ( ( 1 << 16 ) - 2 - w as u32 ) ;
294293 * pos -= delta;
295294 * prefix_min -= delta;
296295 * pos_offset += delta;
@@ -318,7 +317,6 @@ pub fn sliding_lr_min_mapper_simd(
318317 let max_pos = S :: splat ( ( 1 << 16 ) - 1 ) ;
319318 let mut pos = S :: splat ( 0 ) ;
320319 let mut pos_offset: S = from_fn ( |l| ( l * len. saturating_sub ( w - 1 ) ) as u32 ) . into ( ) ;
321- let one = S :: splat ( 1 ) ;
322320 let delta = S :: splat ( ( 1 << 16 ) - 2 - w as u32 ) ;
323321
324322 #[ inline( always) ]
@@ -338,7 +336,7 @@ pub fn sliding_lr_min_mapper_simd(
338336 let lelem = ( val & val_mask) | pos;
339337 let relem = ( !val & val_mask) | pos;
340338 let elem = ( lelem, relem) ;
341- pos += one ;
339+ pos += S :: ONE ;
342340 ring_buf. push ( elem) ;
343341 prefix_lr_min = simd_lr_min ( prefix_lr_min, elem) ;
344342 // After a chunk has been filled, compute suffix minima.
0 commit comments