diff options
| author | Caleb Zulawski <caleb.zulawski@gmail.com> | 2021-06-13 17:52:44 +0000 |
|---|---|---|
| committer | Caleb Zulawski <caleb.zulawski@gmail.com> | 2021-06-13 17:52:44 +0000 |
| commit | bdcccba55cddfa2c47ba322efec5dc110865edd1 (patch) | |
| tree | 74f4675c5173b61f80cdad867ef96c92501574fd | |
| parent | 57e67c905fe9fb3d45a1714d25baa5dfc143299c (diff) | |
| download | rust-bdcccba55cddfa2c47ba322efec5dc110865edd1.tar.gz rust-bdcccba55cddfa2c47ba322efec5dc110865edd1.zip | |
Implement Sum/Product traits
| -rw-r--r-- | crates/core_simd/src/iter.rs | 52 | ||||
| -rw-r--r-- | crates/core_simd/src/lib.rs | 1 |
2 files changed, 53 insertions, 0 deletions
diff --git a/crates/core_simd/src/iter.rs b/crates/core_simd/src/iter.rs new file mode 100644 index 00000000000..c49715932b4 --- /dev/null +++ b/crates/core_simd/src/iter.rs @@ -0,0 +1,52 @@ +macro_rules! impl_traits { + { $type:ident, $scalar:ty } => { + impl<const LANES: usize> core::iter::Sum<Self> for crate::$type<LANES> + where + Self: crate::LanesAtMost32, + { + fn sum<I: core::iter::Iterator<Item = Self>>(iter: I) -> Self { + iter.fold(Default::default(), core::ops::Add::add) + } + } + + impl<const LANES: usize> core::iter::Product<Self> for crate::$type<LANES> + where + Self: crate::LanesAtMost32, + { + fn product<I: core::iter::Iterator<Item = Self>>(iter: I) -> Self { + iter.fold(Default::default(), core::ops::Mul::mul) + } + } + + impl<const LANES: usize> core::iter::Sum<crate::$type<LANES>> for $scalar + where + crate::$type<LANES>: crate::LanesAtMost32, + { + fn sum<I: core::iter::Iterator<Item = crate::$type<LANES>>>(iter: I) -> Self { + iter.sum::<crate::$type<LANES>>().horizontal_sum() + } + } + + impl<const LANES: usize> core::iter::Product<crate::$type<LANES>> for $scalar + where + crate::$type<LANES>: crate::LanesAtMost32, + { + fn product<I: core::iter::Iterator<Item = crate::$type<LANES>>>(iter: I) -> Self { + iter.product::<crate::$type<LANES>>().horizontal_product() + } + } + } +} + +impl_traits! { SimdF32, f32 } +impl_traits! { SimdF64, f64 } +impl_traits! { SimdU8, u8 } +impl_traits! { SimdU16, u16 } +impl_traits! { SimdU32, u32 } +impl_traits! { SimdU64, u64 } +impl_traits! { SimdUsize, usize } +impl_traits! { SimdI8, i8 } +impl_traits! { SimdI16, i16 } +impl_traits! { SimdI32, i32 } +impl_traits! { SimdI64, i64 } +impl_traits! { SimdIsize, isize } diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index 7fe7d666e8d..5b74d1d574a 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -22,6 +22,7 @@ pub use to_bytes::ToBytes; mod comparisons; mod fmt; mod intrinsics; +mod iter; mod ops; mod round; |
