use super::detect::capability;
#[cfg(target_arch = "aarch64")]
mod backend;
capability! {
Aes,
AES_CACHE,
module = aarch64,
arch = target_arch = "aarch64",
feature = "disable-aarch64-aes",
env = "TC_DISABLE_AARCH64_AES",
detect = backend::aes()
}
capability! {
Dit,
DIT_CACHE,
module = aarch64,
arch = target_arch = "aarch64",
feature = "disable-aarch64-dit",
env = "TC_DISABLE_AARCH64_DIT",
detect = backend::dit()
}
capability! {
Neon,
NEON_CACHE,
module = aarch64,
arch = target_arch = "aarch64",
feature = "disable-aarch64-neon",
env = "TC_DISABLE_AARCH64_NEON",
detect = true
}
capability! {
Sha2,
SHA2_CACHE,
module = aarch64,
arch = target_arch = "aarch64",
feature = "disable-aarch64-sha2",
env = "TC_DISABLE_AARCH64_SHA2",
detect = backend::sha2()
}
capability! {
Sha3,
SHA3_CACHE,
module = aarch64,
arch = target_arch = "aarch64",
feature = "disable-aarch64-sha3",
env = "TC_DISABLE_AARCH64_SHA3",
detect = backend::sha3()
}
capability! {
Sm4,
SM4_CACHE,
module = aarch64,
arch = target_arch = "aarch64",
feature = "disable-aarch64-sm4",
env = "TC_DISABLE_AARCH64_SM4",
detect = backend::sm4()
}
#[cfg(test)]
mod tests {
use super::{Aes, Dit, Neon, Sha2, Sha3, Sm4};
#[test]
fn every_token_matches_boolean_detection() {
assert_eq!(Aes::detect().is_some(), Aes::is_enabled());
assert_eq!(Dit::detect().is_some(), Dit::is_enabled());
assert_eq!(Neon::detect().is_some(), Neon::is_enabled());
assert_eq!(Sha2::detect().is_some(), Sha2::is_enabled());
assert_eq!(Sha3::detect().is_some(), Sha3::is_enabled());
assert_eq!(Sm4::detect().is_some(), Sm4::is_enabled());
}
#[cfg(all(target_arch = "aarch64", not(feature = "disable-aarch64-neon")))]
#[test]
fn aarch64_baseline_supports_neon() {
assert!(Neon::is_enabled());
}
#[cfg(target_arch = "aarch64")]
#[test]
fn enabled_target_features_survive_every_backend() {
macro_rules! floor {
($($ty:ty, $tf:literal, $off:literal);+ $(;)?) => {$(
if cfg!(target_feature = $tf) && !cfg!(feature = $off) {
assert!(<$ty>::is_enabled(), concat!($tf, " is compiled in"));
}
)+};
}
floor! {
Aes, "aes", "disable-aarch64-aes";
Dit, "dit", "disable-aarch64-dit";
Sha2, "sha2", "disable-aarch64-sha2";
Sha3, "sha3", "disable-aarch64-sha3";
Sm4, "sm4", "disable-aarch64-sm4";
}
}
#[cfg(any(
feature = "disable-aarch64-aes",
feature = "disable-aarch64-dit",
feature = "disable-aarch64-neon",
feature = "disable-aarch64-sha2",
feature = "disable-aarch64-sha3",
feature = "disable-aarch64-sm4"
))]
#[test]
fn configured_cargo_features_disable_their_capabilities() {
#[cfg(feature = "disable-aarch64-aes")]
{
assert!(!Aes::is_enabled());
assert_eq!(None, Aes::detect());
}
#[cfg(feature = "disable-aarch64-dit")]
assert!(!Dit::is_enabled());
#[cfg(feature = "disable-aarch64-neon")]
assert!(!Neon::is_enabled());
#[cfg(feature = "disable-aarch64-sha2")]
assert!(!Sha2::is_enabled());
#[cfg(feature = "disable-aarch64-sha3")]
assert!(!Sha3::is_enabled());
#[cfg(feature = "disable-aarch64-sm4")]
assert!(!Sm4::is_enabled());
}
#[cfg(all(feature = "std", target_arch = "aarch64"))]
#[test]
fn runtime_environment_overrides_disable_every_capability() {
const CHILD_MARKER: &str = "TC_RUNTIME_AARCH64_ENV_TEST_CHILD";
const TEST_NAME: &str =
"intrinsics::aarch64::tests::runtime_environment_overrides_disable_every_capability";
const DISABLE_VARIABLES: &[&str] = &[
"TC_DISABLE_AARCH64_AES",
"TC_DISABLE_AARCH64_DIT",
"TC_DISABLE_AARCH64_NEON",
"TC_DISABLE_AARCH64_SHA2",
"TC_DISABLE_AARCH64_SHA3",
"TC_DISABLE_AARCH64_SM4",
];
if std::env::var_os(CHILD_MARKER).is_some() {
assert!(!Aes::is_enabled());
assert!(!Dit::is_enabled());
assert!(!Neon::is_enabled());
assert!(!Sha2::is_enabled());
assert!(!Sha3::is_enabled());
assert!(!Sm4::is_enabled());
return;
}
let mut child = std::process::Command::new(
std::env::current_exe().expect("current test executable should be available"),
);
child
.arg("--exact")
.arg(TEST_NAME)
.arg("--nocapture")
.env(CHILD_MARKER, "1");
for variable in DISABLE_VARIABLES {
child.env(variable, "1");
}
let status = child.status().expect("environment test child should run");
assert!(status.success());
}
#[cfg(not(target_arch = "aarch64"))]
#[test]
fn non_aarch64_targets_report_every_capability_as_unavailable() {
assert!(!Aes::is_enabled());
assert!(!Dit::is_enabled());
assert!(!Neon::is_enabled());
assert!(!Sha2::is_enabled());
assert!(!Sha3::is_enabled());
assert!(!Sm4::is_enabled());
}
}