1 //! Implements the Simd<[T; N]> APIs
2 
3 #[macro_use]
4 mod bitmask;
5 crate mod cast;
6 #[macro_use]
7 mod cmp;
8 #[macro_use]
9 mod default;
10 #[macro_use]
11 mod fmt;
12 #[macro_use]
13 mod from;
14 #[macro_use]
15 mod hash;
16 #[macro_use]
17 mod math;
18 #[macro_use]
19 mod minimal;
20 #[macro_use]
21 mod ops;
22 #[macro_use]
23 mod ptr;
24 #[macro_use]
25 mod reductions;
26 #[macro_use]
27 mod select;
28 #[macro_use]
29 mod shuffle;
30 #[macro_use]
31 mod shuffle1_dyn;
32 #[macro_use]
33 mod slice;
34 #[macro_use]
35 mod swap_bytes;
36 #[macro_use]
37 mod bit_manip;
38 
39 #[cfg(feature = "into_bits")]
40 crate mod into_bits;
41 
42 macro_rules! impl_i {
43     ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
44      | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),*
45      | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
46         impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
47                           | $($elem_ids),* | $(#[$doc])*);
48         impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
49         impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
50         impl_ops_vector_bitwise!(
51             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
52         );
53         impl_ops_scalar_bitwise!(
54             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
55         );
56         impl_ops_vector_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
57         impl_ops_scalar_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
58         impl_ops_vector_rotates!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
59         impl_ops_vector_neg!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
60         impl_ops_vector_int_min_max!(
61             [$elem_ty; $elem_n]: $tuple_id | $test_tt
62         );
63         impl_reduction_integer_arithmetic!(
64             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
65         );
66         impl_reduction_min_max!(
67             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
68         );
69         impl_reduction_bitwise!(
70             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
71             | (|x|{ x as $elem_ty }) | (!(0 as $elem_ty), 0)
72         );
73         impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
74         impl_fmt_lower_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
75         impl_fmt_upper_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
76         impl_fmt_octal!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
77         impl_fmt_binary!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
78         impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 1));
79         impl_from_vectors!(
80             [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
81         );
82         impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
83         impl_hash!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
84         impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
85         impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
86         impl_swap_bytes!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
87         impl_bit_manip!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
88         impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
89         impl_cmp_partial_eq!(
90             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)
91         );
92         impl_cmp_eq!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
93         impl_cmp_vertical!(
94             [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1, 0) | $test_tt
95         );
96         impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
97         impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
98         impl_bitmask!($tuple_id | $ibitmask_ty | (-1, 0) | $test_tt);
99 
100         test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt);
101         test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
102         test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
103     }
104 }
105 
106 macro_rules! impl_u {
107     ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
108      | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),*
109      | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
110         impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
111                           | $($elem_ids),* | $(#[$doc])*);
112         impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
113         impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
114         impl_ops_vector_bitwise!(
115             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
116         );
117         impl_ops_scalar_bitwise!(
118             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
119         );
120         impl_ops_vector_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
121         impl_ops_scalar_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
122         impl_ops_vector_rotates!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
123         impl_ops_vector_int_min_max!(
124             [$elem_ty; $elem_n]: $tuple_id | $test_tt
125         );
126         impl_reduction_integer_arithmetic!(
127             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
128         );
129         impl_reduction_min_max!(
130             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
131         );
132         impl_reduction_bitwise!(
133             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
134             | (|x|{ x as $elem_ty }) | (!(0 as $elem_ty), 0)
135         );
136         impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
137         impl_fmt_lower_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
138         impl_fmt_upper_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
139         impl_fmt_octal!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
140         impl_fmt_binary!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
141         impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 1));
142         impl_from_vectors!(
143             [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
144         );
145         impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
146         impl_hash!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
147         impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
148         impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
149         impl_swap_bytes!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
150         impl_bit_manip!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
151         impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
152         impl_cmp_partial_eq!(
153             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 0)
154         );
155         impl_cmp_eq!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
156         impl_cmp_vertical!(
157             [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1, 0) | $test_tt
158         );
159         impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
160         impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
161         impl_bitmask!($tuple_id | $ibitmask_ty | ($ielem_ty::max_value(), 0) |
162                       $test_tt);
163 
164         test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt);
165         test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
166         test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
167     }
168 }
169 
170 macro_rules! impl_f {
171     ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
172      | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),*
173      | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
174         impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
175                           | $($elem_ids),* | $(#[$doc])*);
176         impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
177         impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
178         impl_ops_vector_neg!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
179         impl_ops_vector_float_min_max!(
180             [$elem_ty; $elem_n]: $tuple_id | $test_tt
181         );
182         impl_reduction_float_arithmetic!(
183             [$elem_ty; $elem_n]: $tuple_id | $test_tt);
184         impl_reduction_min_max!(
185             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
186         );
187         impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
188         impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1., 1.));
189         impl_from_vectors!(
190             [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
191         );
192         impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
193         impl_cmp_partial_eq!(
194             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (1., 0.)
195         );
196         impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
197         impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
198         impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
199 
200         impl_float_consts!([$elem_ty; $elem_n]: $tuple_id);
201         impl_float_category!([$elem_ty; $elem_n]: $tuple_id, $mask_ty);
202 
203         // floating-point math
204         impl_math_float_abs!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
205         impl_math_float_cos!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
206         impl_math_float_exp!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
207         impl_math_float_ln!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
208         impl_math_float_mul_add!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
209         impl_math_float_mul_adde!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
210         impl_math_float_powf!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
211         impl_math_float_recpre!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
212         impl_math_float_rsqrte!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
213         impl_math_float_sin!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
214         impl_math_float_sqrt!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
215         impl_math_float_sqrte!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
216         impl_cmp_vertical!(
217             [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1., 0.)
218                 | $test_tt
219         );
220 
221         test_select!($elem_ty, $mask_ty, $tuple_id, (1., 2.) | $test_tt);
222         test_reduction_float_min_max!(
223             [$elem_ty; $elem_n]: $tuple_id | $test_tt
224         );
225         test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
226     }
227 }
228 
229 macro_rules! impl_m {
230     ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident
231      | $ielem_ty:ident, $ibitmask_ty:ident
232      | $test_tt:tt | $($elem_ids:ident),* | From: $($from_vec_ty:ident),*
233      | $(#[$doc:meta])*) => {
234         impl_minimal_mask!(
235             [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
236             | $($elem_ids),* | $(#[$doc])*
237         );
238         impl_ops_vector_mask_bitwise!(
239             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
240         );
241         impl_ops_scalar_mask_bitwise!(
242             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
243         );
244         impl_reduction_bitwise!(
245             [bool; $elem_n]: $tuple_id | $ielem_ty | $test_tt
246                 | (|x|{ x != 0 }) | (true, false)
247         );
248         impl_reduction_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
249         impl_fmt_debug!([bool; $elem_n]: $tuple_id | $test_tt);
250         impl_from_array!(
251             [$elem_ty; $elem_n]: $tuple_id | $test_tt
252             | (crate::$elem_ty::new(true), true)
253         );
254         impl_from_vectors!(
255             [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
256         );
257         impl_default!([bool; $elem_n]: $tuple_id | $test_tt);
258         impl_cmp_partial_eq!(
259             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
260         );
261         impl_cmp_eq!(
262             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
263         );
264         impl_cmp_vertical!(
265             [$elem_ty; $elem_n]: $tuple_id, $tuple_id, true, (true, false)
266             | $test_tt
267         );
268         impl_select!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
269         impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
270         impl_cmp_ord!(
271             [$elem_ty; $elem_n]: $tuple_id | $test_tt | (false, true)
272         );
273         impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
274         impl_bitmask!($tuple_id | $ibitmask_ty | (true, false) | $test_tt);
275 
276         test_cmp_partial_ord_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
277         test_shuffle1_dyn_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
278     }
279 }
280 
281 macro_rules! impl_const_p {
282     ([$elem_ty:ty; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident,
283      $usize_ty:ident, $isize_ty:ident
284      | $test_tt:tt | $($elem_ids:ident),*
285      | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
286         impl_minimal_p!(
287             [$elem_ty; $elem_n]: $tuple_id, $mask_ty, $usize_ty, $isize_ty
288                 | ref_ | $test_tt | $($elem_ids),*
289                 | (1 as $elem_ty, 0 as $elem_ty) | $(#[$doc])*
290         );
291         impl_ptr_read!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt);
292     }
293 }
294 
295 macro_rules! impl_mut_p {
296     ([$elem_ty:ty; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident,
297      $usize_ty:ident, $isize_ty:ident
298      | $test_tt:tt | $($elem_ids:ident),*
299      | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
300         impl_minimal_p!(
301             [$elem_ty; $elem_n]: $tuple_id, $mask_ty, $usize_ty, $isize_ty
302                 | ref_mut_ | $test_tt | $($elem_ids),*
303                 | (1 as $elem_ty, 0 as $elem_ty) | $(#[$doc])*
304         );
305         impl_ptr_read!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt);
306         impl_ptr_write!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt);
307     }
308 }
309