Rollup merge of #78361 - DevJPM:master, r=workingjubilee
Updated the list of white-listed target features for x86 This PR both adds in-source documentation on what to look out for when adding a new (X86) feature set and [adds all that are detectable at run-time in Rust stable as of 1.27.0](https://github.com/rust-lang/stdarch/blob/master/crates/std_detect/src/detect/arch/x86.rs). This should only enable the use of the corresponding LLVM intrinsics. Actual intrinsics need to be added separately in rust-lang/stdarch. It also re-orders the run-time-detect test statements to be more consistent with the actual list of intrinsics whitelisted and removes underscores not present in the actual names (which might be mistaken as being part of the name) The reference for LLVM's feature names used is [this file](https://github.com/llvm/llvm-project/blob/master/llvm/include/llvm/Support/X86TargetParser.def). This PR was motivated as the compiler end's part for allowing #67329 to be adressed over on rust-lang/stdarch
This commit is contained in:
commit
c7e9029b80
@ -129,6 +129,13 @@ pub fn time_trace_profiler_finish(file_name: &str) {
|
||||
// WARNING: the features after applying `to_llvm_feature` must be known
|
||||
// to LLVM or the feature detection code will walk past the end of the feature
|
||||
// array, leading to crashes.
|
||||
// To find a list of LLVM's names, check llvm-project/llvm/include/llvm/Support/*TargetParser.def
|
||||
// where the * matches the architecture's name
|
||||
// Beware to not use the llvm github project for this, but check the git submodule
|
||||
// found in src/llvm-project
|
||||
// Though note that Rust can also be build with an external precompiled version of LLVM
|
||||
// which might lead to failures if the oldest tested / supported LLVM version
|
||||
// doesn't yet support the relevant intrinsics
|
||||
pub fn to_llvm_feature<'a>(sess: &Session, s: &'a str) -> &'a str {
|
||||
let arch = if sess.target.arch == "x86_64" { "x86" } else { &*sess.target.arch };
|
||||
match (arch, s) {
|
||||
@ -136,6 +143,9 @@ pub fn to_llvm_feature<'a>(sess: &Session, s: &'a str) -> &'a str {
|
||||
("x86", "rdrand") => "rdrnd",
|
||||
("x86", "bmi1") => "bmi",
|
||||
("x86", "cmpxchg16b") => "cx16",
|
||||
("x86", "avx512vaes") => "vaes",
|
||||
("x86", "avx512gfni") => "gfni",
|
||||
("x86", "avx512vpclmulqdq") => "vpclmulqdq",
|
||||
("aarch64", "fp") => "fp-armv8",
|
||||
("aarch64", "fp16") => "fullfp16",
|
||||
(_, s) => s,
|
||||
|
@ -4,6 +4,11 @@ use rustc_session::Session;
|
||||
use rustc_span::symbol::sym;
|
||||
use rustc_span::symbol::Symbol;
|
||||
|
||||
// When adding features to the below lists
|
||||
// check whether they're named already elsewhere in rust
|
||||
// e.g. in stdarch and whether the given name matches LLVM's
|
||||
// if it doesn't, to_llvm_feature in llvm_util in rustc_codegen_llvm needs to be adapted
|
||||
|
||||
const ARM_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
|
||||
("aclass", Some(sym::arm_target_feature)),
|
||||
("mclass", Some(sym::arm_target_feature)),
|
||||
@ -50,15 +55,23 @@ const X86_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
|
||||
("aes", None),
|
||||
("avx", None),
|
||||
("avx2", None),
|
||||
("avx512bf16", Some(sym::avx512_target_feature)),
|
||||
("avx512bitalg", Some(sym::avx512_target_feature)),
|
||||
("avx512bw", Some(sym::avx512_target_feature)),
|
||||
("avx512cd", Some(sym::avx512_target_feature)),
|
||||
("avx512dq", Some(sym::avx512_target_feature)),
|
||||
("avx512er", Some(sym::avx512_target_feature)),
|
||||
("avx512f", Some(sym::avx512_target_feature)),
|
||||
("avx512gfni", Some(sym::avx512_target_feature)),
|
||||
("avx512ifma", Some(sym::avx512_target_feature)),
|
||||
("avx512pf", Some(sym::avx512_target_feature)),
|
||||
("avx512vaes", Some(sym::avx512_target_feature)),
|
||||
("avx512vbmi", Some(sym::avx512_target_feature)),
|
||||
("avx512vbmi2", Some(sym::avx512_target_feature)),
|
||||
("avx512vl", Some(sym::avx512_target_feature)),
|
||||
("avx512vnni", Some(sym::avx512_target_feature)),
|
||||
("avx512vp2intersect", Some(sym::avx512_target_feature)),
|
||||
("avx512vpclmulqdq", Some(sym::avx512_target_feature)),
|
||||
("avx512vpopcntdq", Some(sym::avx512_target_feature)),
|
||||
("bmi1", None),
|
||||
("bmi2", None),
|
||||
|
@ -54,42 +54,62 @@ fn powerpc64_linux() {
|
||||
#[test]
|
||||
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
fn x86_all() {
|
||||
// the below is the set of features we can test at runtime, but don't actually
|
||||
// use to gate anything and are thus not part of the X86_ALLOWED_FEATURES list
|
||||
|
||||
println!("abm: {:?}", is_x86_feature_detected!("abm")); // this is a synonym for lzcnt but we test it anyways
|
||||
println!("mmx: {:?}", is_x86_feature_detected!("mmx"));
|
||||
println!("tsc: {:?}", is_x86_feature_detected!("tsc"));
|
||||
|
||||
// the below is in alphabetical order and matches
|
||||
// the order of X86_ALLOWED_FEATURES in rustc_codegen_ssa's target_features.rs
|
||||
|
||||
println!("adx: {:?}", is_x86_feature_detected!("adx"));
|
||||
println!("aes: {:?}", is_x86_feature_detected!("aes"));
|
||||
println!("pcmulqdq: {:?}", is_x86_feature_detected!("pclmulqdq"));
|
||||
println!("avx: {:?}", is_x86_feature_detected!("avx"));
|
||||
println!("avx2: {:?}", is_x86_feature_detected!("avx2"));
|
||||
println!("avx512bf16: {:?}", is_x86_feature_detected!("avx512bf16"));
|
||||
println!("avx512bitalg: {:?}", is_x86_feature_detected!("avx512bitalg"));
|
||||
println!("avx512bw: {:?}", is_x86_feature_detected!("avx512bw"));
|
||||
println!("avx512cd: {:?}", is_x86_feature_detected!("avx512cd"));
|
||||
println!("avx512dq: {:?}", is_x86_feature_detected!("avx512dq"));
|
||||
println!("avx512er: {:?}", is_x86_feature_detected!("avx512er"));
|
||||
println!("avx512f: {:?}", is_x86_feature_detected!("avx512f"));
|
||||
println!("avx512gfni: {:?}", is_x86_feature_detected!("avx512gfni"));
|
||||
println!("avx512ifma: {:?}", is_x86_feature_detected!("avx512ifma"));
|
||||
println!("avx512pf: {:?}", is_x86_feature_detected!("avx512pf"));
|
||||
println!("avx512vaes: {:?}", is_x86_feature_detected!("avx512vaes"));
|
||||
println!("avx512vbmi: {:?}", is_x86_feature_detected!("avx512vbmi"));
|
||||
println!("avx512vbmi2: {:?}", is_x86_feature_detected!("avx512vbmi2"));
|
||||
println!("avx512vl: {:?}", is_x86_feature_detected!("avx512vl"));
|
||||
println!("avx512vnni: {:?}", is_x86_feature_detected!("avx512vnni"));
|
||||
println!("avx512vp2intersect: {:?}", is_x86_feature_detected!("avx512vp2intersect"));
|
||||
println!("avx512vpclmulqdq: {:?}", is_x86_feature_detected!("avx512vpclmulqdq"));
|
||||
println!("avx512vpopcntdq: {:?}", is_x86_feature_detected!("avx512vpopcntdq"));
|
||||
println!("bmi1: {:?}", is_x86_feature_detected!("bmi1"));
|
||||
println!("bmi2: {:?}", is_x86_feature_detected!("bmi2"));
|
||||
println!("cmpxchg16b: {:?}", is_x86_feature_detected!("cmpxchg16b"));
|
||||
println!("f16c: {:?}", is_x86_feature_detected!("f16c"));
|
||||
println!("fma: {:?}", is_x86_feature_detected!("fma"));
|
||||
println!("fxsr: {:?}", is_x86_feature_detected!("fxsr"));
|
||||
println!("lzcnt: {:?}", is_x86_feature_detected!("lzcnt"));
|
||||
//println!("movbe: {:?}", is_x86_feature_detected!("movbe")); // movbe is unsupported as a target feature
|
||||
println!("pclmulqdq: {:?}", is_x86_feature_detected!("pclmulqdq"));
|
||||
println!("popcnt: {:?}", is_x86_feature_detected!("popcnt"));
|
||||
println!("rdrand: {:?}", is_x86_feature_detected!("rdrand"));
|
||||
println!("rdseed: {:?}", is_x86_feature_detected!("rdseed"));
|
||||
println!("tsc: {:?}", is_x86_feature_detected!("tsc"));
|
||||
println!("mmx: {:?}", is_x86_feature_detected!("mmx"));
|
||||
println!("rtm: {:?}", is_x86_feature_detected!("rtm"));
|
||||
println!("sha: {:?}", is_x86_feature_detected!("sha"));
|
||||
println!("sse: {:?}", is_x86_feature_detected!("sse"));
|
||||
println!("sse2: {:?}", is_x86_feature_detected!("sse2"));
|
||||
println!("sse3: {:?}", is_x86_feature_detected!("sse3"));
|
||||
println!("ssse3: {:?}", is_x86_feature_detected!("ssse3"));
|
||||
println!("sse4.1: {:?}", is_x86_feature_detected!("sse4.1"));
|
||||
println!("sse4.2: {:?}", is_x86_feature_detected!("sse4.2"));
|
||||
println!("sse4a: {:?}", is_x86_feature_detected!("sse4a"));
|
||||
println!("sha: {:?}", is_x86_feature_detected!("sha"));
|
||||
println!("avx: {:?}", is_x86_feature_detected!("avx"));
|
||||
println!("avx2: {:?}", is_x86_feature_detected!("avx2"));
|
||||
println!("avx512f {:?}", is_x86_feature_detected!("avx512f"));
|
||||
println!("avx512cd {:?}", is_x86_feature_detected!("avx512cd"));
|
||||
println!("avx512er {:?}", is_x86_feature_detected!("avx512er"));
|
||||
println!("avx512pf {:?}", is_x86_feature_detected!("avx512pf"));
|
||||
println!("avx512bw {:?}", is_x86_feature_detected!("avx512bw"));
|
||||
println!("avx512dq {:?}", is_x86_feature_detected!("avx512dq"));
|
||||
println!("avx512vl {:?}", is_x86_feature_detected!("avx512vl"));
|
||||
println!("avx512_ifma {:?}", is_x86_feature_detected!("avx512ifma"));
|
||||
println!("avx512_vbmi {:?}", is_x86_feature_detected!("avx512vbmi"));
|
||||
println!("avx512_vpopcntdq {:?}", is_x86_feature_detected!("avx512vpopcntdq"));
|
||||
println!("fma: {:?}", is_x86_feature_detected!("fma"));
|
||||
println!("bmi1: {:?}", is_x86_feature_detected!("bmi1"));
|
||||
println!("bmi2: {:?}", is_x86_feature_detected!("bmi2"));
|
||||
println!("abm: {:?}", is_x86_feature_detected!("abm"));
|
||||
println!("lzcnt: {:?}", is_x86_feature_detected!("lzcnt"));
|
||||
println!("ssse3: {:?}", is_x86_feature_detected!("ssse3"));
|
||||
println!("tbm: {:?}", is_x86_feature_detected!("tbm"));
|
||||
println!("popcnt: {:?}", is_x86_feature_detected!("popcnt"));
|
||||
println!("fxsr: {:?}", is_x86_feature_detected!("fxsr"));
|
||||
println!("xsave: {:?}", is_x86_feature_detected!("xsave"));
|
||||
println!("xsavec: {:?}", is_x86_feature_detected!("xsavec"));
|
||||
println!("xsaveopt: {:?}", is_x86_feature_detected!("xsaveopt"));
|
||||
println!("xsaves: {:?}", is_x86_feature_detected!("xsaves"));
|
||||
println!("xsavec: {:?}", is_x86_feature_detected!("xsavec"));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user