1 //! Implements the Simd<[T; N]> APIs
39 #[cfg(feature = "into_bits")]
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)
53 impl_ops_scalar_bitwise
!(
54 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (!(0 as $elem_ty
), 0)
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
63 impl_reduction_integer_arithmetic
!(
64 [$elem_ty
; $elem_n
]: $tuple_id
| $ielem_ty
| $test_tt
66 impl_reduction_min_max
!(
67 [$elem_ty
; $elem_n
]: $tuple_id
| $ielem_ty
| $test_tt
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)
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));
80 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| $
($from_vec_ty
),*
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
);
90 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (0, 1)
92 impl_cmp_eq
!([$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (0, 1));
94 [$elem_ty
; $elem_n
]: $tuple_id
, $mask_ty
, false, (1, 0) | $test_tt
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
);
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
);
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)
117 impl_ops_scalar_bitwise
!(
118 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (!(0 as $elem_ty
), 0)
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
126 impl_reduction_integer_arithmetic
!(
127 [$elem_ty
; $elem_n
]: $tuple_id
| $ielem_ty
| $test_tt
129 impl_reduction_min_max
!(
130 [$elem_ty
; $elem_n
]: $tuple_id
| $ielem_ty
| $test_tt
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)
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));
143 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| $
($from_vec_ty
),*
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)
155 impl_cmp_eq
!([$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (0, 1));
157 [$elem_ty
; $elem_n
]: $tuple_id
, $mask_ty
, false, (1, 0) | $test_tt
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) |
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
);
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
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
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.));
190 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| $
($from_vec_ty
),*
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.)
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
);
200 impl_float_consts
!([$elem_ty
; $elem_n
]: $tuple_id
);
201 impl_float_category
!([$elem_ty
; $elem_n
]: $tuple_id
, $mask_ty
);
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
);
217 [$elem_ty
; $elem_n
]: $tuple_id
, $mask_ty
, false, (1., 0.)
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
225 test_shuffle1_dyn
!([$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
);
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])*) => {
235 [$elem_ty
; $elem_n
]: $tuple_id
| $ielem_ty
| $test_tt
236 | $
($elem_ids
),* | $
(#[$doc])*
238 impl_ops_vector_mask_bitwise
!(
239 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (true, false)
241 impl_ops_scalar_mask_bitwise
!(
242 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (true, false)
244 impl_reduction_bitwise
!(
245 [bool
; $elem_n
]: $tuple_id
| $ielem_ty
| $test_tt
246 | (|x
|{ x != 0 }
) | (true, false)
248 impl_reduction_mask
!([$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
);
249 impl_fmt_debug
!([bool
; $elem_n
]: $tuple_id
| $test_tt
);
251 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
252 | (crate::$elem_ty
::new(true), true)
255 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| $
($from_vec_ty
),*
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)
262 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (true, false)
265 [$elem_ty
; $elem_n
]: $tuple_id
, $tuple_id
, true, (true, false)
268 impl_select
!([$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
);
269 impl_cmp_partial_ord
!([$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
);
271 [$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
| (false, true)
273 impl_shuffle1_dyn
!([$elem_ty
; $elem_n
]: $tuple_id
| $test_tt
);
274 impl_bitmask
!($tuple_id
| $ibitmask_ty
| (true, false) | $test_tt
);
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
);
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])*) => {
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])*
291 impl_ptr_read
!([$elem_ty
; $elem_n
]: $tuple_id
, $mask_ty
| $test_tt
);
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])*) => {
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])*
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
);