#[cfg(target_feature = "avx2")]
#[allow(dead_code)]
#[inline(always)]
pub(crate) fn simd_prune_block_f64(rd_values: &[f64; 8], max_dist: f64, sibling_mask: u8) -> u8 {
unsafe {
use std::arch::x86_64::*;
let max_dist_vec = _mm256_set1_pd(max_dist);
let rd_low = _mm256_loadu_pd(rd_values.as_ptr());
let rd_high = _mm256_loadu_pd(rd_values.as_ptr().add(4));
let cmp_low = _mm256_cmp_pd(rd_low, max_dist_vec, _CMP_LE_OQ);
let cmp_high = _mm256_cmp_pd(rd_high, max_dist_vec, _CMP_LE_OQ);
let mask_low = _mm256_movemask_pd(cmp_low) as u8;
let mask_high = _mm256_movemask_pd(cmp_high) as u8;
let mask = mask_low | (mask_high << 4);
mask & sibling_mask
}
}
#[cfg(target_feature = "avx2")]
#[allow(dead_code)]
#[inline(always)]
pub(crate) fn simd_prune_block_f32(rd_values: &[f32; 8], max_dist: f32, sibling_mask: u8) -> u8 {
unsafe {
use std::arch::x86_64::*;
let max_dist_vec = _mm256_set1_ps(max_dist);
let rd_vec = _mm256_loadu_ps(rd_values.as_ptr());
let cmp = _mm256_cmp_ps(rd_vec, max_dist_vec, _CMP_LE_OQ);
let mask = _mm256_movemask_ps(cmp) as u8;
mask & sibling_mask
}
}