Skip to main content

min_i64x4

Function min_i64x4 

Source
unsafe fn min_i64x4(left: __m256i, right: __m256i) -> __m256i
Examples found in repository?
crates/competitive/src/data_structure/simd.rs (line 501)
500unsafe fn reduce_min_i64x4(mut values: __m256i) -> i64 {
501    values = min_i64x4(values, _mm256_permute4x64_epi64::<0x4e>(values));
502    values = min_i64x4(values, _mm256_permute4x64_epi64::<0xb1>(values));
503    _mm256_extract_epi64::<0>(values)
504}
505
506#[cfg(target_arch = "x86_64")]
507#[target_feature(enable = "avx2")]
508#[inline]
509unsafe fn reduce_max_i64x4(mut values: __m256i) -> i64 {
510    values = max_i64x4(values, _mm256_permute4x64_epi64::<0x4e>(values));
511    values = max_i64x4(values, _mm256_permute4x64_epi64::<0xb1>(values));
512    _mm256_extract_epi64::<0>(values)
513}
514
515#[cfg(target_arch = "x86_64")]
516#[target_feature(enable = "avx2")]
517#[inline]
518unsafe fn reduce_sum_i64x4(mut values: __m256i) -> i64 {
519    values = _mm256_add_epi64(values, _mm256_permute4x64_epi64::<0x4e>(values));
520    values = _mm256_add_epi64(values, _mm256_permute4x64_epi64::<0xb1>(values));
521    _mm256_extract_epi64::<0>(values)
522}
523
524#[cfg(target_arch = "x86_64")]
525#[target_feature(enable = "avx2")]
526#[inline]
527pub unsafe fn minimum_i64x8_avx2(values: &[i64; 8]) -> i64 {
528    let low = _mm256_loadu_si256(values.as_ptr().cast());
529    let high = _mm256_loadu_si256(values.as_ptr().add(4).cast());
530    reduce_min_i64x4(min_i64x4(low, high))
531}
532
533#[cfg(target_arch = "x86_64")]
534#[target_feature(enable = "avx2")]
535#[inline]
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}