unsafe fn range_mask_i64x4(start: usize, end: usize, offset: i64) -> __m256iExamples found in repository?
crates/competitive/src/data_structure/simd.rs (line 570)
565pub unsafe fn minimum_range_i64x8_avx2(values: &[i64; 8], start: usize, end: usize) -> i64 {
566 let unit = _mm256_set1_epi64x(i64::MAX);
567 let low = _mm256_blendv_epi8(
568 unit,
569 _mm256_loadu_si256(values.as_ptr().cast()),
570 range_mask_i64x4(start, end, 0),
571 );
572 let high = _mm256_blendv_epi8(
573 unit,
574 _mm256_loadu_si256(values.as_ptr().add(4).cast()),
575 range_mask_i64x4(start, end, 4),
576 );
577 reduce_min_i64x4(min_i64x4(low, high))
578}
579
580#[cfg(target_arch = "x86_64")]
581#[target_feature(enable = "avx2")]
582#[inline]
583pub unsafe fn maximum_range_i64x8_avx2(values: &[i64; 8], start: usize, end: usize) -> i64 {
584 let unit = _mm256_set1_epi64x(i64::MIN);
585 let low = _mm256_blendv_epi8(
586 unit,
587 _mm256_loadu_si256(values.as_ptr().cast()),
588 range_mask_i64x4(start, end, 0),
589 );
590 let high = _mm256_blendv_epi8(
591 unit,
592 _mm256_loadu_si256(values.as_ptr().add(4).cast()),
593 range_mask_i64x4(start, end, 4),
594 );
595 reduce_max_i64x4(max_i64x4(low, high))
596}
597
598#[cfg(target_arch = "x86_64")]
599#[target_feature(enable = "avx2")]
600#[inline]
601pub unsafe fn sum_range_i64x8_avx2(values: &[i64; 8], start: usize, end: usize) -> i64 {
602 let low = _mm256_and_si256(
603 _mm256_loadu_si256(values.as_ptr().cast()),
604 range_mask_i64x4(start, end, 0),
605 );
606 let high = _mm256_and_si256(
607 _mm256_loadu_si256(values.as_ptr().add(4).cast()),
608 range_mask_i64x4(start, end, 4),
609 );
610 reduce_sum_i64x4(_mm256_add_epi64(low, high))
611}