Skip to main content

reduce_max_i32x8

Function reduce_max_i32x8 

Source
unsafe fn reduce_max_i32x8(values: __m256i) -> i32
Examples found in repository?
crates/competitive/src/data_structure/simd.rs (line 355)
352pub unsafe fn maximum_i32x16_avx2(values: &[i32; 16]) -> i32 {
353    let low = _mm256_loadu_si256(values.as_ptr().cast());
354    let high = _mm256_loadu_si256(values.as_ptr().add(8).cast());
355    reduce_max_i32x8(_mm256_max_epi32(low, high))
356}
357
358#[cfg(target_arch = "x86_64")]
359#[target_feature(enable = "avx2")]
360#[inline]
361pub unsafe fn sum_i32x16_avx2(values: &[i32; 16]) -> i32 {
362    let low = _mm256_loadu_si256(values.as_ptr().cast());
363    let high = _mm256_loadu_si256(values.as_ptr().add(8).cast());
364    reduce_sum_i32x8(_mm256_add_epi32(low, high))
365}
366
367#[cfg(target_arch = "x86_64")]
368#[target_feature(enable = "avx2")]
369#[inline]
370unsafe fn range_mask_i32x8(start: usize, end: usize, offset: i32) -> __m256i {
371    let lanes = _mm256_setr_epi32(
372        offset,
373        offset + 1,
374        offset + 2,
375        offset + 3,
376        offset + 4,
377        offset + 5,
378        offset + 6,
379        offset + 7,
380    );
381    _mm256_and_si256(
382        _mm256_cmpgt_epi32(lanes, _mm256_set1_epi32(start as i32 - 1)),
383        _mm256_cmpgt_epi32(_mm256_set1_epi32(end as i32), lanes),
384    )
385}
386
387#[cfg(target_arch = "x86_64")]
388#[target_feature(enable = "avx2")]
389#[inline]
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}