[][src]Crate core_detect

This crate provides a no_std version of std's is_x86_feature_detected! macro.

This is possible because x86 chips can just use the cpuid instruction to detect CPU features, whereas most other architectures require either reading files or querying the OS.

Usage

if core_detect::is_x86_feature_detected!("ssse3") {
    println!("SSSE3 is available");
}

Note that like the equivalent macro in std, this will error on architectures other than x86/x86_64, so you should put the code behind a #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] check.

(In the future, this crate may provide another macro which returns false in these cases instead, and supports testing multiple features simultaneously).

Caveats

If you use this library on a machine older than the introduction of the cpuid instruction (that is, a machine from before around 1994), we'll end up executing the instruction regardless. There's no stable way to detect this currently, and in practice it's pretty difficult to target a machine this old with Rust/LLVM anyway, so it's probably fine.

If you do run this code on a machine that old, we'll exit with a SIGILL. This might sound bad, but in practice this is how core::intrinsics::abort typically exits, so there should be no security concerns or anything like that. Ideally we'd use arch::x86::has_cpuid, but this function is unstable, and requires inline asm to implement.

If this is unacceptable, you have two options (both of which are ignored if we can determine this statically):

  • If are on nightly, you can enable the unstable_has_cpuid feature.

  • Otherwise, you can disable the on-by-default assume_has_cpuid feature. (This is ignored if both it and unstable_has_cpuid are on).

(Also, file an issue if you really care about 30 year old machines, I have some other workarounds that I can finish up in that case).

(Note: For clarity, we do handle newer machines known to not have cpuid correctly — for example #[cfg(target_env = "sgx")])

Macros

is_x86_feature_detected

A macro to test at runtime whether a CPU feature is available on x86/x86-64 platforms.