use crate::simd::intrinsics; use crate::simd::{LaneCount, Mask, MaskElement, Simd, SimdElement, SupportedLaneCount}; impl Mask where T: MaskElement, LaneCount: SupportedLaneCount, { /// Choose lanes from two vectors. /// /// For each lane in the mask, choose the corresponding lane from `true_values` if /// that lane mask is true, and `false_values` if that lane mask is false. /// /// # Examples /// ``` /// # #![feature(portable_simd)] /// # use core::simd::{Simd, Mask}; /// let a = Simd::from_array([0, 1, 2, 3]); /// let b = Simd::from_array([4, 5, 6, 7]); /// let mask = Mask::from_array([true, false, false, true]); /// let c = mask.select(a, b); /// assert_eq!(c.to_array(), [0, 5, 6, 3]); /// ``` #[inline] #[must_use = "method returns a new vector and does not mutate the original inputs"] pub fn select( self, true_values: Simd, false_values: Simd, ) -> Simd where U: SimdElement, { // Safety: The mask has been cast to a vector of integers, // and the operands to select between are vectors of the same type and length. unsafe { intrinsics::simd_select(self.to_int(), true_values, false_values) } } /// Choose lanes from two masks. /// /// For each lane in the mask, choose the corresponding lane from `true_values` if /// that lane mask is true, and `false_values` if that lane mask is false. /// /// # Examples /// ``` /// # #![feature(portable_simd)] /// # use core::simd::Mask; /// let a = Mask::::from_array([true, true, false, false]); /// let b = Mask::::from_array([false, false, true, true]); /// let mask = Mask::::from_array([true, false, false, true]); /// let c = mask.select_mask(a, b); /// assert_eq!(c.to_array(), [true, false, true, false]); /// ``` #[inline] #[must_use = "method returns a new mask and does not mutate the original inputs"] pub fn select_mask(self, true_values: Self, false_values: Self) -> Self { self & true_values | !self & false_values } }