Skip to main content

reduce_max_i64x4

Function reduce_max_i64x4 

Source
unsafe fn reduce_max_i64x4(values: __m256i) -> i64
Examples found in repository?
crates/competitive/src/data_structure/simd.rs (line 539)
536pub unsafe fn maximum_i64x8_avx2(values: &[i64; 8]) -> i64 {
537    let low = _mm256_loadu_si256(values.as_ptr().cast());
538    let high = _mm256_loadu_si256(values.as_ptr().add(4).cast());
539    reduce_max_i64x4(max_i64x4(low, high))
540}
541
542#[cfg(target_arch = "x86_64")]
543#[target_feature(enable = "avx2")]
544#[inline]
545pub unsafe fn sum_i64x8_avx2(values: &[i64; 8]) -> i64 {
546    let low = _mm256_loadu_si256(values.as_ptr().cast());
547    let high = _mm256_loadu_si256(values.as_ptr().add(4).cast());
548    reduce_sum_i64x4(_mm256_add_epi64(low, high))
549}
550
551#[cfg(target_arch = "x86_64")]
552#[target_feature(enable = "avx2")]
553#[inline]
554unsafe fn range_mask_i64x4(start: usize, end: usize, offset: i64) -> __m256i {
555    let lanes = _mm256_setr_epi64x(offset, offset + 1, offset + 2, offset + 3);
556    _mm256_and_si256(
557        _mm256_cmpgt_epi64(lanes, _mm256_set1_epi64x(start as i64 - 1)),
558        _mm256_cmpgt_epi64(_mm256_set1_epi64x(end as i64), lanes),
559    )
560}
561
562#[cfg(target_arch = "x86_64")]
563#[target_feature(enable = "avx2")]
564#[inline]
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}