]> git.proxmox.com Git - rustc.git/blame - src/stdsimd/coresimd/ppsv/api/minmax_reductions.rs
New upstream version 1.27.1+dfsg1
[rustc.git] / src / stdsimd / coresimd / ppsv / api / minmax_reductions.rs
CommitLineData
83c7162d
XL
1//! Implements portable horizontal arithmetic reductions.
2#![allow(unused)]
0531ce1d
XL
3
4macro_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)]
57macro_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}