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