binius_field/arch/
arch_optimal.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3use 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}