#[macro_export]
#[doc(hidden)]
macro_rules! __unless_target_features {
($($tf:tt),+ => $body:expr ) => {
{
#[cfg(not(all($(target_feature=$tf,)*)))]
$body
#[cfg(all($(target_feature=$tf,)*))]
true
}
};
}
#[cfg(target_os = "linux")]
#[macro_export]
#[doc(hidden)]
macro_rules! __detect_target_features {
($($tf:tt),+) => {{
let hwcaps = $crate::loongarch64::getauxval_hwcap();
$($crate::check!(hwcaps, $tf) & )+ true
}};
}
#[cfg(target_os = "linux")]
pub fn getauxval_hwcap() -> u64 {
unsafe { libc::getauxval(libc::AT_HWCAP) }
}
#[cfg(target_os = "linux")]
macro_rules! __expand_check_macro {
($(($name:tt, $hwcap:ident)),* $(,)?) => {
#[macro_export]
#[doc(hidden)]
macro_rules! check {
$(
($hwcaps:expr, $name) => {
(($hwcaps & $crate::loongarch64::hwcaps::$hwcap) != 0)
};
)*
}
};
}
#[cfg(target_os = "linux")]
__expand_check_macro! {
("cpucfg", CPUCFG), ("lam", LAM), ("ual", UAL), ("fpu", FPU), ("lsx", LSX), ("lasx", LASX), ("crc32", CRC32), ("complex", COMPLEX), ("crypto", CRYPTO), ("lvz", LVZ), ("lbt.x86", LBT_X86), ("lbt.arm", LBT_ARM), ("lbt.mips", LBT_MIPS), ("ptw", PTW), }
#[cfg(target_os = "linux")]
pub mod hwcaps {
use libc::c_ulong;
pub const CPUCFG: c_ulong = libc::HWCAP_LOONGARCH_CPUCFG;
pub const LAM: c_ulong = libc::HWCAP_LOONGARCH_LAM;
pub const UAL: c_ulong = libc::HWCAP_LOONGARCH_UAL;
pub const FPU: c_ulong = libc::HWCAP_LOONGARCH_FPU;
pub const LSX: c_ulong = libc::HWCAP_LOONGARCH_LSX;
pub const LASX: c_ulong = libc::HWCAP_LOONGARCH_LASX;
pub const CRC32: c_ulong = libc::HWCAP_LOONGARCH_CRC32;
pub const COMPLEX: c_ulong = libc::HWCAP_LOONGARCH_COMPLEX;
pub const CRYPTO: c_ulong = libc::HWCAP_LOONGARCH_CRYPTO;
pub const LVZ: c_ulong = libc::HWCAP_LOONGARCH_LVZ;
pub const LBT_X86: c_ulong = libc::HWCAP_LOONGARCH_LBT_X86;
pub const LBT_ARM: c_ulong = libc::HWCAP_LOONGARCH_LBT_ARM;
pub const LBT_MIPS: c_ulong = libc::HWCAP_LOONGARCH_LBT_MIPS;
pub const PTW: c_ulong = libc::HWCAP_LOONGARCH_PTW;
}
#[cfg(not(target_os = "linux"))]
#[macro_export]
#[doc(hidden)]
macro_rules! __detect_target_features {
($($tf:tt),+) => {
false
};
}