kdtree_simd/simd_euclidean/
f32x8.rs

1use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
2
3define_ty!(F32x8, f32, f32, f32, f32, f32, f32, f32, f32);
4impl_minimal!(F32x8, f32, 8, x0, x1, x2, x3, x4, x5, x6, x7);
5
6impl F32x8 {
7    pub fn from_slice(slice: &[f32]) -> Self {
8        assert!(slice.len() >= Self::lanes());
9        unsafe {
10            F32x8(
11                *slice.get_unchecked(0),
12                *slice.get_unchecked(1),
13                *slice.get_unchecked(2),
14                *slice.get_unchecked(3),
15                *slice.get_unchecked(4),
16                *slice.get_unchecked(5),
17                *slice.get_unchecked(6),
18                *slice.get_unchecked(7),
19            )
20        }
21    }
22
23    pub fn horizontal_add(self) -> f32 {
24        self.0 + self.1 + self.2 + self.3 + self.4 + self.5 + self.6 + self.7
25    }
26}
27
28impl_op8!(Mul, mul, F32x8, *);
29impl_op8!(assn MulAssign, mul_assign, F32x8, *=);
30impl_op8!(Div, div, F32x8, /);
31impl_op8!(assn DivAssign, div_assign, F32x8, /=);
32impl_op8!(Add, add, F32x8, +);
33impl_op8!(assn AddAssign, add_assign, F32x8, +=);
34impl_op8!(Sub, sub, F32x8, -);
35impl_op8!(assn SubAssign, sub_assign, F32x8, -=);
36impl_euclidean!(F32x8, f32);