lamina_platform/
vector.rs1use crate::arch_table::TargetArchitecture;
4
5impl TargetArchitecture {
6 pub fn vector_register_bits(self) -> &'static [u32] {
12 match self {
13 TargetArchitecture::X86_64 => &[128, 256],
14 TargetArchitecture::Aarch64
15 | TargetArchitecture::Armv7
16 | TargetArchitecture::Wasm32
17 | TargetArchitecture::Wasm64 => &[128],
18 TargetArchitecture::I686
19 | TargetArchitecture::Arm32
20 | TargetArchitecture::Thumbv6m
21 | TargetArchitecture::Thumbv7m
22 | TargetArchitecture::Riscv32
23 | TargetArchitecture::Riscv64
24 | TargetArchitecture::PowerPC64
25 | TargetArchitecture::PowerPC64Be
26 | TargetArchitecture::Mips64
27 | TargetArchitecture::Mips64El
28 | TargetArchitecture::LoongArch64
29 | TargetArchitecture::S390x
30 | TargetArchitecture::Nvptx64
31 | TargetArchitecture::Amdgcn => &[],
32 #[cfg(feature = "nightly")]
33 TargetArchitecture::Arx64 | TargetArchitecture::Riscv128 | TargetArchitecture::Lisa => {
34 &[]
35 }
36 }
37 }
38}
39
40pub fn any_vector_register_bits() -> &'static [u32] {
46 &[128, 256]
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn every_architecture_width_is_one_a_target_independent_check_allows() {
55 for architecture in TargetArchitecture::all() {
56 for bits in architecture.vector_register_bits() {
57 assert!(
58 any_vector_register_bits().contains(bits),
59 "{architecture:?} has {bits}-bit vectors that no target-independent check allows"
60 );
61 }
62 }
63 }
64
65 #[test]
66 fn widths_are_ascending_and_powers_of_two() {
67 for architecture in TargetArchitecture::all() {
68 let bits = architecture.vector_register_bits();
69 assert!(bits.windows(2).all(|w| w[0] < w[1]), "{architecture:?}");
70 assert!(bits.iter().all(|b| b.is_power_of_two()), "{architecture:?}");
71 }
72 }
73}