macro_rules! dispatch_simd {
(
$(x86_64: {
$(avx512: $avx512:expr,)?
$(avx2_fma: $avx2_fma:expr,)?
$(avx2: $avx2:expr,)?
$(sse4_1: $sse4_1:expr,)?
},)?
$(aarch64: {
neon: $neon:expr $(,)?
},)?
) => {
#[cfg(target_arch = "x86_64")]
{
$(
$(if $crate::processing::x86::has_avx512() {
// SAFETY: the check above confirms avx512f+vl+bw.
return unsafe { $avx512 };
})?
$(if $crate::processing::x86::has_avx2_fma() {
return unsafe { $avx2_fma };
})?
$(if is_x86_feature_detected!("avx2") {
return unsafe { $avx2 };
})?
$(if is_x86_feature_detected!("sse4.1") {
return unsafe { $sse4_1 };
})?
)?
}
#[cfg(target_arch = "aarch64")]
{
$(if std::arch::is_aarch64_feature_detected!("neon") {
return unsafe { $neon };
})?
}
};
}
pub(crate) use dispatch_simd;