1 //! Masks that take up full SIMD vector registers.
3 macro_rules! define_mask {
6 struct $name:ident<const $lanes:ident: usize>(
7 crate::$type:ident<$lanes2:ident>
11 #[derive(Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
13 pub struct $name<const $lanes: usize>(crate::$type<$lanes2>)
15 crate::$type<LANES>: crate::LanesAtMost32;
17 impl_full_mask_reductions! { $name, $type }
19 impl<const LANES: usize> Copy for $name<LANES>
21 crate::$type<LANES>: crate::LanesAtMost32,
24 impl<const LANES: usize> Clone for $name<LANES>
26 crate::$type<LANES>: crate::LanesAtMost32,
29 fn clone(&self) -> Self {
34 impl<const LANES: usize> $name<LANES>
36 crate::$type<LANES>: crate::LanesAtMost32,
38 pub fn splat(value: bool) -> Self {
39 Self(<crate::$type<LANES>>::splat(
49 pub fn test(&self, lane: usize) -> bool {
50 assert!(lane < LANES, "lane index out of range");
55 pub fn set(&mut self, lane: usize, value: bool) {
56 assert!(lane < LANES, "lane index out of range");
57 self.0[lane] = if value {
65 pub fn to_int(self) -> crate::$type<LANES> {
70 pub unsafe fn from_int_unchecked(value: crate::$type<LANES>) -> Self {
75 impl<const LANES: usize> core::convert::From<$name<LANES>> for crate::$type<LANES>
77 crate::$type<LANES>: crate::LanesAtMost32,
79 fn from(value: $name<LANES>) -> Self {
84 impl<const LANES: usize> core::fmt::Debug for $name<LANES>
86 crate::$type<LANES>: crate::LanesAtMost32,
88 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
90 .entries((0..LANES).map(|lane| self.test(lane)))
95 impl<const LANES: usize> core::fmt::Binary for $name<LANES>
97 crate::$type<LANES>: crate::LanesAtMost32,
99 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
100 core::fmt::Binary::fmt(&self.0, f)
104 impl<const LANES: usize> core::fmt::Octal for $name<LANES>
106 crate::$type<LANES>: crate::LanesAtMost32,
108 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
109 core::fmt::Octal::fmt(&self.0, f)
113 impl<const LANES: usize> core::fmt::LowerHex for $name<LANES>
115 crate::$type<LANES>: crate::LanesAtMost32,
117 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
118 core::fmt::LowerHex::fmt(&self.0, f)
122 impl<const LANES: usize> core::fmt::UpperHex for $name<LANES>
124 crate::$type<LANES>: crate::LanesAtMost32,
126 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
127 core::fmt::UpperHex::fmt(&self.0, f)
131 impl<const LANES: usize> core::ops::BitAnd for $name<LANES>
133 crate::$type<LANES>: crate::LanesAtMost32,
137 fn bitand(self, rhs: Self) -> Self {
142 impl<const LANES: usize> core::ops::BitOr for $name<LANES>
144 crate::$type<LANES>: crate::LanesAtMost32,
148 fn bitor(self, rhs: Self) -> Self {
153 impl<const LANES: usize> core::ops::BitXor for $name<LANES>
155 crate::$type<LANES>: crate::LanesAtMost32,
159 fn bitxor(self, rhs: Self) -> Self::Output {
164 impl<const LANES: usize> core::ops::Not for $name<LANES>
166 crate::$type<LANES>: crate::LanesAtMost32,
168 type Output = $name<LANES>;
170 fn not(self) -> Self::Output {
175 impl<const LANES: usize> core::ops::BitAndAssign for $name<LANES>
177 crate::$type<LANES>: crate::LanesAtMost32,
180 fn bitand_assign(&mut self, rhs: Self) {
185 impl<const LANES: usize> core::ops::BitOrAssign for $name<LANES>
187 crate::$type<LANES>: crate::LanesAtMost32,
190 fn bitor_assign(&mut self, rhs: Self) {
195 impl<const LANES: usize> core::ops::BitXorAssign for $name<LANES>
197 crate::$type<LANES>: crate::LanesAtMost32,
200 fn bitxor_assign(&mut self, rhs: Self) {
208 /// A mask equivalent to [SimdI8](crate::SimdI8), where all bits in the lane must be either set
210 struct Mask8<const LANES: usize>(crate::SimdI8<LANES>);
214 /// A mask equivalent to [SimdI16](crate::SimdI16), where all bits in the lane must be either set
216 struct Mask16<const LANES: usize>(crate::SimdI16<LANES>);
220 /// A mask equivalent to [SimdI32](crate::SimdI32), where all bits in the lane must be either set
222 struct Mask32<const LANES: usize>(crate::SimdI32<LANES>);
226 /// A mask equivalent to [SimdI64](crate::SimdI64), where all bits in the lane must be either set
228 struct Mask64<const LANES: usize>(crate::SimdI64<LANES>);
232 /// A mask equivalent to [SimdIsize](crate::SimdIsize), where all bits in the lane must be either set
234 struct MaskSize<const LANES: usize>(crate::SimdIsize<LANES>);