@@ -12,6 +12,10 @@ use {Rng};
12
12
use distributions:: { Distribution , Standard } ;
13
13
#[ cfg( feature="simd_support" ) ]
14
14
use packed_simd:: * ;
15
+ #[ cfg( all( target_arch = "x86" , feature="nightly" ) ) ]
16
+ use core:: arch:: x86:: * ;
17
+ #[ cfg( all( target_arch = "x86_64" , feature="nightly" ) ) ]
18
+ use core:: arch:: x86_64:: * ;
15
19
16
20
impl Distribution < u8 > for Standard {
17
21
#[ inline]
@@ -86,6 +90,15 @@ impl_int_from_uint! { isize, usize }
86
90
87
91
#[ cfg( feature="simd_support" ) ]
88
92
macro_rules! simd_impl {
93
+ ( $( ( $intrinsic: ident, $vec: ty) , ) +) => { $(
94
+ impl Distribution <$intrinsic> for Standard {
95
+ #[ inline]
96
+ fn sample<R : Rng + ?Sized >( & self , rng: & mut R ) -> $intrinsic {
97
+ $intrinsic:: from_bits( rng. gen :: <$vec>( ) )
98
+ }
99
+ }
100
+ ) +} ;
101
+
89
102
( $bits: expr, ) => { } ;
90
103
( $bits: expr, $ty: ty, $( $ty_more: ty, ) * ) => {
91
104
simd_impl!( $bits, $( $ty_more, ) * ) ;
@@ -102,7 +115,7 @@ macro_rules! simd_impl {
102
115
vec. to_le( )
103
116
}
104
117
}
105
- }
118
+ } ;
106
119
}
107
120
108
121
#[ cfg( feature="simd_support" ) ]
@@ -117,6 +130,8 @@ simd_impl!(128, u8x16, i8x16, u16x8, i16x8, u32x4, i32x4, u64x2, i64x2,);
117
130
simd_impl ! ( 256 , u8x32, i8x32, u16x16, i16x16, u32x8, i32x8, u64x4, i64x4, ) ;
118
131
#[ cfg( feature="simd_support" ) ]
119
132
simd_impl ! ( 512 , u8x64, i8x64, u16x32, i16x32, u32x16, i32x16, u64x8, i64x8, ) ;
133
+ #[ cfg( all( feature="simd_support" , feature="nightly" , any( target_arch="x86" , target_arch="x86_64" ) ) ) ]
134
+ simd_impl ! ( ( __m64, u8x8) , ( __m128i, u8x16) , ( __m256i, u8x32) , ) ;
120
135
121
136
#[ cfg( test) ]
122
137
mod tests {
0 commit comments