shift_scalar.rs - source
Description: Source of the Rust file `library/core/src/../../portable-simd/crates/core_simd/src/ops/shift_scalar.rs`.

#
core/portable-simd/crates/core_simd/src/ops/
shift_scalar.rs

    1// Shift operations uniquely typically only have a scalar on the right-hand side.
    2// Here, we implement shifts for scalar RHS arguments.
    3
    4use crate::simd::{LaneCount, Simd, SupportedLaneCount};
    5
    6macro_rules! impl_splatted_shifts {
    7    { impl $trait:ident :: $trait_fn:ident for $ty:ty } => {
    8        impl<const N: usize> core::ops::$trait<$ty> for Simd<$ty, N>
    9        where
    10            LaneCount<N>: SupportedLaneCount,
    11        {
    12            type Output = Self;
    13            #[inline]
    14            fn $trait_fn(self, rhs: $ty) -> Self::Output {
    15                self.$trait_fn(Simd::splat(rhs))
    16            }
    17        }
    18
    19        impl<const N: usize> core::ops::$trait<&$ty> for Simd<$ty, N>
    20        where
    21            LaneCount<N>: SupportedLaneCount,
    22        {
    23            type Output = Self;
    24            #[inline]
    25            fn $trait_fn(self, rhs: &$ty) -> Self::Output {
    26                self.$trait_fn(Simd::splat(*rhs))
    27            }
    28        }
    29
    30        impl<'lhs, const N: usize> core::ops::$trait<$ty> for &'lhs Simd<$ty, N>
    31        where
    32            LaneCount<N>: SupportedLaneCount,
    33        {
    34            type Output = Simd<$ty, N>;
    35            #[inline]
    36            fn $trait_fn(self, rhs: $ty) -> Self::Output {
    37                self.$trait_fn(Simd::splat(rhs))
    38            }
    39        }
    40
    41        impl<'lhs, const N: usize> core::ops::$trait<&$ty> for &'lhs Simd<$ty, N>
    42        where
    43            LaneCount<N>: SupportedLaneCount,
    44        {
    45            type Output = Simd<$ty, N>;
    46            #[inline]
    47            fn $trait_fn(self, rhs: &$ty) -> Self::Output {
    48                self.$trait_fn(Simd::splat(*rhs))
    49            }
    50        }
    51    };
    52    { $($ty:ty),* } => {
    53        $(
    54        impl_splatted_shifts! { impl Shl::shl for $ty }
    55        impl_splatted_shifts! { impl Shr::shr for $ty }
    56        )*
    57    }
    58}
    59
    60// In the past there were inference issues when generically splatting arguments.
    61// Enumerate them instead.
    62impl_splatted_shifts! { i8, i16, i32, i64, isize, u8, u16, u32, u64, usize }