22
33/// Implements additional integer traits (Eq, Ord, Hash) on the specified vector `$name`, holding multiple `$lanes` of `$type`.
44macro_rules! impl_integer_vector {
5- { $name: ident, $type: ty } => {
5+ { $name: ident, $type: ty, $mask_ty : ident , $mask_impl_ty : ident } => {
66 impl_vector! { $name, $type }
77
88 impl <const LANES : usize > Eq for $name<LANES > where Self : crate :: LanesAtMost64 { }
@@ -24,6 +24,22 @@ macro_rules! impl_integer_vector {
2424 self . as_slice( ) . hash( state)
2525 }
2626 }
27+
28+ impl <const LANES : usize > $name<LANES >
29+ where
30+ Self : crate :: LanesAtMost64 ,
31+ crate :: $mask_impl_ty<LANES >: crate :: LanesAtMost64 ,
32+ {
33+ /// Returns true for each positive lane and false if it is zero or negative.
34+ pub fn is_positive( self ) -> crate :: $mask_ty<LANES > {
35+ self . lanes_gt( Self :: splat( 0 ) )
36+ }
37+
38+ /// Returns true for each negative lane and false if it is zero or positive.
39+ pub fn is_negative( self ) -> crate :: $mask_ty<LANES > {
40+ self . lanes_lt( Self :: splat( 0 ) )
41+ }
42+ }
2743 }
2844}
2945
@@ -33,7 +49,7 @@ pub struct SimdIsize<const LANES: usize>([isize; LANES])
3349where
3450 Self : crate :: LanesAtMost64 ;
3551
36- impl_integer_vector ! { SimdIsize , isize }
52+ impl_integer_vector ! { SimdIsize , isize , MaskSize , SimdIsize }
3753
3854#[ cfg( target_pointer_width = "32" ) ]
3955from_transmute_x86 ! { unsafe isizex4 => __m128i }
@@ -53,7 +69,7 @@ pub struct SimdI128<const LANES: usize>([i128; LANES])
5369where
5470 Self : crate :: LanesAtMost64 ;
5571
56- impl_integer_vector ! { SimdI128 , i128 }
72+ impl_integer_vector ! { SimdI128 , i128 , Mask128 , SimdI128 }
5773
5874from_transmute_x86 ! { unsafe i128x2 => __m256i }
5975//from_transmute_x86! { unsafe i128x4 => __m512i }
@@ -64,7 +80,7 @@ pub struct SimdI16<const LANES: usize>([i16; LANES])
6480where
6581 Self : crate :: LanesAtMost64 ;
6682
67- impl_integer_vector ! { SimdI16 , i16 }
83+ impl_integer_vector ! { SimdI16 , i16 , Mask16 , SimdI16 }
6884
6985from_transmute_x86 ! { unsafe i16x8 => __m128i }
7086from_transmute_x86 ! { unsafe i16x16 => __m256i }
@@ -76,7 +92,7 @@ pub struct SimdI32<const LANES: usize>([i32; LANES])
7692where
7793 Self : crate :: LanesAtMost64 ;
7894
79- impl_integer_vector ! { SimdI32 , i32 }
95+ impl_integer_vector ! { SimdI32 , i32 , Mask32 , SimdI32 }
8096
8197from_transmute_x86 ! { unsafe i32x4 => __m128i }
8298from_transmute_x86 ! { unsafe i32x8 => __m256i }
@@ -88,7 +104,7 @@ pub struct SimdI64<const LANES: usize>([i64; LANES])
88104where
89105 Self : crate :: LanesAtMost64 ;
90106
91- impl_integer_vector ! { SimdI64 , i64 }
107+ impl_integer_vector ! { SimdI64 , i64 , Mask64 , SimdI64 }
92108
93109from_transmute_x86 ! { unsafe i64x2 => __m128i }
94110from_transmute_x86 ! { unsafe i64x4 => __m256i }
@@ -100,7 +116,7 @@ pub struct SimdI8<const LANES: usize>([i8; LANES])
100116where
101117 Self : crate :: LanesAtMost64 ;
102118
103- impl_integer_vector ! { SimdI8 , i8 }
119+ impl_integer_vector ! { SimdI8 , i8 , Mask8 , SimdI8 }
104120
105121from_transmute_x86 ! { unsafe i8x16 => __m128i }
106122from_transmute_x86 ! { unsafe i8x32 => __m256i }
0 commit comments