Skip to main content

zrip_core/simd/
mod.rs

1pub mod scalar;
2
3#[cfg(all(target_arch = "x86_64", not(feature = "paranoid")))]
4pub mod x86_64;
5
6#[cfg(all(target_arch = "aarch64", not(feature = "paranoid")))]
7pub mod aarch64;
8
9pub mod copy;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
12pub enum CpuTier {
13    Scalar,
14    #[cfg(target_arch = "x86_64")]
15    Sse2,
16    #[cfg(target_arch = "x86_64")]
17    Bmi2,
18    #[cfg(target_arch = "x86_64")]
19    Avx2,
20    #[cfg(target_arch = "aarch64")]
21    Neon,
22}
23
24#[cfg(all(feature = "std", not(feature = "paranoid")))]
25static CPU_TIER: std::sync::OnceLock<CpuTier> = std::sync::OnceLock::new();
26
27#[cfg(feature = "paranoid")]
28pub fn cpu_tier() -> CpuTier {
29    CpuTier::Scalar
30}
31
32#[cfg(all(feature = "std", not(feature = "paranoid")))]
33pub fn cpu_tier() -> CpuTier {
34    *CPU_TIER.get_or_init(detect_cpu_tier)
35}
36
37#[cfg(all(not(feature = "std"), not(feature = "paranoid")))]
38pub fn cpu_tier() -> CpuTier {
39    compile_time_tier()
40}
41
42#[cfg(all(feature = "std", not(feature = "paranoid")))]
43fn detect_cpu_tier() -> CpuTier {
44    #[cfg(target_arch = "x86_64")]
45    {
46        if std::arch::is_x86_feature_detected!("avx2")
47            && std::arch::is_x86_feature_detected!("bmi2")
48        {
49            return CpuTier::Avx2;
50        }
51        if std::arch::is_x86_feature_detected!("bmi2") {
52            return CpuTier::Bmi2;
53        }
54        if std::arch::is_x86_feature_detected!("sse2") {
55            return CpuTier::Sse2;
56        }
57        CpuTier::Scalar
58    }
59    #[cfg(target_arch = "aarch64")]
60    {
61        CpuTier::Neon
62    }
63    #[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
64    {
65        CpuTier::Scalar
66    }
67}
68
69#[cfg(all(not(feature = "std"), not(feature = "paranoid")))]
70fn compile_time_tier() -> CpuTier {
71    #[cfg(target_arch = "x86_64")]
72    {
73        if cfg!(target_feature = "avx2") && cfg!(target_feature = "bmi2") {
74            CpuTier::Avx2
75        } else if cfg!(target_feature = "bmi2") {
76            CpuTier::Bmi2
77        } else if cfg!(target_feature = "sse2") {
78            CpuTier::Sse2
79        } else {
80            CpuTier::Scalar
81        }
82    }
83    #[cfg(target_arch = "aarch64")]
84    {
85        CpuTier::Neon
86    }
87    #[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
88    {
89        CpuTier::Scalar
90    }
91}