| //@ ignore-backends: gcc |
| //@ run-pass |
| |
| #![feature(repr_simd, core_intrinsics)] |
| #![allow(non_camel_case_types)] |
| |
| #[path = "../../auxiliary/minisimd.rs"] |
| mod minisimd; |
| use minisimd::*; |
| |
| use std::intrinsics::simd::simd_add; |
| |
| fn check_size_align<T, const N: usize>() { |
| use std::mem; |
| assert_eq!(mem::size_of::<PackedSimd<T, N>>(), mem::size_of::<[T; N]>()); |
| assert_eq!(mem::size_of::<PackedSimd<T, N>>() % mem::align_of::<PackedSimd<T, N>>(), 0); |
| } |
| |
| fn check_ty<T>() { |
| check_size_align::<T, 1>(); |
| check_size_align::<T, 2>(); |
| check_size_align::<T, 3>(); |
| check_size_align::<T, 4>(); |
| check_size_align::<T, 8>(); |
| check_size_align::<T, 9>(); |
| check_size_align::<T, 15>(); |
| } |
| |
| fn main() { |
| check_ty::<u8>(); |
| check_ty::<i16>(); |
| check_ty::<u32>(); |
| check_ty::<i64>(); |
| check_ty::<usize>(); |
| check_ty::<f32>(); |
| check_ty::<f64>(); |
| |
| unsafe { |
| // powers-of-two have no padding and have the same layout as #[repr(simd)] |
| let x: PackedSimd<f64, 4> = |
| simd_add( |
| PackedSimd::<f64, 4>([0., 1., 2., 3.]), |
| PackedSimd::<f64, 4>([2., 2., 2., 2.]), |
| ); |
| assert_eq!(x.into_array(), [2., 3., 4., 5.]); |
| |
| // non-powers-of-two should have padding (which is removed by #[repr(packed)]), |
| // but the intrinsic handles it |
| let x: PackedSimd<f64, 3> = |
| simd_add( |
| PackedSimd::<f64, 3>([0., 1., 2.]), |
| PackedSimd::<f64, 3>([2., 2., 2.]), |
| ); |
| let arr: [f64; 3] = x.into_array(); |
| assert_eq!(arr, [2., 3., 4.]); |
| } |
| } |