use crate::compat::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CpuExtensions {
None,
#[cfg(target_arch = "x86_64")]
Sse4_1,
#[cfg(target_arch = "x86_64")]
Avx2,
#[cfg(target_arch = "aarch64")]
Neon,
#[cfg(target_arch = "wasm32")]
Simd128,
}
impl CpuExtensions {
pub fn is_supported(&self) -> bool {
match self {
#[cfg(target_arch = "x86_64")]
Self::Avx2 => has_avx2(),
#[cfg(target_arch = "x86_64")]
Self::Sse4_1 => has_sse41(),
#[cfg(target_arch = "aarch64")]
Self::Neon => has_neon(),
#[cfg(target_arch = "wasm32")]
Self::Simd128 => has_simd128(),
Self::None => true,
}
}
}
impl Default for CpuExtensions {
#[cfg(target_arch = "x86_64")]
fn default() -> Self {
if has_avx2() {
Self::Avx2
} else if has_sse41() {
Self::Sse4_1
} else {
Self::None
}
}
#[cfg(target_arch = "aarch64")]
fn default() -> Self {
if has_neon() {
Self::Neon
} else {
Self::None
}
}
#[cfg(target_arch = "wasm32")]
fn default() -> Self {
if has_simd128() {
Self::Simd128
} else {
Self::None
}
}
#[cfg(not(any(
target_arch = "x86_64",
target_arch = "aarch64",
target_arch = "wasm32"
)))]
fn default() -> Self {
Self::None
}
}