use crate::arch_table::TargetArchitecture;
impl TargetArchitecture {
pub fn vector_register_bits(self) -> &'static [u32] {
match self {
TargetArchitecture::X86_64 => &[128, 256],
TargetArchitecture::Aarch64
| TargetArchitecture::Armv7
| TargetArchitecture::Wasm32
| TargetArchitecture::Wasm64 => &[128],
TargetArchitecture::I686
| TargetArchitecture::Arm32
| TargetArchitecture::Thumbv6m
| TargetArchitecture::Thumbv7m
| TargetArchitecture::Riscv32
| TargetArchitecture::Riscv64
| TargetArchitecture::PowerPC64
| TargetArchitecture::PowerPC64Be
| TargetArchitecture::Mips64
| TargetArchitecture::Mips64El
| TargetArchitecture::LoongArch64
| TargetArchitecture::S390x
| TargetArchitecture::Nvptx64
| TargetArchitecture::Amdgcn => &[],
#[cfg(feature = "nightly")]
TargetArchitecture::Arx64 | TargetArchitecture::Riscv128 | TargetArchitecture::Lisa => {
&[]
}
}
}
}
pub fn any_vector_register_bits() -> &'static [u32] {
&[128, 256]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_architecture_width_is_one_a_target_independent_check_allows() {
for architecture in TargetArchitecture::all() {
for bits in architecture.vector_register_bits() {
assert!(
any_vector_register_bits().contains(bits),
"{architecture:?} has {bits}-bit vectors that no target-independent check allows"
);
}
}
}
#[test]
fn widths_are_ascending_and_powers_of_two() {
for architecture in TargetArchitecture::all() {
let bits = architecture.vector_register_bits();
assert!(bits.windows(2).all(|w| w[0] < w[1]), "{architecture:?}");
assert!(bits.iter().all(|b| b.is_power_of_two()), "{architecture:?}");
}
}
}