| // |
| //@ compile-flags: -C no-prepopulate-passes |
| // 32bit MSVC does not align things properly so we suppress high alignment annotations (#112480) |
| //@ ignore-i686-pc-windows-msvc |
| //@ ignore-i686-pc-windows-gnu |
| |
| #![crate_type = "lib"] |
| #![allow(non_camel_case_types)] |
| #![feature(repr_simd, core_intrinsics)] |
| |
| #[path = "../../auxiliary/minisimd.rs"] |
| mod minisimd; |
| use minisimd::*; |
| |
| pub type S<const N: usize> = Simd<f32, N>; |
| pub type T = Simd<f32, 4>; |
| |
| // CHECK-LABEL: @array_align( |
| #[no_mangle] |
| pub fn array_align() -> usize { |
| // CHECK: ret [[USIZE:i[0-9]+]] [[ARRAY_ALIGN:[0-9]+]] |
| const { std::mem::align_of::<f32>() } |
| } |
| |
| // CHECK-LABEL: @vector_align( |
| #[no_mangle] |
| pub fn vector_align() -> usize { |
| // CHECK: ret [[USIZE]] [[VECTOR_ALIGN:[0-9]+]] |
| const { std::mem::align_of::<T>() } |
| } |
| |
| // CHECK-LABEL: @build_array_s |
| #[no_mangle] |
| pub fn build_array_s(x: [f32; 4]) -> S<4> { |
| // CHECK: call void @llvm.memcpy.{{.+}}({{.*}} align [[VECTOR_ALIGN]] {{.*}} align [[ARRAY_ALIGN]] {{.*}}, [[USIZE]] 16, i1 false) |
| Simd(x) |
| } |
| |
| // CHECK-LABEL: @build_array_transmute_s |
| #[no_mangle] |
| pub fn build_array_transmute_s(x: [f32; 4]) -> S<4> { |
| // CHECK: call void @llvm.memcpy.{{.+}}({{.*}} align [[VECTOR_ALIGN]] {{.*}} align [[ARRAY_ALIGN]] {{.*}}, [[USIZE]] 16, i1 false) |
| unsafe { std::mem::transmute(x) } |
| } |
| |
| // CHECK-LABEL: @build_array_t |
| #[no_mangle] |
| pub fn build_array_t(x: [f32; 4]) -> T { |
| // CHECK: call void @llvm.memcpy.{{.+}}({{.*}} align [[VECTOR_ALIGN]] {{.*}} align [[ARRAY_ALIGN]] {{.*}}, [[USIZE]] 16, i1 false) |
| Simd(x) |
| } |
| |
| // CHECK-LABEL: @build_array_transmute_t |
| #[no_mangle] |
| pub fn build_array_transmute_t(x: [f32; 4]) -> T { |
| // CHECK: call void @llvm.memcpy.{{.+}}({{.*}} align [[VECTOR_ALIGN]] {{.*}} align [[ARRAY_ALIGN]] {{.*}}, [[USIZE]] 16, i1 false) |
| unsafe { std::mem::transmute(x) } |
| } |