summaryrefslogtreecommitdiffstats
path: root/third_party/rust/packed_simd/src/api.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/packed_simd/src/api.rs')
-rw-r--r--third_party/rust/packed_simd/src/api.rs309
1 files changed, 309 insertions, 0 deletions
diff --git a/third_party/rust/packed_simd/src/api.rs b/third_party/rust/packed_simd/src/api.rs
new file mode 100644
index 0000000000..262fc4ee69
--- /dev/null
+++ b/third_party/rust/packed_simd/src/api.rs
@@ -0,0 +1,309 @@
+//! Implements the Simd<[T; N]> APIs
+
+#[macro_use]
+mod bitmask;
+pub(crate) mod cast;
+#[macro_use]
+mod cmp;
+#[macro_use]
+mod default;
+#[macro_use]
+mod fmt;
+#[macro_use]
+mod from;
+#[macro_use]
+mod hash;
+#[macro_use]
+mod math;
+#[macro_use]
+mod minimal;
+#[macro_use]
+mod ops;
+#[macro_use]
+mod ptr;
+#[macro_use]
+mod reductions;
+#[macro_use]
+mod select;
+#[macro_use]
+mod shuffle;
+#[macro_use]
+mod shuffle1_dyn;
+#[macro_use]
+mod slice;
+#[macro_use]
+mod swap_bytes;
+#[macro_use]
+mod bit_manip;
+
+#[cfg(feature = "into_bits")]
+pub(crate) mod into_bits;
+
+macro_rules! impl_i {
+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
+ | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),*
+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
+ impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ | $($elem_ids),* | $(#[$doc])*);
+ impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
+ );
+ impl_ops_scalar_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
+ );
+ impl_ops_vector_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_scalar_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_rotates!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_neg!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_int_min_max!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt
+ );
+ impl_reduction_integer_arithmetic!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ );
+ impl_reduction_min_max!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ );
+ impl_reduction_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ | (|x|{ x as $elem_ty }) | (!(0 as $elem_ty), 0)
+ );
+ impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_lower_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_upper_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_octal!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_binary!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 1));
+ impl_from_vectors!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
+ );
+ impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_hash!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_swap_bytes!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_bit_manip!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_partial_eq!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)
+ );
+ impl_cmp_eq!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
+ impl_cmp_vertical!(
+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1, 0) | $test_tt
+ );
+ impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
+ impl_bitmask!($tuple_id | $ibitmask_ty | (-1, 0) | $test_tt);
+
+ test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt);
+ test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ }
+}
+
+macro_rules! impl_u {
+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
+ | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),*
+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
+ impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ | $($elem_ids),* | $(#[$doc])*);
+ impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
+ );
+ impl_ops_scalar_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0)
+ );
+ impl_ops_vector_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_scalar_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_rotates!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_int_min_max!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt
+ );
+ impl_reduction_integer_arithmetic!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ );
+ impl_reduction_min_max!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ );
+ impl_reduction_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ | (|x|{ x as $elem_ty }) | (!(0 as $elem_ty), 0)
+ );
+ impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_lower_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_upper_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_octal!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_binary!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 1));
+ impl_from_vectors!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
+ );
+ impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_hash!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_swap_bytes!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_bit_manip!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_partial_eq!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 0)
+ );
+ impl_cmp_eq!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
+ impl_cmp_vertical!(
+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1, 0) | $test_tt
+ );
+ impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
+ impl_bitmask!($tuple_id | $ibitmask_ty | ($ielem_ty::max_value(), 0) |
+ $test_tt);
+
+ test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt);
+ test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ }
+}
+
+macro_rules! impl_f {
+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
+ | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),*
+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
+ impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ | $($elem_ids),* | $(#[$doc])*);
+ impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_neg!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_ops_vector_float_min_max!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt
+ );
+ impl_reduction_float_arithmetic!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_reduction_min_max!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ );
+ impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1., 1.));
+ impl_from_vectors!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
+ );
+ impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_partial_eq!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (1., 0.)
+ );
+ impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+
+ impl_float_consts!([$elem_ty; $elem_n]: $tuple_id);
+ impl_float_category!([$elem_ty; $elem_n]: $tuple_id, $mask_ty);
+
+ // floating-point math
+ impl_math_float_abs!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_cos!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_exp!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_ln!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_mul_add!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_mul_adde!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_powf!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_recpre!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_rsqrte!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_sin!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_sqrt!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_sqrte!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_math_float_tanh!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_vertical!(
+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1., 0.)
+ | $test_tt
+ );
+
+ test_select!($elem_ty, $mask_ty, $tuple_id, (1., 2.) | $test_tt);
+ test_reduction_float_min_max!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt
+ );
+ test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ }
+}
+
+macro_rules! impl_m {
+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident
+ | $ielem_ty:ident, $ibitmask_ty:ident
+ | $test_tt:tt | $($elem_ids:ident),* | From: $($from_vec_ty:ident),*
+ | $(#[$doc:meta])*) => {
+ impl_minimal_mask!(
+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ | $($elem_ids),* | $(#[$doc])*
+ );
+ impl_ops_vector_mask_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
+ );
+ impl_ops_scalar_mask_bitwise!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
+ );
+ impl_reduction_bitwise!(
+ [bool; $elem_n]: $tuple_id | $ielem_ty | $test_tt
+ | (|x|{ x != 0 }) | (true, false)
+ );
+ impl_reduction_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_fmt_debug!([bool; $elem_n]: $tuple_id | $test_tt);
+ impl_from_array!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt
+ | (crate::$elem_ty::new(true), true)
+ );
+ impl_from_vectors!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),*
+ );
+ impl_default!([bool; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_partial_eq!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
+ );
+ impl_cmp_eq!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false)
+ );
+ impl_cmp_vertical!(
+ [$elem_ty; $elem_n]: $tuple_id, $tuple_id, true, (true, false)
+ | $test_tt
+ );
+ impl_select!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_cmp_ord!(
+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (false, true)
+ );
+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ impl_bitmask!($tuple_id | $ibitmask_ty | (true, false) | $test_tt);
+
+ test_cmp_partial_ord_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ test_shuffle1_dyn_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
+ }
+}
+
+macro_rules! impl_const_p {
+ ([$elem_ty:ty; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident,
+ $usize_ty:ident, $isize_ty:ident
+ | $test_tt:tt | $($elem_ids:ident),*
+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
+ impl_minimal_p!(
+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, $usize_ty, $isize_ty
+ | ref_ | $test_tt | $($elem_ids),*
+ | (1 as $elem_ty, 0 as $elem_ty) | $(#[$doc])*
+ );
+ impl_ptr_read!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt);
+ }
+}
+
+macro_rules! impl_mut_p {
+ ([$elem_ty:ty; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident,
+ $usize_ty:ident, $isize_ty:ident
+ | $test_tt:tt | $($elem_ids:ident),*
+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
+ impl_minimal_p!(
+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, $usize_ty, $isize_ty
+ | ref_mut_ | $test_tt | $($elem_ids),*
+ | (1 as $elem_ty, 0 as $elem_ty) | $(#[$doc])*
+ );
+ impl_ptr_read!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt);
+ impl_ptr_write!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt);
+ }
+}