unsafe fn min_i64x4(left: __m256i, right: __m256i) -> __m256iExamples 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}