|
12 | 12 |
|
13 | 13 | use {Rng};
|
14 | 14 | use distributions::{Distribution, Standard};
|
| 15 | +#[cfg(feature="simd_support")] |
| 16 | +use core::simd::*; |
15 | 17 |
|
16 | 18 | impl Distribution<u8> for Standard {
|
17 | 19 | #[inline]
|
@@ -84,6 +86,39 @@ impl_int_from_uint! { i64, u64 }
|
84 | 86 | #[cfg(feature = "i128_support")] impl_int_from_uint! { i128, u128 }
|
85 | 87 | impl_int_from_uint! { isize, usize }
|
86 | 88 |
|
| 89 | +#[cfg(feature="simd_support")] |
| 90 | +macro_rules! simd_impl { |
| 91 | + ($bits:expr,) => {}; |
| 92 | + ($bits:expr, $ty:ty, $($ty_more:ty,)*) => { |
| 93 | + simd_impl!($bits, $($ty_more,)*); |
| 94 | + |
| 95 | + impl Distribution<$ty> for Standard { |
| 96 | + #[inline] |
| 97 | + fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $ty { |
| 98 | + let mut vec = Default::default(); |
| 99 | + unsafe { |
| 100 | + let ptr = &mut vec; |
| 101 | + let b_ptr = &mut *(ptr as *mut $ty as *mut [u8; $bits/8]); |
| 102 | + rng.fill_bytes(b_ptr); |
| 103 | + } |
| 104 | + vec |
| 105 | + } |
| 106 | + } |
| 107 | + } |
| 108 | +} |
| 109 | + |
| 110 | +#[cfg(feature="simd_support")] |
| 111 | +simd_impl!(16, u8x2, i8x2,); |
| 112 | +#[cfg(feature="simd_support")] |
| 113 | +simd_impl!(32, u8x4, i8x4, u16x2, i16x2,); |
| 114 | +#[cfg(feature="simd_support")] |
| 115 | +simd_impl!(64, u8x8, i8x8, u16x4, i16x4, u32x2, i32x2,); |
| 116 | +#[cfg(feature="simd_support")] |
| 117 | +simd_impl!(128, u8x16, i8x16, u16x8, i16x8, u32x4, i32x4, u64x2, i64x2,); |
| 118 | +#[cfg(feature="simd_support")] |
| 119 | +simd_impl!(256, u8x32, i8x32, u16x16, i16x16, u32x8, i32x8, u64x4, i64x4,); |
| 120 | +#[cfg(feature="simd_support")] |
| 121 | +simd_impl!(512, u8x64, i8x64, u16x32, i16x32, u32x16, i32x16, u64x8, i64x8,); |
87 | 122 |
|
88 | 123 | #[cfg(test)]
|
89 | 124 | mod tests {
|
|
0 commit comments