about summary refs log tree commit diff
path: root/tests/codegen-llvm/autovectorize-f32x4.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/codegen-llvm/autovectorize-f32x4.rs')
-rw-r--r--tests/codegen-llvm/autovectorize-f32x4.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/codegen-llvm/autovectorize-f32x4.rs b/tests/codegen-llvm/autovectorize-f32x4.rs
new file mode 100644
index 00000000000..254362842f9
--- /dev/null
+++ b/tests/codegen-llvm/autovectorize-f32x4.rs
@@ -0,0 +1,37 @@
+//@ compile-flags: -C opt-level=3 -Z merge-functions=disabled
+//@ only-x86_64
+#![crate_type = "lib"]
+
+// CHECK-LABEL: @auto_vectorize_direct
+#[no_mangle]
+pub fn auto_vectorize_direct(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
+    // CHECK: load <4 x float>
+    // CHECK: load <4 x float>
+    // CHECK: fadd <4 x float>
+    // CHECK: store <4 x float>
+    [a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3]]
+}
+
+// CHECK-LABEL: @auto_vectorize_loop
+#[no_mangle]
+pub fn auto_vectorize_loop(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
+    // CHECK: load <4 x float>
+    // CHECK: load <4 x float>
+    // CHECK: fadd <4 x float>
+    // CHECK: store <4 x float>
+    let mut c = [0.0; 4];
+    for i in 0..4 {
+        c[i] = a[i] + b[i];
+    }
+    c
+}
+
+// CHECK-LABEL: @auto_vectorize_array_from_fn
+#[no_mangle]
+pub fn auto_vectorize_array_from_fn(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
+    // CHECK: load <4 x float>
+    // CHECK: load <4 x float>
+    // CHECK: fadd <4 x float>
+    // CHECK: store <4 x float>
+    std::array::from_fn(|i| a[i] + b[i])
+}