From bdcccba55cddfa2c47ba322efec5dc110865edd1 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Sun, 13 Jun 2021 17:52:44 +0000 Subject: [PATCH] Implement Sum/Product traits --- crates/core_simd/src/iter.rs | 52 ++++++++++++++++++++++++++++++++++++ crates/core_simd/src/lib.rs | 1 + 2 files changed, 53 insertions(+) create mode 100644 crates/core_simd/src/iter.rs diff --git a/crates/core_simd/src/iter.rs b/crates/core_simd/src/iter.rs new file mode 100644 index 000000000000..c49715932b48 --- /dev/null +++ b/crates/core_simd/src/iter.rs @@ -0,0 +1,52 @@ +macro_rules! impl_traits { + { $type:ident, $scalar:ty } => { + impl core::iter::Sum for crate::$type + where + Self: crate::LanesAtMost32, + { + fn sum>(iter: I) -> Self { + iter.fold(Default::default(), core::ops::Add::add) + } + } + + impl core::iter::Product for crate::$type + where + Self: crate::LanesAtMost32, + { + fn product>(iter: I) -> Self { + iter.fold(Default::default(), core::ops::Mul::mul) + } + } + + impl core::iter::Sum> for $scalar + where + crate::$type: crate::LanesAtMost32, + { + fn sum>>(iter: I) -> Self { + iter.sum::>().horizontal_sum() + } + } + + impl core::iter::Product> for $scalar + where + crate::$type: crate::LanesAtMost32, + { + fn product>>(iter: I) -> Self { + iter.product::>().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 7fe7d666e8d8..5b74d1d574a6 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;