Skip to content

Commit 38b9a29

Browse files
committed
Implement Standard for SIMD integer types
1 parent f792e48 commit 38b9a29

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

src/distributions/integer.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
1313
use {Rng};
1414
use distributions::{Distribution, Standard};
15+
#[cfg(feature="simd_support")]
16+
use core::simd::*;
1517

1618
impl Distribution<u8> for Standard {
1719
#[inline]
@@ -84,6 +86,39 @@ impl_int_from_uint! { i64, u64 }
8486
#[cfg(feature = "i128_support")] impl_int_from_uint! { i128, u128 }
8587
impl_int_from_uint! { isize, usize }
8688

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,);
87122

88123
#[cfg(test)]
89124
mod tests {

0 commit comments

Comments
 (0)