[][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.


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).


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")])



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