unsafe fn range_mask_i32x8(start: usize, end: usize, offset: i32) -> __m256iExamples found in repository?
crates/competitive/src/data_structure/simd.rs (line 395)
390pub unsafe fn minimum_range_i32x16_avx2(values: &[i32; 16], start: usize, end: usize) -> i32 {
391 let unit = _mm256_set1_epi32(i32::MAX);
392 let low = _mm256_blendv_epi8(
393 unit,
394 _mm256_loadu_si256(values.as_ptr().cast()),
395 range_mask_i32x8(start, end, 0),
396 );
397 let high = _mm256_blendv_epi8(
398 unit,
399 _mm256_loadu_si256(values.as_ptr().add(8).cast()),
400 range_mask_i32x8(start, end, 8),
401 );
402 reduce_min_i32x8(_mm256_min_epi32(low, high))
403}
404
405#[cfg(target_arch = "x86_64")]
406#[target_feature(enable = "avx2")]
407#[inline]
408pub unsafe fn maximum_range_i32x16_avx2(values: &[i32; 16], start: usize, end: usize) -> i32 {
409 let unit = _mm256_set1_epi32(i32::MIN);
410 let low = _mm256_blendv_epi8(
411 unit,
412 _mm256_loadu_si256(values.as_ptr().cast()),
413 range_mask_i32x8(start, end, 0),
414 );
415 let high = _mm256_blendv_epi8(
416 unit,
417 _mm256_loadu_si256(values.as_ptr().add(8).cast()),
418 range_mask_i32x8(start, end, 8),
419 );
420 reduce_max_i32x8(_mm256_max_epi32(low, high))
421}
422
423#[cfg(target_arch = "x86_64")]
424#[target_feature(enable = "avx2")]
425#[inline]
426pub unsafe fn sum_range_i32x16_avx2(values: &[i32; 16], start: usize, end: usize) -> i32 {
427 let low = _mm256_and_si256(
428 _mm256_loadu_si256(values.as_ptr().cast()),
429 range_mask_i32x8(start, end, 0),
430 );
431 let high = _mm256_and_si256(
432 _mm256_loadu_si256(values.as_ptr().add(8).cast()),
433 range_mask_i32x8(start, end, 8),
434 );
435 reduce_sum_i32x8(_mm256_add_epi32(low, high))
436}