unsafe fn reduce_sum_i32x8(values: __m256i) -> i32Examples found in repository?
crates/competitive/src/data_structure/simd.rs (line 364)
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}
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}