Skip to content

Commit 31b437a

Browse files
authored
Merge pull request #630 from TheIronBorn/patch-8
add SIMD intrinsic distributions
2 parents 0911a4e + cb7aed9 commit 31b437a

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

src/distributions/integer.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ use {Rng};
1212
use distributions::{Distribution, Standard};
1313
#[cfg(feature="simd_support")]
1414
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::*;
1519

1620
impl Distribution<u8> for Standard {
1721
#[inline]
@@ -86,6 +90,15 @@ impl_int_from_uint! { isize, usize }
8690

8791
#[cfg(feature="simd_support")]
8892
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+
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,);
117130
simd_impl!(256, u8x32, i8x32, u16x16, i16x16, u32x8, i32x8, u64x4, i64x4,);
118131
#[cfg(feature="simd_support")]
119132
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),);
120135

121136
#[cfg(test)]
122137
mod tests {

0 commit comments

Comments
 (0)