Skip to main content

range_mask_i32x8

Function range_mask_i32x8 

Source
unsafe fn range_mask_i32x8(start: usize, end: usize, offset: i32) -> __m256i
Examples found in repository?
crates/competitive/src/data_structure/simd.rs (line 395)
390pub unsafe fn minimum_range_i32x16_avx2(values: &[i32; 16], start: usize, end: usize) -> i32 {
391    let unit = _mm256_set1_epi32(i32::MAX);
392    let low = _mm256_blendv_epi8(
393        unit,
394        _mm256_loadu_si256(values.as_ptr().cast()),
395        range_mask_i32x8(start, end, 0),
396    );
397    let high = _mm256_blendv_epi8(
398        unit,
399        _mm256_loadu_si256(values.as_ptr().add(8).cast()),
400        range_mask_i32x8(start, end, 8),
401    );
402    reduce_min_i32x8(_mm256_min_epi32(low, high))
403}
404
405#[cfg(target_arch = "x86_64")]
406#[target_feature(enable = "avx2")]
407#[inline]
408pub unsafe fn maximum_range_i32x16_avx2(values: &[i32; 16], start: usize, end: usize) -> i32 {
409    let unit = _mm256_set1_epi32(i32::MIN);
410    let low = _mm256_blendv_epi8(
411        unit,
412        _mm256_loadu_si256(values.as_ptr().cast()),
413        range_mask_i32x8(start, end, 0),
414    );
415    let high = _mm256_blendv_epi8(
416        unit,
417        _mm256_loadu_si256(values.as_ptr().add(8).cast()),
418        range_mask_i32x8(start, end, 8),
419    );
420    reduce_max_i32x8(_mm256_max_epi32(low, high))
421}
422
423#[cfg(target_arch = "x86_64")]
424#[target_feature(enable = "avx2")]
425#[inline]
426pub unsafe fn sum_range_i32x16_avx2(values: &[i32; 16], start: usize, end: usize) -> i32 {
427    let low = _mm256_and_si256(
428        _mm256_loadu_si256(values.as_ptr().cast()),
429        range_mask_i32x8(start, end, 0),
430    );
431    let high = _mm256_and_si256(
432        _mm256_loadu_si256(values.as_ptr().add(8).cast()),
433        range_mask_i32x8(start, end, 8),
434    );
435    reduce_sum_i32x8(_mm256_add_epi32(low, high))
436}