Last active
February 18, 2025 17:56
-
-
Save AngelicosPhosphoros/4f8c9f08656e0812f4ed3560e53bd600 to your computer and use it in GitHub Desktop.
How to print enabled cpu target features in Rust
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![recursion_limit="512"] | |
// This script prints all cpu features which active in this build. | |
// There are 3 steps in usage of script: | |
// 1. get list of features using `rustc --print target-features` | |
// 2. put it into script (it has values actual for 2020-12-06 for x86-64 target). | |
// 3. run script. | |
fn pad_name(s: &str)->String{ | |
let mut res = s.to_string(); | |
while res.len() < 30 {res.push(' ');} | |
res | |
} | |
macro_rules! print_if_feature_enabled { | |
() => {}; | |
($feature:literal $(, $feats:literal)*)=>{ | |
if cfg!(target_feature = $feature){ | |
println!("feature {}", pad_name($feature)); | |
} | |
print_if_feature_enabled!($($feats),*) | |
} | |
} | |
fn main() { | |
print_if_feature_enabled!( | |
"16bit-mode", | |
"32bit-mode", | |
"3dnow", | |
"3dnowa", | |
"64bit", | |
"64bit-mode", | |
"adx", | |
"aes", | |
"amx-bf16", | |
"amx-int8", | |
"amx-tile", | |
"avx", | |
"avx2", | |
"avx512bf16", | |
"avx512bitalg", | |
"avx512bw", | |
"avx512cd", | |
"avx512dq", | |
"avx512er", | |
"avx512f", | |
"avx512ifma", | |
"avx512pf", | |
"avx512vbmi", | |
"avx512vbmi2", | |
"avx512vl", | |
"avx512vnni", | |
"avx512vp2intersect", | |
"avx512vpopcntdq", | |
"bmi", | |
"bmi2", | |
"branchfusion", | |
"cldemote", | |
"clflushopt", | |
"clwb", | |
"clzero", | |
"cmov", | |
"cx16", | |
"cx8", | |
"enqcmd", | |
"ermsb", | |
"f16c", | |
"false-deps-lzcnt-tzcnt", | |
"false-deps-popcnt", | |
"fast-11bytenop", | |
"fast-15bytenop", | |
"fast-7bytenop", | |
"fast-bextr", | |
"fast-gather", | |
"fast-hops", | |
"fast-lzcnt", | |
"fast-scalar-fsqrt", | |
"fast-scalar-shift-masks", | |
"fast-shld-rotate", | |
"fast-variable-shuffle", | |
"fast-vector-fsqrt", | |
"fast-vector-shift-masks", | |
"fma", | |
"fma4", | |
"fsgsbase", | |
"fxsr", | |
"gfni", | |
"idivl-to-divb", | |
"idivq-to-divl", | |
"invpcid", | |
"lea-sp", | |
"lea-uses-ag", | |
"lvi-cfi", | |
"lvi-load-hardening", | |
"lwp", | |
"lzcnt", | |
"macrofusion", | |
"merge-to-threeway-branch", | |
"mmx", | |
"movbe", | |
"movdir64b", | |
"movdiri", | |
"mpx", | |
"mwaitx", | |
"nopl", | |
"pad-short-functions", | |
"pclmul", | |
"pconfig", | |
"pku", | |
"popcnt", | |
"prefer-128-bit", | |
"prefer-256-bit", | |
"prefer-mask-registers", | |
"prefetchwt1", | |
"prfchw", | |
"ptwrite", | |
"rdpid", | |
"rdrnd", | |
"rdseed", | |
"retpoline", | |
"retpoline-external-thunk", | |
"retpoline-indirect-branches", | |
"retpoline-indirect-calls", | |
"rtm", | |
"sahf", | |
"serialize", | |
"seses", | |
"sgx", | |
"sha", | |
"shstk", | |
"slow-3ops-lea", | |
"slow-incdec", | |
"slow-lea", | |
"slow-pmaddwd", | |
"slow-pmulld", | |
"slow-shld", | |
"slow-two-mem-ops", | |
"slow-unaligned-mem-16", | |
"slow-unaligned-mem-32", | |
"soft-float", | |
"sse", | |
"sse-unaligned-mem", | |
"sse2", | |
"sse3", | |
"sse4.1", | |
"sse4.2", | |
"sse4a", | |
"ssse3", | |
"tbm", | |
"tsxldtrk", | |
"use-aa", | |
"use-glm-div-sqrt-costs", | |
"vaes", | |
"vpclmulqdq", | |
"vzeroupper", | |
"waitpkg", | |
"wbnoinvd", | |
"x87", | |
"xop", | |
"xsave", | |
"xsavec", | |
"xsaveopt", | |
"xsaves" | |
); | |
} |
Thanks, this is very useful.
I would like to publish a crate with a function that returns the currently enabled features: pub fn target_features() -> Vec<String>
. My draft is here. Would it be OK to publish under the Apache2/MIT licenses? Any comments or suggestions?
@astraw Yes, you can publish it. Just include reference about my code into yours.
My only concern is list of features can became obsolete when compiler updates. Maybe you would generate list of features to test using build.rs
?
Thanks.
Now that I waited so long, it someone already made this into a crate called target
. The target::features
function is the relevant one. :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Perfect, I upvoted your question and answer.