binius_field/arch/
arch_optimal.rs1use cfg_if::cfg_if;
4
5use crate::{
6 as_packed_field::{PackScalar, PackedType},
7 underlier::WithUnderlier,
8 Field, PackedField,
9};
10
11pub trait ArchOptimal: Field {
12 type OptimalThroughputPacked: PackedField<Scalar = Self>
13 + WithUnderlier<Underlier = OptimalUnderlier>;
14}
15
16impl<F> ArchOptimal for F
17where
18 F: Field,
19 OptimalUnderlier: PackScalar<F>,
20{
21 type OptimalThroughputPacked = PackedType<OptimalUnderlier, F>;
22}
23
24cfg_if! {
25 if #[cfg(all(target_arch = "x86_64", target_feature = "avx512f"))] {
26 pub const OPTIMAL_ALIGNMENT: usize = 512;
27
28 pub type OptimalUnderlier128b = crate::arch::x86_64::m128::M128;
29 pub type OptimalUnderlier256b = crate::arch::x86_64::m256::M256;
30 pub type OptimalUnderlier512b = crate::arch::x86_64::m512::M512;
31 pub type OptimalUnderlier = OptimalUnderlier512b;
32 } else if #[cfg(all(target_arch = "x86_64", target_feature = "avx2"))] {
33 use crate::underlier::ScaledUnderlier;
34
35 pub const OPTIMAL_ALIGNMENT: usize = 256;
36
37 pub type OptimalUnderlier128b = crate::arch::x86_64::m128::M128;
38 pub type OptimalUnderlier256b = crate::arch::x86_64::m256::M256;
39 pub type OptimalUnderlier512b = ScaledUnderlier<OptimalUnderlier256b, 2>;
40 pub type OptimalUnderlier = OptimalUnderlier256b;
41 } else if #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] {
42 use crate::underlier::ScaledUnderlier;
43
44 pub const OPTIMAL_ALIGNMENT: usize = 128;
45
46 pub type OptimalUnderlier128b = crate::arch::x86_64::m128::M128;
47 pub type OptimalUnderlier256b = ScaledUnderlier<OptimalUnderlier128b, 2>;
48 pub type OptimalUnderlier512b = ScaledUnderlier<OptimalUnderlier256b, 2>;
49 pub type OptimalUnderlier = OptimalUnderlier128b;
50 } else if #[cfg(all(target_arch = "aarch64", target_feature = "neon", target_feature = "aes"))] {
51 use crate::underlier::ScaledUnderlier;
52
53 pub const OPTIMAL_ALIGNMENT: usize = 128;
54
55 pub type OptimalUnderlier128b = crate::arch::aarch64::m128::M128;
56 pub type OptimalUnderlier256b = ScaledUnderlier<OptimalUnderlier128b, 2>;
57 pub type OptimalUnderlier512b = ScaledUnderlier<OptimalUnderlier256b, 2>;
58 pub type OptimalUnderlier = OptimalUnderlier128b;
59 } else {
60 use crate::underlier::ScaledUnderlier;
61
62 pub const OPTIMAL_ALIGNMENT: usize = 128;
63
64 pub type OptimalUnderlier128b = u128;
65 pub type OptimalUnderlier256b = ScaledUnderlier<OptimalUnderlier128b, 2>;
66 pub type OptimalUnderlier512b = ScaledUnderlier<OptimalUnderlier256b, 2>;
67 pub type OptimalUnderlier = OptimalUnderlier128b;
68 }
69}