use super::{ArchInfo, tables::ppc_uarch};
fn lookup_tag(pvr: u32) -> Option<&'static str> {
ppc_uarch::PPC_PVR
.iter()
.find(|&&(mask, value, _)| (pvr & mask) == value)
.map(|&(_, _, tag)| tag)
}
fn name_for_tag(tag: &str) -> (&'static str, Option<u32>) {
ppc_uarch::PPC_NAMES
.iter()
.find(|&&(t, _, _)| t == tag)
.map(|&(_, name, proc)| (name, proc))
.unwrap_or(("Unknown", None))
}
pub fn detect_from_pvr(pvr: u32) -> ArchInfo {
let tag = lookup_tag(pvr).unwrap_or("UNKNOWN");
let (name, process_nm) = name_for_tag(tag);
ArchInfo {
vendor: Some("IBM".to_string()),
uarch: Some(name.to_string()),
soc: None,
process_nm,
features: Vec::new(),
}
}
pub fn detect_from_name_str(s: &str) -> ArchInfo {
let lower = s.to_ascii_lowercase();
let features = if lower.contains("altivec") {
vec!["altivec".to_string()]
} else {
Vec::new()
};
let uarch = ppc_uarch::PPC_NAMES
.iter()
.find(|&&(_, name, _)| lower.contains(&name.to_ascii_lowercase()))
.map(|&(_, name, _)| name.to_string());
let process_nm = uarch.as_deref().and_then(|u| {
ppc_uarch::PPC_NAMES
.iter()
.find(|&&(_, name, _)| name == u)
.and_then(|&(_, _, p)| p)
});
ArchInfo {
vendor: Some("IBM".to_string()),
uarch,
soc: None,
process_nm,
features,
}
}