diff options
Diffstat (limited to 'tests/assembly-llvm/libs')
| -rw-r--r-- | tests/assembly-llvm/libs/issue-115339-zip-arrays.rs | 25 | ||||
| -rw-r--r-- | tests/assembly-llvm/libs/issue-140207-slice-min-simd.rs | 13 | 
2 files changed, 38 insertions, 0 deletions
| diff --git a/tests/assembly-llvm/libs/issue-115339-zip-arrays.rs b/tests/assembly-llvm/libs/issue-115339-zip-arrays.rs new file mode 100644 index 00000000000..098382502e8 --- /dev/null +++ b/tests/assembly-llvm/libs/issue-115339-zip-arrays.rs @@ -0,0 +1,25 @@ +//@ assembly-output: emit-asm +// # zen3 previously exhibited odd vectorization +//@ compile-flags: --crate-type=lib -Ctarget-cpu=znver3 -Copt-level=3 +//@ only-x86_64 +//@ ignore-sgx + +use std::iter; + +// previously this produced a long chain of +// 56: vpextrb $6, %xmm0, %ecx +// 57: orb %cl, 22(%rsi) +// 58: vpextrb $7, %xmm0, %ecx +// 59: orb %cl, 23(%rsi) +// [...] + +// CHECK-LABEL: zip_arrays: +#[no_mangle] +pub fn zip_arrays(mut a: [u8; 32], b: [u8; 32]) -> [u8; 32] { + // CHECK-NOT: vpextrb + // CHECK-NOT: orb %cl + // CHECK: vorps + iter::zip(&mut a, b).for_each(|(a, b)| *a |= b); + // CHECK: retq + a +} diff --git a/tests/assembly-llvm/libs/issue-140207-slice-min-simd.rs b/tests/assembly-llvm/libs/issue-140207-slice-min-simd.rs new file mode 100644 index 00000000000..86f067cac08 --- /dev/null +++ b/tests/assembly-llvm/libs/issue-140207-slice-min-simd.rs @@ -0,0 +1,13 @@ +//@ assembly-output: emit-asm +// # avx has a dedicated instruction for this +//@ compile-flags: --crate-type=lib -Ctarget-cpu=znver2 -Copt-level=3 +//@ only-x86_64 +//@ ignore-sgx +// https://github.com/rust-lang/rust/issues/140207 + +#[unsafe(no_mangle)] +pub fn array_min(a: &[u16; 8]) -> u16 { + // CHECK: vphminposuw + // CHECK: ret + a.iter().copied().min().unwrap() +} | 
