Enable AArch64 processor feature detection unconditionally (#4034)

std::arch::is_aarch64_feature_detected!() is now part of stable
Rust, so we can always use it.

Copyright (c) 2022, Arm Limited.
This commit is contained in:
Anton Kirilov
2022-04-28 15:27:32 +01:00
committed by GitHub
parent b69fede72f
commit a1e4b4b521
4 changed files with 43 additions and 18 deletions

View File

@@ -62,7 +62,7 @@ jobs:
submodules: true submodules: true
- uses: ./.github/actions/install-rust - uses: ./.github/actions/install-rust
with: with:
toolchain: nightly-2021-12-15 toolchain: nightly-2022-04-27
# Build C API documentation # Build C API documentation
- run: sudo apt-get update -y && sudo apt-get install -y libclang1-9 libclang-cpp9 - run: sudo apt-get update -y && sudo apt-get install -y libclang1-9 libclang-cpp9
@@ -178,7 +178,7 @@ jobs:
# flags to rustc. # flags to rustc.
- uses: ./.github/actions/install-rust - uses: ./.github/actions/install-rust
with: with:
toolchain: nightly-2021-12-15 toolchain: nightly-2022-04-27
- run: cargo install cargo-fuzz --vers "^0.11" - run: cargo install cargo-fuzz --vers "^0.11"
# Install OCaml packages necessary for 'differential_spec' fuzz target. # Install OCaml packages necessary for 'differential_spec' fuzz target.
- run: sudo apt install -y ocaml-nox ocamlbuild ocaml-findlib libzarith-ocaml-dev - run: sudo apt install -y ocaml-nox ocamlbuild ocaml-findlib libzarith-ocaml-dev

View File

@@ -105,8 +105,7 @@ pub fn builder_with_options(infer_native_flags: bool) -> Result<isa::Builder, &'
} }
} }
// `stdsimd` is necessary for std::is_aarch64_feature_detected!(). #[cfg(target_arch = "aarch64")]
#[cfg(all(target_arch = "aarch64", feature = "stdsimd"))]
{ {
use cranelift_codegen::settings::Configurable; use cranelift_codegen::settings::Configurable;
@@ -114,7 +113,7 @@ pub fn builder_with_options(infer_native_flags: bool) -> Result<isa::Builder, &'
return Ok(isa_builder); return Ok(isa_builder);
} }
if std::is_aarch64_feature_detected!("lse") { if std::arch::is_aarch64_feature_detected!("lse") {
isa_builder.enable("has_lse").unwrap(); isa_builder.enable("has_lse").unwrap();
} }
} }

View File

@@ -702,7 +702,7 @@ impl<'a> Arbitrary<'a> for CodegenSettings {
// print a warning and return an error because this fuzz // print a warning and return an error because this fuzz
// input must be discarded. // input must be discarded.
#[cfg(target_arch = $arch)] #[cfg(target_arch = $arch)]
if enable && !std::$test!($std) { if enable && !std::arch::$test!($std) {
log::warn!("want to enable clif `{}` but host doesn't support it", log::warn!("want to enable clif `{}` but host doesn't support it",
$clif); $clif);
return Err(arbitrary::Error::EmptyChoose) return Err(arbitrary::Error::EmptyChoose)
@@ -752,6 +752,11 @@ impl<'a> Arbitrary<'a> for CodegenSettings {
std:"avx512vl" => clif:"has_avx512vl" ratio: 1 in 1000, std:"avx512vl" => clif:"has_avx512vl" ratio: 1 in 1000,
std:"avx512vbmi" => clif:"has_avx512vbmi" ratio: 1 in 1000, std:"avx512vbmi" => clif:"has_avx512vbmi" ratio: 1 in 1000,
}, },
"aarch64" => {
test: is_aarch64_feature_detected,
std: "lse" => clif: "has_lse",
},
}; };
return Ok(CodegenSettings::Target { return Ok(CodegenSettings::Target {
target: target_lexicon::Triple::host().to_string(), target: target_lexicon::Triple::host().to_string(),

View File

@@ -388,9 +388,23 @@ impl Engine {
)) ))
} }
} }
let enabled;
#[cfg(target_arch = "aarch64")]
{
enabled = match flag {
"has_lse" => Some(std::arch::is_aarch64_feature_detected!("lse")),
// fall through to the very bottom to indicate that support is
// not enabled to test whether this feature is enabled on the
// host.
_ => None,
};
}
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
{ {
let enabled = match flag { enabled = match flag {
"has_sse3" => Some(std::is_x86_feature_detected!("sse3")), "has_sse3" => Some(std::is_x86_feature_detected!("sse3")),
"has_ssse3" => Some(std::is_x86_feature_detected!("ssse3")), "has_ssse3" => Some(std::is_x86_feature_detected!("ssse3")),
"has_sse41" => Some(std::is_x86_feature_detected!("sse4.1")), "has_sse41" => Some(std::is_x86_feature_detected!("sse4.1")),
@@ -412,18 +426,25 @@ impl Engine {
// host. // host.
_ => None, _ => None,
}; };
}
#[cfg(not(any(target_arch = "aarch64", target_arch = "x86_64")))]
{
enabled = None;
}
match enabled { match enabled {
Some(true) => return Ok(()), Some(true) => return Ok(()),
Some(false) => { Some(false) => {
return Err(format!( return Err(format!(
"compilation setting {:?} is enabled but not available on the host", "compilation setting {:?} is enabled, but not available on the host",
flag flag
)) ))
} }
// fall through // fall through
None => {} None => {}
} }
}
Err(format!( Err(format!(
"cannot test if target-specific flag {:?} is available at runtime", "cannot test if target-specific flag {:?} is available at runtime",
flag flag