| //! Vertical (lane-wise) vector comparisons returning vector masks. |
| |
| macro_rules! impl_cmp_vertical { |
| ( |
| [$elem_ty:ident; $elem_count:expr]: |
| $id:ident, |
| $mask_ty:ident, |
| $is_mask:expr,($true:expr, $false:expr) | $test_tt:tt |
| ) => { |
| impl $id { |
| /// Lane-wise equality comparison. |
| #[inline] |
| pub fn eq(self, other: Self) -> $mask_ty { |
| use crate::llvm::simd_eq; |
| Simd(unsafe { simd_eq(self.0, other.0) }) |
| } |
| |
| /// Lane-wise inequality comparison. |
| #[inline] |
| pub fn ne(self, other: Self) -> $mask_ty { |
| use crate::llvm::simd_ne; |
| Simd(unsafe { simd_ne(self.0, other.0) }) |
| } |
| |
| /// Lane-wise less-than comparison. |
| #[inline] |
| pub fn lt(self, other: Self) -> $mask_ty { |
| use crate::llvm::{simd_gt, simd_lt}; |
| if $is_mask { |
| Simd(unsafe { simd_gt(self.0, other.0) }) |
| } else { |
| Simd(unsafe { simd_lt(self.0, other.0) }) |
| } |
| } |
| |
| /// Lane-wise less-than-or-equals comparison. |
| #[inline] |
| pub fn le(self, other: Self) -> $mask_ty { |
| use crate::llvm::{simd_ge, simd_le}; |
| if $is_mask { |
| Simd(unsafe { simd_ge(self.0, other.0) }) |
| } else { |
| Simd(unsafe { simd_le(self.0, other.0) }) |
| } |
| } |
| |
| /// Lane-wise greater-than comparison. |
| #[inline] |
| pub fn gt(self, other: Self) -> $mask_ty { |
| use crate::llvm::{simd_gt, simd_lt}; |
| if $is_mask { |
| Simd(unsafe { simd_lt(self.0, other.0) }) |
| } else { |
| Simd(unsafe { simd_gt(self.0, other.0) }) |
| } |
| } |
| |
| /// Lane-wise greater-than-or-equals comparison. |
| #[inline] |
| pub fn ge(self, other: Self) -> $mask_ty { |
| use crate::llvm::{simd_ge, simd_le}; |
| if $is_mask { |
| Simd(unsafe { simd_le(self.0, other.0) }) |
| } else { |
| Simd(unsafe { simd_ge(self.0, other.0) }) |
| } |
| } |
| } |
| test_if!{ |
| $test_tt: |
| paste::item! { |
| pub mod [<$id _cmp_vertical>] { |
| use super::*; |
| #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] |
| fn cmp() { |
| let a = $id::splat($false); |
| let b = $id::splat($true); |
| |
| let r = a.lt(b); |
| let e = $mask_ty::splat(true); |
| assert!(r == e); |
| let r = a.le(b); |
| assert!(r == e); |
| |
| let e = $mask_ty::splat(false); |
| let r = a.gt(b); |
| assert!(r == e); |
| let r = a.ge(b); |
| assert!(r == e); |
| let r = a.eq(b); |
| assert!(r == e); |
| |
| let mut a = a; |
| let mut b = b; |
| let mut e = e; |
| for i in 0..$id::lanes() { |
| if i % 2 == 0 { |
| a = a.replace(i, $false); |
| b = b.replace(i, $true); |
| e = e.replace(i, true); |
| } else { |
| a = a.replace(i, $true); |
| b = b.replace(i, $false); |
| e = e.replace(i, false); |
| } |
| } |
| let r = a.lt(b); |
| assert!(r == e); |
| } |
| } |
| } |
| } |
| }; |
| } |