Skip to content

Commit 4a5c0b6

Browse files
committed
Rework SIMD level handling in tests
1 parent 4842b8b commit 4a5c0b6

File tree

2 files changed

+44
-16
lines changed
  • fearless_simd_dev_macros/src
  • fearless_simd_tests/tests

2 files changed

+44
-16
lines changed

fearless_simd_dev_macros/src/lib.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,20 @@ pub fn simd_test(_: TokenStream, item: TokenStream) -> TokenStream {
5252
// proc macros are evaluated.
5353

5454
// There is currently no way to conditionally ignore a test at runtime (see
55-
// https://internals.rust-lang.org/t/pre-rfc-skippable-tests/14611). Instead, we have to assert that these CPU
56-
// features are always detected and fail the test if they aren't.
55+
// https://internals.rust-lang.org/t/pre-rfc-skippable-tests/14611). Instead, we'll just pass the tests if the
56+
// target features aren't supported. This is not ideal, since it may mislead you into thinking tests have passed
57+
// when they haven't even been run, but some CI runners don't support all target features and we don't want failures
58+
// as a result of that.
5759

5860
let neon_snippet = quote! {
5961
#[cfg(target_arch = "aarch64")]
6062
#[test]
6163
#ignore_neon
6264
fn #neon_name() {
63-
assert!(std::arch::is_aarch64_feature_detected!("neon"));
64-
65-
let neon = unsafe { fearless_simd::aarch64::Neon::new_unchecked() };
66-
#input_fn_name(neon);
65+
if std::arch::is_aarch64_feature_detected!("neon") {
66+
let neon = unsafe { fearless_simd::aarch64::Neon::new_unchecked() };
67+
#input_fn_name(neon);
68+
}
6769
}
6870
};
6971

@@ -72,10 +74,10 @@ pub fn simd_test(_: TokenStream, item: TokenStream) -> TokenStream {
7274
#[test]
7375
#ignore_sse4
7476
fn #sse4_name() {
75-
assert!(std::arch::is_x86_feature_detected!("sse4.2"));
76-
77-
let sse4 = unsafe { fearless_simd::x86::Sse4_2::new_unchecked() };
78-
#input_fn_name(sse4);
77+
if std::arch::is_x86_feature_detected!("sse4.2") {
78+
let sse4 = unsafe { fearless_simd::x86::Sse4_2::new_unchecked() };
79+
#input_fn_name(sse4);
80+
}
7981
}
8082
};
8183

@@ -84,13 +86,12 @@ pub fn simd_test(_: TokenStream, item: TokenStream) -> TokenStream {
8486
#[test]
8587
#ignore_avx2
8688
fn #avx2_name() {
87-
assert!(
88-
std::arch::is_x86_feature_detected!("avx2")
89+
if std::arch::is_x86_feature_detected!("avx2")
8990
&& std::arch::is_x86_feature_detected!("fma")
90-
);
91-
92-
let avx2 = unsafe { fearless_simd::x86::Avx2::new_unchecked() };
93-
#input_fn_name(avx2);
91+
{
92+
let avx2 = unsafe { fearless_simd::x86::Avx2::new_unchecked() };
93+
#input_fn_name(avx2);
94+
}
9495
}
9596
};
9697

fearless_simd_tests/tests/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,30 @@ fn saturate_float_to_int<S: Simd>(simd: S) {
3737
fn generic_cast<S: Simd>(x: S::f32s) -> S::u32s {
3838
x.to_int()
3939
}
40+
41+
#[test]
42+
fn supports_highest_level() {
43+
// When running tests locally, ensure that every SIMD level to be tested is actually supported. The tests themselves
44+
// will return early and pass if run with an unsupported SIMD level.
45+
//
46+
// We skip this on CI because some runners may not support all SIMD levels--in particular, the macOS x86_64 runner
47+
// doesn't support AVX2.
48+
if std::env::var_os("CI").is_none() {
49+
let level = Level::new();
50+
51+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
52+
assert!(
53+
level.as_avx2().is_some(),
54+
"This machine supports AVX2 and below"
55+
);
56+
57+
#[cfg(target_arch = "aarch64")]
58+
assert!(level.as_neon().is_some(), "This machine supports NEON");
59+
60+
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
61+
assert!(
62+
level.as_wasm_simd128().is_some(),
63+
"This environment supports WASM SIMD128"
64+
);
65+
}
66+
}

0 commit comments

Comments
 (0)