//@ 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() { use std::mem; assert_eq!(mem::size_of::>(), mem::size_of::<[T; N]>()); assert_eq!(mem::size_of::>() % mem::align_of::>(), 0); } fn check_ty() { check_size_align::(); check_size_align::(); check_size_align::(); check_size_align::(); check_size_align::(); check_size_align::(); check_size_align::(); } fn main() { check_ty::(); check_ty::(); check_ty::(); check_ty::(); check_ty::(); check_ty::(); check_ty::(); unsafe { // powers-of-two have no padding and have the same layout as #[repr(simd)] let x: PackedSimd = simd_add( PackedSimd::([0., 1., 2., 3.]), PackedSimd::([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 = simd_add( PackedSimd::([0., 1., 2.]), PackedSimd::([2., 2., 2.]), ); let arr: [f64; 3] = x.into_array(); assert_eq!(arr, [2., 3., 4.]); } }