aarch64.rs |
ARM64 CPU feature detection support.
Unfortunately ARM instructions to detect CPU features cannot be called from
unprivileged userspace code, so this implementation relies on OS-specific
APIs for feature detection. |
4669 |
lib.rs |
This crate provides macros for runtime CPU feature detection. It's intended
as a stopgap until Rust [RFC 2725] adding first-class target feature detection
macros to `libcore` is implemented.
# Supported target architectures
*NOTE: target features with an asterisk are unstable (nightly-only) and
subject to change to match upstream name changes in the Rust standard
library.
## `aarch64`
Linux, iOS, and macOS/ARM only (ARM64 does not support OS-independent feature detection)
Target features:
- `aes`*
- `sha2`*
- `sha3`*
## `x86`/`x86_64`
OS independent and `no_std`-friendly
Target features:
- `adx`
- `aes`
- `avx`
- `avx2`
- `avx512bw`*
- `avx512cd`*
- `avx512dq`*
- `avx512er`*
- `avx512f`*
- `avx512ifma`*
- `avx512pf`*
- `avx512vl`*
- `bmi1`
- `bmi2`
- `fma`,
- `mmx`
- `pclmulqdq`
- `popcnt`
- `rdrand`
- `rdseed`
- `sgx`
- `sha`
- `sse`
- `sse2`
- `sse3`
- `sse4.1`
- `sse4.2`
- `ssse3`
If you would like detection support for a target feature which is not on
this list, please [open a GitHub issue][gh].
# Example
```
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
# {
// This macro creates `cpuid_aes_sha` module
cpufeatures::new!(cpuid_aes_sha, "aes", "sha");
// `token` is a Zero Sized Type (ZST) value, which guarantees
// that underlying static storage got properly initialized,
// which allows to omit initialization branch
let token: cpuid_aes_sha::InitToken = cpuid_aes_sha::init();
if token.get() {
println!("CPU supports both SHA and AES extensions");
} else {
println!("SHA and AES extensions are not supported");
}
// If stored value needed only once you can get stored value
// omitting the token
let val = cpuid_aes_sha::get();
assert_eq!(val, token.get());
// Additionally you can get both token and value
let (token, val) = cpuid_aes_sha::init_get();
assert_eq!(val, token.get());
# }
```
Note that if all tested target features are enabled via compiler options
(e.g. by using `RUSTFLAGS`), the `get` method will always return `true`
and `init` will not use CPUID instruction. Such behavior allows
compiler to completely eliminate fallback code.
After first call macro caches result and returns it in subsequent
calls, thus runtime overhead for them is minimal.
[RFC 2725]: https://github.com/rust-lang/rfcs/pull/2725
[gh]: https://github.com/RustCrypto/utils/issues/new?title=cpufeatures:%20requesting%20support%20for%20CHANGEME%20target%20feature |
5471 |
miri.rs |
Minimal miri support.
Miri is an interpreter, and though it tries to emulate the target CPU
it does not support any target features. |
400 |
x86.rs |
x86/x86-64 CPU feature detection support.
Portable, `no_std`-friendly implementation that relies on the x86 `CPUID`
instruction for feature detection. |
4661 |