Skip to main content

range_mask_i64x4

Function range_mask_i64x4 

Source
unsafe fn range_mask_i64x4(start: usize, end: usize, offset: i64) -> __m256i
Examples 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}