include!("common.rs");
mod ffi {
pub(crate) use crate::utils::ffi::c_uint;
sys_const!({
pub(crate) const AV_AARCH64_LSE: u32 = 1 << 15;
#[cfg(test)]
pub(crate) const AV_AARCH64_LRCPC: u32 = 1 << 28;
#[cfg(test)]
pub(crate) const AV_AARCH64_2_ILRCPC: u32 = 1 << 1;
pub(crate) const AV_AARCH64_2_LSE2: u32 = 1 << 2;
});
sys_fn!({
extern "C" {
pub(crate) fn getisax(array: *mut u32, n: c_uint) -> c_uint;
}
});
}
#[cold]
fn _detect(info: &mut CpuInfo) {
const OUT_LEN: ffi::c_uint = 2;
let mut out = [0_u32; OUT_LEN as usize];
unsafe {
ffi::getisax(out.as_mut_ptr(), OUT_LEN);
}
macro_rules! check {
($x:ident, $flag:ident, $bit:ident) => {
if $x & ffi::$bit != 0 {
info.set(CpuInfoFlag::$flag);
}
};
}
let v1 = out[0];
check!(v1, lse, AV_AARCH64_LSE);
#[cfg(test)]
check!(v1, rcpc, AV_AARCH64_LRCPC);
let v2 = out[1];
#[cfg(test)]
check!(v2, rcpc2, AV_AARCH64_2_ILRCPC);
check!(v2, lse2, AV_AARCH64_2_LSE2);
}