File tree Expand file tree Collapse file tree 1 file changed +30
-0
lines changed
Expand file tree Collapse file tree 1 file changed +30
-0
lines changed Original file line number Diff line number Diff line change 1+ #![ crate_type = "lib" ]
2+ #![ feature( repr_simd, platform_intrinsics) ]
3+
4+ #[ repr( simd, packed) ]
5+ pub struct Simd < T , const N : usize > ( [ T ; N ] ) ;
6+
7+ #[ repr( simd) ]
8+ #[ derive( Copy , Clone ) ]
9+ pub struct FullSimd < T , const N : usize > ( [ T ; N ] ) ;
10+
11+ extern "platform-intrinsic" {
12+ fn simd_mul < T > ( a : T , b : T ) -> T ;
13+ }
14+
15+ // non-powers-of-two have padding and need to be expanded to full vectors
16+ fn load < T , const N : usize > ( v : Simd < T , N > ) -> FullSimd < T , N > {
17+ unsafe {
18+ let mut tmp = core:: mem:: MaybeUninit :: < FullSimd < T , N > > :: uninit ( ) ;
19+ std:: ptr:: copy_nonoverlapping ( & v as * const _ , tmp. as_mut_ptr ( ) . cast ( ) , 1 ) ;
20+ tmp. assume_init ( )
21+ }
22+ }
23+
24+ // CHECK-LABEL: @square_packed
25+ #[ no_mangle]
26+ pub fn square_packed ( x : Simd < f32 , 3 > ) -> FullSimd < f32 , 3 > {
27+ // CHECK: load <3 x float>, ptr %x, align 4
28+ let x = load ( x) ;
29+ unsafe { simd_mul ( x, x) }
30+ }
You can’t perform that action at this time.
0 commit comments