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}