]> git.lizzy.rs Git - rust.git/blob - library/portable-simd/crates/core_simd/tests/masks.rs
Auto merge of #89167 - workingjubilee:use-simd, r=MarkSimulacrum
[rust.git] / library / portable-simd / crates / core_simd / tests / masks.rs
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
71             #[cfg(feature = "generic_const_exprs")]
72             #[test]
73             fn roundtrip_bitmask_conversion() {
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();
80                 assert_eq!(bitmask, [0b01001001, 0b10000011]);
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 }