]>
Commit | Line | Data |
---|---|---|
83c7162d XL |
1 | //! Implements portable horizontal arithmetic reductions. |
2 | #![allow(unused)] | |
0531ce1d XL |
3 | |
4 | macro_rules! impl_minmax_reductions { | |
5 | ($id:ident, $elem_ty:ident) => { | |
6 | impl $id { | |
83c7162d XL |
7 | /// Largest vector element value. |
8 | #[cfg(not(any(target_arch = "aarch64", target_arch = "arm")))] | |
0531ce1d | 9 | #[inline] |
83c7162d XL |
10 | pub fn max_element(self) -> $elem_ty { |
11 | use coresimd::simd_llvm::simd_reduce_max; | |
12 | unsafe { simd_reduce_max(self) } | |
0531ce1d | 13 | } |
83c7162d XL |
14 | |
15 | /// Largest vector element value. | |
16 | #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] | |
17 | #[allow(unused_imports)] | |
18 | #[inline] | |
19 | pub fn max_element(self) -> $elem_ty { | |
20 | // FIXME: broken on AArch64 | |
21 | // https://bugs.llvm.org/show_bug.cgi?id=36796 | |
22 | use cmp::Ord; | |
23 | let mut x = self.extract(0); | |
24 | for i in 1..$id::lanes() { | |
25 | x = x.max(self.extract(i)); | |
26 | } | |
27 | x | |
28 | } | |
29 | ||
30 | /// Smallest vector element value. | |
31 | #[cfg(not(any(target_arch = "aarch64", target_arch = "arm")))] | |
32 | #[inline] | |
33 | pub fn min_element(self) -> $elem_ty { | |
34 | use coresimd::simd_llvm::simd_reduce_min; | |
35 | unsafe { simd_reduce_min(self) } | |
36 | } | |
37 | ||
38 | /// Smallest vector element value. | |
39 | #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] | |
40 | #[allow(unused_imports)] | |
0531ce1d | 41 | #[inline] |
83c7162d XL |
42 | pub fn min_element(self) -> $elem_ty { |
43 | // FIXME: broken on AArch64 | |
44 | // https://bugs.llvm.org/show_bug.cgi?id=36796 | |
45 | use cmp::Ord; | |
46 | let mut x = self.extract(0); | |
47 | for i in 1..$id::lanes() { | |
48 | x = x.min(self.extract(i)); | |
49 | } | |
50 | x | |
0531ce1d XL |
51 | } |
52 | } | |
83c7162d | 53 | }; |
0531ce1d XL |
54 | } |
55 | ||
56 | #[cfg(test)] | |
57 | macro_rules! test_minmax_reductions { | |
58 | ($id:ident, $elem_ty:ident) => { | |
59 | #[test] | |
83c7162d XL |
60 | fn max_element() { |
61 | use coresimd::simd::$id; | |
0531ce1d | 62 | let v = $id::splat(0 as $elem_ty); |
83c7162d | 63 | assert_eq!(v.max_element(), 0 as $elem_ty); |
0531ce1d | 64 | let v = v.replace(1, 1 as $elem_ty); |
83c7162d | 65 | assert_eq!(v.max_element(), 1 as $elem_ty); |
0531ce1d | 66 | let v = v.replace(0, 2 as $elem_ty); |
83c7162d | 67 | assert_eq!(v.max_element(), 2 as $elem_ty); |
0531ce1d XL |
68 | } |
69 | ||
70 | #[test] | |
83c7162d XL |
71 | fn min_element() { |
72 | use coresimd::simd::$id; | |
0531ce1d | 73 | let v = $id::splat(0 as $elem_ty); |
83c7162d | 74 | assert_eq!(v.min_element(), 0 as $elem_ty); |
0531ce1d | 75 | let v = v.replace(1, 1 as $elem_ty); |
83c7162d | 76 | assert_eq!(v.min_element(), 0 as $elem_ty); |
0531ce1d XL |
77 | let v = $id::splat(1 as $elem_ty); |
78 | let v = v.replace(0, 2 as $elem_ty); | |
83c7162d | 79 | assert_eq!(v.min_element(), 1 as $elem_ty); |
0531ce1d XL |
80 | let v = $id::splat(2 as $elem_ty); |
81 | let v = v.replace(1, 1 as $elem_ty); | |
83c7162d | 82 | assert_eq!(v.min_element(), 1 as $elem_ty); |
0531ce1d | 83 | } |
83c7162d | 84 | }; |
0531ce1d | 85 | } |