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