Add scalar shifts
This commit is contained in:
parent
7c7dbe0c50
commit
927139d1e7
@ -6,6 +6,7 @@
|
||||
|
||||
mod assign;
|
||||
mod deref;
|
||||
mod shift_scalar;
|
||||
mod unary;
|
||||
|
||||
impl<I, T, const LANES: usize> core::ops::Index<I> for Simd<T, LANES>
|
||||
|
58
crates/core_simd/src/ops/shift_scalar.rs
Normal file
58
crates/core_simd/src/ops/shift_scalar.rs
Normal file
@ -0,0 +1,58 @@
|
||||
// Shift operations uniquely typically only have a scalar on the right-hand side.
|
||||
// Here, we implement shifts for scalar RHS arguments.
|
||||
|
||||
use crate::simd::{LaneCount, Simd, SupportedLaneCount};
|
||||
|
||||
macro_rules! impl_splatted_shifts {
|
||||
{ impl $trait:ident :: $trait_fn:ident for $ty:ty } => {
|
||||
impl<const N: usize> core::ops::$trait<$ty> for Simd<$ty, N>
|
||||
where
|
||||
LaneCount<N>: SupportedLaneCount,
|
||||
{
|
||||
type Output = Self;
|
||||
fn $trait_fn(self, rhs: $ty) -> Self::Output {
|
||||
self.$trait_fn(Simd::splat(rhs))
|
||||
}
|
||||
}
|
||||
|
||||
impl<const N: usize> core::ops::$trait<&$ty> for Simd<$ty, N>
|
||||
where
|
||||
LaneCount<N>: SupportedLaneCount,
|
||||
{
|
||||
type Output = Self;
|
||||
fn $trait_fn(self, rhs: &$ty) -> Self::Output {
|
||||
self.$trait_fn(Simd::splat(*rhs))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'lhs, const N: usize> core::ops::$trait<$ty> for &'lhs Simd<$ty, N>
|
||||
where
|
||||
LaneCount<N>: SupportedLaneCount,
|
||||
{
|
||||
type Output = Simd<$ty, N>;
|
||||
fn $trait_fn(self, rhs: $ty) -> Self::Output {
|
||||
self.$trait_fn(Simd::splat(rhs))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'lhs, const N: usize> core::ops::$trait<&$ty> for &'lhs Simd<$ty, N>
|
||||
where
|
||||
LaneCount<N>: SupportedLaneCount,
|
||||
{
|
||||
type Output = Simd<$ty, N>;
|
||||
fn $trait_fn(self, rhs: &$ty) -> Self::Output {
|
||||
self.$trait_fn(Simd::splat(*rhs))
|
||||
}
|
||||
}
|
||||
};
|
||||
{ $($ty:ty),* } => {
|
||||
$(
|
||||
impl_splatted_shifts! { impl Shl::shl for $ty }
|
||||
impl_splatted_shifts! { impl Shr::shr for $ty }
|
||||
)*
|
||||
}
|
||||
}
|
||||
|
||||
// In the past there were inference issues when generically splatting arguments.
|
||||
// Enumerate them instead.
|
||||
impl_splatted_shifts! { i8, i16, i32, i64, isize, u8, u16, u32, u64, usize }
|
Loading…
Reference in New Issue
Block a user