1 macro_rules! mask_tests {
2 { $vector:ident, $lanes:literal } => {
5 use core_simd::$vector as Vector;
6 const LANES: usize = $lanes;
8 #[cfg(target_arch = "wasm32")]
9 use wasm_bindgen_test::*;
11 #[cfg(target_arch = "wasm32")]
12 wasm_bindgen_test_configure!(run_in_browser);
14 fn from_slice(slice: &[bool]) -> Vector {
15 let mut value = Vector::default();
16 for (i, b) in slice.iter().take(LANES).enumerate() {
22 fn apply_unary_lanewise(x: Vector, f: impl Fn(bool) -> bool) -> Vector {
23 let mut value = Vector::default();
25 value.set(i, f(x.test(i)));
30 fn apply_binary_lanewise(x: Vector, y: Vector, f: impl Fn(bool, bool) -> bool) -> Vector {
31 let mut value = Vector::default();
33 value.set(i, f(x.test(i), y.test(i)));
38 fn apply_binary_scalar_lhs_lanewise(x: bool, mut y: Vector, f: impl Fn(bool, bool) -> bool) -> Vector {
40 y.set(i, f(x, y.test(i)));
45 fn apply_binary_scalar_rhs_lanewise(mut x: Vector, y: bool, f: impl Fn(bool, bool) -> bool) -> Vector {
47 x.set(i, f(x.test(i), y));
52 const A: [bool; 64] = [
53 false, true, false, true, false, false, true, true,
54 false, true, false, true, false, false, true, true,
55 false, true, false, true, false, false, true, true,
56 false, true, false, true, false, false, true, true,
57 false, true, false, true, false, false, true, true,
58 false, true, false, true, false, false, true, true,
59 false, true, false, true, false, false, true, true,
60 false, true, false, true, false, false, true, true,
62 const B: [bool; 64] = [
63 false, false, true, true, false, true, false, true,
64 false, false, true, true, false, true, false, true,
65 false, false, true, true, false, true, false, true,
66 false, false, true, true, false, true, false, true,
67 false, false, true, true, false, true, false, true,
68 false, false, true, true, false, true, false, true,
69 false, false, true, true, false, true, false, true,
70 false, false, true, true, false, true, false, true,
74 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
76 let a = from_slice(&A);
77 let b = from_slice(&B);
78 let expected = apply_binary_lanewise(a, b, core::ops::BitAnd::bitand);
79 assert_eq!(a & b, expected);
83 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
85 let mut a = from_slice(&A);
86 let b = from_slice(&B);
87 let expected = apply_binary_lanewise(a, b, core::ops::BitAnd::bitand);
89 assert_eq!(a, expected);
93 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
94 fn bitand_scalar_rhs() {
95 let a = from_slice(&A);
97 assert_eq!(a & true, expected);
98 assert_eq!(a & false, Vector::splat(false));
102 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
103 fn bitand_scalar_lhs() {
104 let a = from_slice(&A);
106 assert_eq!(true & a, expected);
107 assert_eq!(false & a, Vector::splat(false));
111 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
112 fn bitand_assign_scalar() {
113 let mut a = from_slice(&A);
116 assert_eq!(a, expected);
118 assert_eq!(a, Vector::splat(false));
122 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
124 let a = from_slice(&A);
125 let b = from_slice(&B);
126 let expected = apply_binary_lanewise(a, b, core::ops::BitOr::bitor);
127 assert_eq!(a | b, expected);
131 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
133 let mut a = from_slice(&A);
134 let b = from_slice(&B);
135 let expected = apply_binary_lanewise(a, b, core::ops::BitOr::bitor);
137 assert_eq!(a, expected);
141 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
142 fn bitor_scalar_rhs() {
143 let a = from_slice(&A);
144 assert_eq!(a | false, a);
145 assert_eq!(a | true, Vector::splat(true));
149 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
150 fn bitor_scalar_lhs() {
151 let a = from_slice(&A);
152 assert_eq!(false | a, a);
153 assert_eq!(true | a, Vector::splat(true));
157 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
158 fn bitor_assign_scalar() {
159 let mut a = from_slice(&A);
162 assert_eq!(a, expected);
164 assert_eq!(a, Vector::splat(true));
168 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
170 let a = from_slice(&A);
171 let b = from_slice(&B);
172 let expected = apply_binary_lanewise(a, b, core::ops::BitXor::bitxor);
173 assert_eq!(a ^ b, expected);
177 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
179 let mut a = from_slice(&A);
180 let b = from_slice(&B);
181 let expected = apply_binary_lanewise(a, b, core::ops::BitXor::bitxor);
183 assert_eq!(a, expected);
187 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
188 fn bitxor_scalar_rhs() {
189 let a = from_slice(&A);
190 let expected = apply_binary_scalar_rhs_lanewise(a, true, core::ops::BitXor::bitxor);
191 assert_eq!(a ^ false, a);
192 assert_eq!(a ^ true, expected);
196 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
197 fn bitxor_scalar_lhs() {
198 let a = from_slice(&A);
199 let expected = apply_binary_scalar_lhs_lanewise(true, a, core::ops::BitXor::bitxor);
200 assert_eq!(false ^ a, a);
201 assert_eq!(true ^ a, expected);
205 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
206 fn bitxor_assign_scalar() {
207 let mut a = from_slice(&A);
208 let expected_unset = a;
209 let expected_set = apply_binary_scalar_rhs_lanewise(a, true, core::ops::BitXor::bitxor);
211 assert_eq!(a, expected_unset);
213 assert_eq!(a, expected_set);
217 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
219 let v = from_slice(&A);
220 let expected = apply_unary_lanewise(v, core::ops::Not::not);
221 assert_eq!(!v, expected);