@@ -137,8 +137,8 @@ mod test {
137137 /// masks with lanes represented using i16.
138138 #[ test]
139139 fn test_bitmask_i16 ( ) {
140- check_portable_bitmask :: < _ , i16 , 16 > ( mask16x16:: splat ( false ) ) ;
141- check_portable_bitmask :: < _ , i16 , 16 > ( mask16x16:: splat ( true ) ) ;
140+ check_portable_bitmask :: < _ , i16 , 16 , u16 > ( mask16x16:: splat ( false ) ) ;
141+ check_portable_bitmask :: < _ , i16 , 16 , u16 > ( mask16x16:: splat ( true ) ) ;
142142 }
143143
144144 /// Tests that the model correctly fails if an invalid value is given.
@@ -165,11 +165,11 @@ mod test {
165165 /// These values shouldn't be symmetric and ensure that we also handle endianness correctly.
166166 #[ test]
167167 fn test_bitmask_i32 ( ) {
168- check_portable_bitmask :: < _ , i32 , 8 > ( mask32x8:: from ( [
168+ check_portable_bitmask :: < _ , i32 , 8 , u8 > ( mask32x8:: from ( [
169169 true , true , false , true , false , false , false , true ,
170170 ] ) ) ;
171171
172- check_portable_bitmask :: < _ , i32 , 4 > ( mask32x4:: from ( [ true , false , false , true ] ) ) ;
172+ check_portable_bitmask :: < _ , i32 , 4 , u8 > ( mask32x4:: from ( [ true , false , false , true ] ) ) ;
173173 }
174174
175175 #[ repr( simd) ]
@@ -185,15 +185,16 @@ mod test {
185185 }
186186
187187 /// Compare the value returned by our model and the portable simd representation.
188- fn check_portable_bitmask < T , E , const LANES : usize > ( mask : T )
188+ fn check_portable_bitmask < T , E , const LANES : usize , M > ( mask : Mask < T , LANES > )
189189 where
190- T : ToBitMask + Clone ,
191- T :: BitMask : Debug + PartialEq ,
190+ T : std :: simd :: MaskElement ,
191+ LaneCount < LANES > : SupportedLaneCount ,
192192 E : kani_intrinsic:: MaskElement ,
193193 [ u8 ; kani_intrinsic:: mask_len ( LANES ) ] : Sized ,
194+ u64 : From < M > ,
194195 {
195196 assert_eq ! (
196- unsafe { kani_intrinsic:: simd_bitmask:: <_, T :: BitMask , E , LANES >( mask. clone( ) ) } ,
197+ unsafe { u64 :: from ( kani_intrinsic:: simd_bitmask:: <_, M , E , LANES >( mask. clone( ) ) ) } ,
197198 mask. to_bitmask( )
198199 ) ;
199200 }
@@ -211,4 +212,19 @@ mod test {
211212 unsafe { simd_bitmask:: <T , U >( mask) }
212213 ) ;
213214 }
215+
216+ /// Similar to portable simd_harness.
217+ #[ test]
218+ fn check_mask_harness ( ) {
219+ // From array doesn't work either. Manually build [false, true, false, true]
220+ let mut mask = mask32x4:: splat ( false ) ;
221+ mask. set ( 1 , true ) ;
222+ mask. set ( 3 , true ) ;
223+ let bitmask = mask. to_bitmask ( ) ;
224+ assert_eq ! ( bitmask, 0b1010 ) ;
225+
226+ let kani_mask =
227+ unsafe { u64:: from ( kani_intrinsic:: simd_bitmask :: < _ , u8 , u32 , 4 > ( mask. clone ( ) ) ) } ;
228+ assert_eq ! ( kani_mask, bitmask) ;
229+ }
214230}
0 commit comments