@@ -235,6 +235,7 @@ pub fn sliding_min_mapper_simd<const LEFT: bool>(
235
235
let pos_mask = S :: splat ( 0x0000_ffff ) ;
236
236
let max_pos = S :: splat ( ( 1 << 16 ) - 1 ) ;
237
237
let mut pos = S :: splat ( 0 ) ;
238
+ let one = S :: splat ( 1 ) ;
238
239
// Sliding min is over w+k-1 characters, so chunks overlap w+k-2.
239
240
// Thus, the true length of each lane is len-(k+w-2).
240
241
//
@@ -251,7 +252,7 @@ pub fn sliding_min_mapper_simd<const LEFT: bool>(
251
252
}
252
253
// slightly faster than assigning S::splat(u32::MAX)
253
254
let elem = ( if LEFT { val } else { !val } & val_mask) | pos;
254
- pos += S :: splat ( 1 ) ;
255
+ pos += one ;
255
256
ring_buf. push ( elem) ;
256
257
prefix_min = simd_min :: < LEFT > ( prefix_min, elem) ;
257
258
// After a chunk has been filled, compute suffix minima.
@@ -317,19 +318,27 @@ pub fn sliding_lr_min_mapper_simd(
317
318
let max_pos = S :: splat ( ( 1 << 16 ) - 1 ) ;
318
319
let mut pos = S :: splat ( 0 ) ;
319
320
let mut pos_offset: S = from_fn ( |l| ( l * len. saturating_sub ( w - 1 ) ) as u32 ) . into ( ) ;
321
+ let one = S :: splat ( 1 ) ;
322
+ let delta = S :: splat ( ( 1 << 16 ) - 2 - w as u32 ) ;
320
323
321
324
#[ inline( always) ]
322
325
move |val| {
323
326
// Make sure the position does not interfere with the hash value.
324
327
if pos == max_pos {
325
328
// Slow case extracted to a function to have better inlining here.
326
- reset_positions_offsets_lr ( w, & mut pos, & mut prefix_lr_min, & mut pos_offset, ring_buf) ;
329
+ reset_positions_offsets_lr (
330
+ delta,
331
+ & mut pos,
332
+ & mut prefix_lr_min,
333
+ & mut pos_offset,
334
+ ring_buf,
335
+ ) ;
327
336
}
328
337
// slightly faster than assigning S::splat(u32::MAX)
329
338
let lelem = ( val & val_mask) | pos;
330
339
let relem = ( !val & val_mask) | pos;
331
340
let elem = ( lelem, relem) ;
332
- pos += S :: splat ( 1 ) ;
341
+ pos += one ;
333
342
ring_buf. push ( elem) ;
334
343
prefix_lr_min = simd_lr_min ( prefix_lr_min, elem) ;
335
344
// After a chunk has been filled, compute suffix minima.
@@ -372,13 +381,12 @@ fn suffix_lr_minima(
372
381
373
382
#[ inline( always) ]
374
383
fn reset_positions_offsets_lr (
375
- w : usize ,
384
+ delta : S ,
376
385
pos : & mut S ,
377
386
prefix_min : & mut ( S , S ) ,
378
387
pos_offset : & mut S ,
379
388
ring_buf : & mut RingBuf < ( S , S ) > ,
380
389
) {
381
- let delta = S :: splat ( ( 1 << 16 ) - 2 - w as u32 ) ;
382
390
* pos -= delta;
383
391
* pos_offset += delta;
384
392
prefix_min. 0 -= delta;
0 commit comments