@@ -12,6 +12,10 @@ use {Rng};
1212use distributions:: { Distribution , Standard } ;
1313#[ cfg( feature="simd_support" ) ]
1414use 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:: * ;
1519
1620impl Distribution < u8 > for Standard {
1721 #[ inline]
@@ -86,6 +90,15 @@ impl_int_from_uint! { isize, usize }
8690
8791#[ cfg( feature="simd_support" ) ]
8892macro_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+
89102 ( $bits: expr, ) => { } ;
90103 ( $bits: expr, $ty: ty, $( $ty_more: ty, ) * ) => {
91104 simd_impl!( $bits, $( $ty_more, ) * ) ;
@@ -102,7 +115,7 @@ macro_rules! simd_impl {
102115 vec. to_le( )
103116 }
104117 }
105- }
118+ } ;
106119}
107120
108121#[ cfg( feature="simd_support" ) ]
@@ -117,6 +130,8 @@ simd_impl!(128, u8x16, i8x16, u16x8, i16x8, u32x4, i32x4, u64x2, i64x2,);
117130simd_impl ! ( 256 , u8x32, i8x32, u16x16, i16x16, u32x8, i32x8, u64x4, i64x4, ) ;
118131#[ cfg( feature="simd_support" ) ]
119132simd_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) , ) ;
120135
121136#[ cfg( test) ]
122137mod tests {
0 commit comments