core/portable-simd/crates/core_simd/src/ops/
unary.rs

1use crate::simd::{LaneCount, Simd, SimdElement, SupportedLaneCount};
2use core::ops::{Neg, Not}; // unary ops
3
4macro_rules! neg {
5    ($(impl<const N: usize> Neg for Simd<$scalar:ty, N>)*) => {
6        $(impl<const N: usize> Neg for Simd<$scalar, N>
7        where
8            $scalar: SimdElement,
9            LaneCount<N>: SupportedLaneCount,
10        {
11            type Output = Self;
12
13            #[inline]
14            fn neg(self) -> Self::Output {
15                // Safety: `self` is a signed vector
16                unsafe { core::intrinsics::simd::simd_neg(self) }
17            }
18        })*
19    }
20}
21
22neg! {
23    impl<const N: usize> Neg for Simd<f32, N>
24
25    impl<const N: usize> Neg for Simd<f64, N>
26
27    impl<const N: usize> Neg for Simd<i8, N>
28
29    impl<const N: usize> Neg for Simd<i16, N>
30
31    impl<const N: usize> Neg for Simd<i32, N>
32
33    impl<const N: usize> Neg for Simd<i64, N>
34
35    impl<const N: usize> Neg for Simd<isize, N>
36}
37
38macro_rules! not {
39    ($(impl<const N: usize> Not for Simd<$scalar:ty, N>)*) => {
40        $(impl<const N: usize> Not for Simd<$scalar, N>
41        where
42            $scalar: SimdElement,
43            LaneCount<N>: SupportedLaneCount,
44        {
45            type Output = Self;
46
47            #[inline]
48            fn not(self) -> Self::Output {
49                self ^ (Simd::splat(!(0 as $scalar)))
50            }
51        })*
52    }
53}
54
55not! {
56    impl<const N: usize> Not for Simd<i8, N>
57
58    impl<const N: usize> Not for Simd<i16, N>
59
60    impl<const N: usize> Not for Simd<i32, N>
61
62    impl<const N: usize> Not for Simd<i64, N>
63
64    impl<const N: usize> Not for Simd<isize, N>
65
66    impl<const N: usize> Not for Simd<u8, N>
67
68    impl<const N: usize> Not for Simd<u16, N>
69
70    impl<const N: usize> Not for Simd<u32, N>
71
72    impl<const N: usize> Not for Simd<u64, N>
73
74    impl<const N: usize> Not for Simd<usize, N>
75}