diff --git a/tests/assembly/aarch64-simd-mask-reduce.rs b/tests/assembly/aarch64-simd-mask-reduce.rs new file mode 100644 index 0000000000000..cce2c3042921b --- /dev/null +++ b/tests/assembly/aarch64-simd-mask-reduce.rs @@ -0,0 +1,33 @@ +// verify that simd mask reductions do not introduce additional bit shift operations + +// assembly-output: emit-asm +// compile-flags: --crate-type=lib -O --target aarch64-unknown-linux-gnu +// needs-llvm-components: aarch64 +// only-aarch64 +// only-linux + +#![feature(repr_simd, platform_intrinsics)] +#![allow(non_camel_case_types)] + +#[repr(simd)] +#[derive(Copy, Clone)] +pub struct mask8x16([i8; 16]); + +extern "platform-intrinsic" { + fn simd_reduce_all(x: T) -> bool; + fn simd_reduce_any(x: T) -> bool; +} + +// CHECK-LABEL: mask_reduce_all: +#[no_mangle] +pub unsafe fn mask_reduce_all(m: mask8x16) -> bool { + // CHECK: umaxv + simd_reduce_all(m) +} + +// CHECK-LABEL: mask_reduce_any: +#[no_mangle] +pub unsafe fn mask_reduce_any(m: mask8x16) -> bool { + // CHECK: umaxv + simd_reduce_any(m) +} diff --git a/tests/assembly/x86_64-simd-mask-reduce.rs b/tests/assembly/x86_64-simd-mask-reduce.rs new file mode 100644 index 0000000000000..354d0d353bb73 --- /dev/null +++ b/tests/assembly/x86_64-simd-mask-reduce.rs @@ -0,0 +1,33 @@ +// verify that simd mask reductions do not introduce additional bit shift operations + +// assembly-output: emit-asm +// compile-flags: --crate-type=lib -O -C llvm-args=-x86-asm-syntax=intel +// only-x86_64 + +#![feature(repr_simd, platform_intrinsics)] +#![allow(non_camel_case_types)] + +#[repr(simd)] +#[derive(Copy, Clone)] +pub struct mask8x16([i8; 16]); + +extern "platform-intrinsic" { + fn simd_reduce_all(x: T) -> bool; + fn simd_reduce_any(x: T) -> bool; +} + +// CHECK-LABEL: mask_reduce_all: +#[no_mangle] +pub unsafe fn mask_reduce_all(m: mask8x16) -> bool { + // CHECK-NOT: psllw + // CHECK: pmovmskb + simd_reduce_all(m) +} + +// CHECK-LABEL: mask_reduce_any: +#[no_mangle] +pub unsafe fn mask_reduce_any(m: mask8x16) -> bool { + // CHECK-NOT: psllw + // CHECK: pmovmskb + simd_reduce_any(m) +}