2
2
3
3
/// Implements additional integer traits (Eq, Ord, Hash) on the specified vector `$name`, holding multiple `$lanes` of `$type`.
4
4
macro_rules! impl_integer_vector {
5
- { $name: ident, $type: ty } => {
5
+ { $name: ident, $type: ty, $mask_ty : ident , $mask_impl_ty : ident } => {
6
6
impl_vector! { $name, $type }
7
7
8
8
impl <const LANES : usize > Eq for $name<LANES > where Self : crate :: LanesAtMost64 { }
@@ -24,6 +24,22 @@ macro_rules! impl_integer_vector {
24
24
self . as_slice( ) . hash( state)
25
25
}
26
26
}
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
+ }
27
43
}
28
44
}
29
45
@@ -33,7 +49,7 @@ pub struct SimdIsize<const LANES: usize>([isize; LANES])
33
49
where
34
50
Self : crate :: LanesAtMost64 ;
35
51
36
- impl_integer_vector ! { SimdIsize , isize }
52
+ impl_integer_vector ! { SimdIsize , isize , MaskSize , SimdIsize }
37
53
38
54
#[ cfg( target_pointer_width = "32" ) ]
39
55
from_transmute_x86 ! { unsafe isizex4 => __m128i }
@@ -53,7 +69,7 @@ pub struct SimdI128<const LANES: usize>([i128; LANES])
53
69
where
54
70
Self : crate :: LanesAtMost64 ;
55
71
56
- impl_integer_vector ! { SimdI128 , i128 }
72
+ impl_integer_vector ! { SimdI128 , i128 , Mask128 , SimdI128 }
57
73
58
74
from_transmute_x86 ! { unsafe i128x2 => __m256i }
59
75
//from_transmute_x86! { unsafe i128x4 => __m512i }
@@ -64,7 +80,7 @@ pub struct SimdI16<const LANES: usize>([i16; LANES])
64
80
where
65
81
Self : crate :: LanesAtMost64 ;
66
82
67
- impl_integer_vector ! { SimdI16 , i16 }
83
+ impl_integer_vector ! { SimdI16 , i16 , Mask16 , SimdI16 }
68
84
69
85
from_transmute_x86 ! { unsafe i16x8 => __m128i }
70
86
from_transmute_x86 ! { unsafe i16x16 => __m256i }
@@ -76,7 +92,7 @@ pub struct SimdI32<const LANES: usize>([i32; LANES])
76
92
where
77
93
Self : crate :: LanesAtMost64 ;
78
94
79
- impl_integer_vector ! { SimdI32 , i32 }
95
+ impl_integer_vector ! { SimdI32 , i32 , Mask32 , SimdI32 }
80
96
81
97
from_transmute_x86 ! { unsafe i32x4 => __m128i }
82
98
from_transmute_x86 ! { unsafe i32x8 => __m256i }
@@ -88,7 +104,7 @@ pub struct SimdI64<const LANES: usize>([i64; LANES])
88
104
where
89
105
Self : crate :: LanesAtMost64 ;
90
106
91
- impl_integer_vector ! { SimdI64 , i64 }
107
+ impl_integer_vector ! { SimdI64 , i64 , Mask64 , SimdI64 }
92
108
93
109
from_transmute_x86 ! { unsafe i64x2 => __m128i }
94
110
from_transmute_x86 ! { unsafe i64x4 => __m256i }
@@ -100,7 +116,7 @@ pub struct SimdI8<const LANES: usize>([i8; LANES])
100
116
where
101
117
Self : crate :: LanesAtMost64 ;
102
118
103
- impl_integer_vector ! { SimdI8 , i8 }
119
+ impl_integer_vector ! { SimdI8 , i8 , Mask8 , SimdI8 }
104
120
105
121
from_transmute_x86 ! { unsafe i8x16 => __m128i }
106
122
from_transmute_x86 ! { unsafe i8x32 => __m256i }
0 commit comments