99 lines
3.2 KiB
Rust
99 lines
3.2 KiB
Rust
//! Aarch64 run-time features.
|
|
|
|
/// Checks if `aarch64` feature is enabled.
|
|
#[macro_export]
|
|
#[unstable(feature = "stdsimd", issue = "27731")]
|
|
#[allow_internal_unstable(stdsimd_internal, stdsimd)]
|
|
macro_rules! is_aarch64_feature_detected {
|
|
("neon") => {
|
|
// FIXME: this should be removed once we rename Aarch64 neon to asimd
|
|
cfg!(target_feature = "neon") || $crate::detect::check_for($crate::detect::Feature::asimd)
|
|
};
|
|
("asimd") => {
|
|
cfg!(target_feature = "neon") || $crate::detect::check_for($crate::detect::Feature::asimd)
|
|
};
|
|
("pmull") => {
|
|
cfg!(target_feature = "pmull") || $crate::detect::check_for($crate::detect::Feature::pmull)
|
|
};
|
|
("fp") => {
|
|
cfg!(target_feature = "fp") || $crate::detect::check_for($crate::detect::Feature::fp)
|
|
};
|
|
("fp16") => {
|
|
cfg!(target_feature = "fp16") || $crate::detect::check_for($crate::detect::Feature::fp16)
|
|
};
|
|
("sve") => {
|
|
cfg!(target_feature = "sve") || $crate::detect::check_for($crate::detect::Feature::sve)
|
|
};
|
|
("crc") => {
|
|
cfg!(target_feature = "crc") || $crate::detect::check_for($crate::detect::Feature::crc)
|
|
};
|
|
("crypto") => {
|
|
cfg!(target_feature = "crypto")
|
|
|| $crate::detect::check_for($crate::detect::Feature::crypto)
|
|
};
|
|
("lse") => {
|
|
cfg!(target_feature = "lse") || $crate::detect::check_for($crate::detect::Feature::lse)
|
|
};
|
|
("rdm") => {
|
|
cfg!(target_feature = "rdm") || $crate::detect::check_for($crate::detect::Feature::rdm)
|
|
};
|
|
("rcpc") => {
|
|
cfg!(target_feature = "rcpc") || $crate::detect::check_for($crate::detect::Feature::rcpc)
|
|
};
|
|
("dotprod") => {
|
|
cfg!(target_feature = "dotprod")
|
|
|| $crate::detect::check_for($crate::detect::Feature::dotprod)
|
|
};
|
|
("ras") => {
|
|
compile_error!("\"ras\" feature cannot be detected at run-time")
|
|
};
|
|
("v8.1a") => {
|
|
compile_error!("\"v8.1a\" feature cannot be detected at run-time")
|
|
};
|
|
("v8.2a") => {
|
|
compile_error!("\"v8.2a\" feature cannot be detected at run-time")
|
|
};
|
|
("v8.3a") => {
|
|
compile_error!("\"v8.3a\" feature cannot be detected at run-time")
|
|
};
|
|
($t:tt,) => {
|
|
is_aarch64_feature_detected!($t);
|
|
};
|
|
($t:tt) => {
|
|
compile_error!(concat!("unknown aarch64 target feature: ", $t))
|
|
};
|
|
}
|
|
|
|
/// ARM Aarch64 CPU Feature enum. Each variant denotes a position in a bitset
|
|
/// for a particular feature.
|
|
///
|
|
/// PLEASE: do not use this, it is an implementation detail subject to change.
|
|
#[doc(hidden)]
|
|
#[allow(non_camel_case_types)]
|
|
#[repr(u8)]
|
|
#[unstable(feature = "stdsimd_internal", issue = "0")]
|
|
pub enum Feature {
|
|
/// ARM Advanced SIMD (ASIMD)
|
|
asimd,
|
|
/// Polynomial Multiply
|
|
pmull,
|
|
/// Floating point support
|
|
fp,
|
|
/// Half-float support.
|
|
fp16,
|
|
/// Scalable Vector Extension (SVE)
|
|
sve,
|
|
/// CRC32 (Cyclic Redundancy Check)
|
|
crc,
|
|
/// Crypto: AES + PMULL + SHA1 + SHA2
|
|
crypto,
|
|
/// Atomics (Large System Extension)
|
|
lse,
|
|
/// Rounding Double Multiply (ASIMDRDM)
|
|
rdm,
|
|
/// Release consistent Processor consistent (RcPc)
|
|
rcpc,
|
|
/// Vector Dot-Product (ASIMDDP)
|
|
dotprod,
|
|
}
|