]>
Commit | Line | Data |
---|---|---|
3c0e092e XL |
1 | #![feature(portable_simd)] |
2 | ||
3 | #[cfg(target_arch = "wasm32")] | |
4 | use wasm_bindgen_test::*; | |
5 | ||
6 | #[cfg(target_arch = "wasm32")] | |
7 | wasm_bindgen_test_configure!(run_in_browser); | |
8 | ||
9 | macro_rules! test_mask_api { | |
10 | { $type:ident } => { | |
11 | #[allow(non_snake_case)] | |
12 | mod $type { | |
13 | #[cfg(target_arch = "wasm32")] | |
14 | use wasm_bindgen_test::*; | |
15 | ||
16 | #[test] | |
17 | #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] | |
18 | fn set_and_test() { | |
19 | let values = [true, false, false, true, false, false, true, false]; | |
20 | let mut mask = core_simd::Mask::<$type, 8>::splat(false); | |
21 | for (lane, value) in values.iter().copied().enumerate() { | |
22 | mask.set(lane, value); | |
23 | } | |
24 | for (lane, value) in values.iter().copied().enumerate() { | |
25 | assert_eq!(mask.test(lane), value); | |
26 | } | |
27 | } | |
28 | ||
29 | #[test] | |
30 | #[should_panic] | |
31 | fn set_invalid_lane() { | |
32 | let mut mask = core_simd::Mask::<$type, 8>::splat(false); | |
33 | mask.set(8, true); | |
34 | let _ = mask; | |
35 | } | |
36 | ||
37 | #[test] | |
38 | #[should_panic] | |
39 | fn test_invalid_lane() { | |
40 | let mask = core_simd::Mask::<$type, 8>::splat(false); | |
41 | let _ = mask.test(8); | |
42 | } | |
43 | ||
44 | #[test] | |
45 | fn any() { | |
46 | assert!(!core_simd::Mask::<$type, 8>::splat(false).any()); | |
47 | assert!(core_simd::Mask::<$type, 8>::splat(true).any()); | |
48 | let mut v = core_simd::Mask::<$type, 8>::splat(false); | |
49 | v.set(2, true); | |
50 | assert!(v.any()); | |
51 | } | |
52 | ||
53 | #[test] | |
54 | fn all() { | |
55 | assert!(!core_simd::Mask::<$type, 8>::splat(false).all()); | |
56 | assert!(core_simd::Mask::<$type, 8>::splat(true).all()); | |
57 | let mut v = core_simd::Mask::<$type, 8>::splat(false); | |
58 | v.set(2, true); | |
59 | assert!(!v.all()); | |
60 | } | |
61 | ||
62 | #[test] | |
63 | fn roundtrip_int_conversion() { | |
64 | let values = [true, false, false, true, false, false, true, false]; | |
65 | let mask = core_simd::Mask::<$type, 8>::from_array(values); | |
66 | let int = mask.to_int(); | |
67 | assert_eq!(int.to_array(), [-1, 0, 0, -1, 0, 0, -1, 0]); | |
68 | assert_eq!(core_simd::Mask::<$type, 8>::from_int(int), mask); | |
69 | } | |
70 | ||
3c0e092e XL |
71 | #[test] |
72 | fn roundtrip_bitmask_conversion() { | |
ee023bcb | 73 | use core_simd::ToBitMask; |
3c0e092e XL |
74 | let values = [ |
75 | true, false, false, true, false, false, true, false, | |
76 | true, true, false, false, false, false, false, true, | |
77 | ]; | |
78 | let mask = core_simd::Mask::<$type, 16>::from_array(values); | |
79 | let bitmask = mask.to_bitmask(); | |
ee023bcb | 80 | assert_eq!(bitmask, 0b1000001101001001); |
3c0e092e XL |
81 | assert_eq!(core_simd::Mask::<$type, 16>::from_bitmask(bitmask), mask); |
82 | } | |
83 | } | |
84 | } | |
85 | } | |
86 | ||
87 | mod mask_api { | |
88 | test_mask_api! { i8 } | |
89 | test_mask_api! { i16 } | |
90 | test_mask_api! { i32 } | |
91 | test_mask_api! { i64 } | |
92 | test_mask_api! { isize } | |
93 | } | |
94 | ||
95 | #[test] | |
96 | fn convert() { | |
97 | let values = [true, false, false, true, false, false, true, false]; | |
98 | assert_eq!( | |
99 | core_simd::Mask::<i8, 8>::from_array(values), | |
100 | core_simd::Mask::<i32, 8>::from_array(values).into() | |
101 | ); | |
102 | } |