]> git.proxmox.com Git - rustc.git/blob - vendor/packed_simd/src/api.rs
New upstream version 1.49.0+dfsg1
[rustc.git] / vendor / packed_simd / src / api.rs
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 }