summaryrefslogtreecommitdiffstats
path: root/tests/codegen/swap-simd-types.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/codegen/swap-simd-types.rs')
-rw-r--r--tests/codegen/swap-simd-types.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/codegen/swap-simd-types.rs b/tests/codegen/swap-simd-types.rs
new file mode 100644
index 000000000..c90b277eb
--- /dev/null
+++ b/tests/codegen/swap-simd-types.rs
@@ -0,0 +1,32 @@
+// compile-flags: -O -C target-feature=+avx
+// only-x86_64
+// ignore-debug: the debug assertions get in the way
+
+#![crate_type = "lib"]
+
+use std::mem::swap;
+
+// SIMD types are highly-aligned already, so make sure the swap code leaves their
+// types alone and doesn't pessimize them (such as by swapping them as `usize`s).
+extern crate core;
+use core::arch::x86_64::__m256;
+
+// CHECK-LABEL: @swap_single_m256
+#[no_mangle]
+pub fn swap_single_m256(x: &mut __m256, y: &mut __m256) {
+// CHECK-NOT: alloca
+// CHECK: load <8 x float>{{.+}}align 32
+// CHECK: store <8 x float>{{.+}}align 32
+ swap(x, y)
+}
+
+// CHECK-LABEL: @swap_m256_slice
+#[no_mangle]
+pub fn swap_m256_slice(x: &mut [__m256], y: &mut [__m256]) {
+// CHECK-NOT: alloca
+// CHECK: load <8 x float>{{.+}}align 32
+// CHECK: store <8 x float>{{.+}}align 32
+ if x.len() == y.len() {
+ x.swap_with_slice(y);
+ }
+}