#![deny(unsafe_code)]
#![warn(missing_docs)]
#![warn(clippy::all)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
mod cache;
mod features;
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
mod windows;
pub use cache::{Features, is_detected, set_registry_enabled};
pub use features::Feature;
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
#[macro_export]
macro_rules! is_aarch64_feature_detected_fast {
("asimd") => {
$crate::is_detected($crate::Feature::Asimd)
};
("fp") => {
$crate::is_detected($crate::Feature::Fp)
};
("fp16") => {
$crate::is_detected($crate::Feature::Fp16)
};
("fhm") => {
$crate::is_detected($crate::Feature::Fhm)
};
("fcma") => {
$crate::is_detected($crate::Feature::Fcma)
};
("bf16") => {
$crate::is_detected($crate::Feature::Bf16)
};
("i8mm") => {
$crate::is_detected($crate::Feature::I8mm)
};
("jsconv") => {
$crate::is_detected($crate::Feature::JsConv)
};
("frintts") => {
$crate::is_detected($crate::Feature::FrintTs)
};
("rdm") => {
$crate::is_detected($crate::Feature::Rdm)
};
("dotprod") => {
$crate::is_detected($crate::Feature::Dotprod)
};
("aes") => {
$crate::is_detected($crate::Feature::Aes)
};
("pmull") => {
$crate::is_detected($crate::Feature::Pmull)
};
("sha2") => {
$crate::is_detected($crate::Feature::Sha2)
};
("sha3") => {
$crate::is_detected($crate::Feature::Sha3)
};
("sm4") => {
$crate::is_detected($crate::Feature::Sm4)
};
("crc") => {
$crate::is_detected($crate::Feature::Crc)
};
("lse") => {
$crate::is_detected($crate::Feature::Lse)
};
("lse2") => {
$crate::is_detected($crate::Feature::Lse2)
};
("lse128") => {
$crate::is_detected($crate::Feature::Lse128)
};
("rcpc") => {
$crate::is_detected($crate::Feature::Rcpc)
};
("rcpc2") => {
$crate::is_detected($crate::Feature::Rcpc2)
};
("rcpc3") => {
$crate::is_detected($crate::Feature::Rcpc3)
};
("paca") => {
$crate::is_detected($crate::Feature::Paca)
};
("pacg") => {
$crate::is_detected($crate::Feature::Pacg)
};
("pauth-lr") => {
$crate::is_detected($crate::Feature::PauthLr)
};
("bti") => {
$crate::is_detected($crate::Feature::Bti)
};
("dpb") => {
$crate::is_detected($crate::Feature::Dpb)
};
("dpb2") => {
$crate::is_detected($crate::Feature::Dpb2)
};
("mte") => {
$crate::is_detected($crate::Feature::Mte)
};
("mops") => {
$crate::is_detected($crate::Feature::Mops)
};
("dit") => {
$crate::is_detected($crate::Feature::Dit)
};
("sb") => {
$crate::is_detected($crate::Feature::Sb)
};
("ssbs") => {
$crate::is_detected($crate::Feature::Ssbs)
};
("flagm") => {
$crate::is_detected($crate::Feature::FlagM)
};
("flagm2") => {
$crate::is_detected($crate::Feature::FlagM2)
};
("rand") => {
$crate::is_detected($crate::Feature::Rand)
};
("tme") => {
$crate::is_detected($crate::Feature::Tme)
};
("ecv") => {
$crate::is_detected($crate::Feature::Ecv)
};
("cssc") => {
$crate::is_detected($crate::Feature::Cssc)
};
("wfxt") => {
$crate::is_detected($crate::Feature::WfxT)
};
("hbc") => {
$crate::is_detected($crate::Feature::Hbc)
};
("lut") => {
$crate::is_detected($crate::Feature::Lut)
};
("faminmax") => {
$crate::is_detected($crate::Feature::FaMinMax)
};
("fp8") => {
$crate::is_detected($crate::Feature::Fp8)
};
("fp8dot2") => {
$crate::is_detected($crate::Feature::Fp8Dot2)
};
("fp8dot4") => {
$crate::is_detected($crate::Feature::Fp8Dot4)
};
("fp8fma") => {
$crate::is_detected($crate::Feature::Fp8Fma)
};
("fpmr") => {
$crate::is_detected($crate::Feature::Fpmr)
};
("sve") => {
$crate::is_detected($crate::Feature::Sve)
};
("sve2") => {
$crate::is_detected($crate::Feature::Sve2)
};
("sve2p1") => {
$crate::is_detected($crate::Feature::Sve2p1)
};
("sve2-aes") => {
$crate::is_detected($crate::Feature::Sve2Aes)
};
("sve2-bitperm") => {
$crate::is_detected($crate::Feature::Sve2Bitperm)
};
("sve2-sha3") => {
$crate::is_detected($crate::Feature::Sve2Sha3)
};
("sve2-sm4") => {
$crate::is_detected($crate::Feature::Sve2Sm4)
};
("sve-b16b16") => {
$crate::is_detected($crate::Feature::SveB16b16)
};
("f32mm") => {
$crate::is_detected($crate::Feature::F32mm)
};
("f64mm") => {
$crate::is_detected($crate::Feature::F64mm)
};
("sme") => {
$crate::is_detected($crate::Feature::Sme)
};
("sme2") => {
$crate::is_detected($crate::Feature::Sme2)
};
("sme2p1") => {
$crate::is_detected($crate::Feature::Sme2p1)
};
("sme-b16b16") => {
$crate::is_detected($crate::Feature::SmeB16b16)
};
("sme-f16f16") => {
$crate::is_detected($crate::Feature::SmeF16f16)
};
("sme-f64f64") => {
$crate::is_detected($crate::Feature::SmeF64f64)
};
("sme-f8f16") => {
$crate::is_detected($crate::Feature::SmeF8f16)
};
("sme-f8f32") => {
$crate::is_detected($crate::Feature::SmeF8f32)
};
("sme-fa64") => {
$crate::is_detected($crate::Feature::SmeFa64)
};
("sme-i16i64") => {
$crate::is_detected($crate::Feature::SmeI16i64)
};
("sme-lutv2") => {
$crate::is_detected($crate::Feature::SmeLutv2)
};
("ssve-fp8dot2") => {
$crate::is_detected($crate::Feature::SsveFp8Dot2)
};
("ssve-fp8dot4") => {
$crate::is_detected($crate::Feature::SsveFp8Dot4)
};
("ssve-fp8fma") => {
$crate::is_detected($crate::Feature::SsveFp8Fma)
};
($other:tt) => {
::std::arch::is_aarch64_feature_detected!($other)
};
}
#[cfg(all(target_arch = "aarch64", not(target_os = "windows")))]
#[macro_export]
macro_rules! is_aarch64_feature_detected_fast {
($name:tt) => {
::std::arch::is_aarch64_feature_detected!($name)
};
}
#[cfg(not(target_arch = "aarch64"))]
#[macro_export]
macro_rules! is_aarch64_feature_detected_fast {
($name:literal) => {{
const _: &str = $name;
false
}};
}