#![cfg(target_feature = "sse")]
use super::*;
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn prefetch_t0<T>(addr: &T) {
unsafe { _mm_prefetch(addr as *const T as *const i8, _MM_HINT_T0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn prefetch_t1<T>(addr: &T) {
unsafe { _mm_prefetch(addr as *const T as *const i8, _MM_HINT_T1) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn prefetch_t2<T>(addr: &T) {
unsafe { _mm_prefetch(addr as *const T as *const i8, _MM_HINT_T2) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn prefetch_nta<T>(addr: &T) {
unsafe { _mm_prefetch(addr as *const T as *const i8, _MM_HINT_NTA) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn prefetch_et0<T>(addr: &T) {
unsafe { _mm_prefetch(addr as *const T as *const i8, _MM_HINT_ET0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn prefetch_et1<T>(addr: &T) {
unsafe { _mm_prefetch(addr as *const T as *const i8, _MM_HINT_ET1) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn add_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_add_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn add_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_add_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn bitand_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_and_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn bitandnot_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_andnot_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_eq_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpeq_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_eq_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpeq_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_ge_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpge_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_ge_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpge_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_gt_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpgt_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_gt_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpgt_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_le_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmple_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_le_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmple_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_lt_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmplt_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_lt_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmplt_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_neq_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpneq_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_neq_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpneq_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_nge_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpnge_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_nge_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpnge_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_ngt_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpngt_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_ngt_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpngt_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_nle_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpnle_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_nle_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpnle_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_nlt_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpnlt_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_nlt_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpnlt_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_ordered_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpord_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_ordered_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpord_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_unord_mask_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpunord_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_unord_mask_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_cmpunord_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_eq_i32_m128_s(a: m128, b: m128) -> i32 {
unsafe { _mm_comieq_ss(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_ge_i32_m128_s(a: m128, b: m128) -> i32 {
unsafe { _mm_comige_ss(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_gt_i32_m128_s(a: m128, b: m128) -> i32 {
unsafe { _mm_comigt_ss(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_le_i32_m128_s(a: m128, b: m128) -> i32 {
unsafe { _mm_comile_ss(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_lt_i32_m128_s(a: m128, b: m128) -> i32 {
unsafe { _mm_comilt_ss(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn cmp_neq_i32_m128_s(a: m128, b: m128) -> i32 {
unsafe { _mm_comineq_ss(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn convert_i32_replace_m128_s(a: m128, i: i32) -> m128 {
m128(unsafe { _mm_cvtsi32_ss(a.0, i) })
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn convert_i64_replace_m128_s(a: m128, i: i64) -> m128 {
m128(unsafe { _mm_cvtsi64_ss(a.0, i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn get_f32_from_m128_s(a: m128) -> f32 {
unsafe { _mm_cvtss_f32(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn get_i32_from_m128_s(a: m128) -> i32 {
unsafe { _mm_cvtss_si32(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn get_i64_from_m128_s(a: m128) -> i64 {
unsafe { _mm_cvttss_si64(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn div_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_div_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn div_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_div_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn load_m128(a: &m128) -> m128 {
m128(unsafe { _mm_load_ps(a as *const m128 as *const f32) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::trivially_copy_pass_by_ref)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn load_f32_splat_m128(a: &f32) -> m128 {
m128(unsafe { _mm_load_ps1(a) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::trivially_copy_pass_by_ref)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn load_f32_m128_s(a: &f32) -> m128 {
m128(unsafe { _mm_load_ss(a) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn load_reverse_m128(a: &m128) -> m128 {
m128(unsafe { _mm_loadr_ps(a as *const m128 as *const f32) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn load_unaligned_m128(a: &[f32; 4]) -> m128 {
m128(unsafe { _mm_loadu_ps(a as *const [f32; 4] as *const f32) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn max_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_max_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn max_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_max_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn min_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_min_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn min_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_min_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn move_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_move_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn move_high_low_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_movehl_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn move_low_high_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_movelh_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn move_mask_m128(a: m128) -> i32 {
unsafe { _mm_movemask_ps(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn mul_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_mul_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn mul_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_mul_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn bitor_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_or_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn reciprocal_m128(a: m128) -> m128 {
m128(unsafe { _mm_rcp_ps(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn reciprocal_m128_s(a: m128) -> m128 {
m128(unsafe { _mm_rcp_ss(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn reciprocal_sqrt_m128(a: m128) -> m128 {
m128(unsafe { _mm_rsqrt_ps(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn reciprocal_sqrt_m128_s(a: m128) -> m128 {
m128(unsafe { _mm_rsqrt_ss(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn set_m128(three: f32, two: f32, one: f32, zero: f32) -> m128 {
m128(unsafe { _mm_set_ps(three, two, one, zero) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn set_m128_s(low: f32) -> m128 {
m128(unsafe { _mm_set_ss(low) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn set_splat_m128(all: f32) -> m128 {
m128(unsafe { _mm_set1_ps(all) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn set_reversed_m128(zero: f32, one: f32, two: f32, three: f32) -> m128 {
m128(unsafe { _mm_setr_ps(zero, one, two, three) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn zeroed_m128() -> m128 {
m128(unsafe { _mm_setzero_ps() })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn shuffle_abi_f32_all_m128<const MASK: i32>(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_shuffle_ps(a.0, b.0, MASK) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn sqrt_m128(a: m128) -> m128 {
m128(unsafe { _mm_sqrt_ps(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn sqrt_m128_s(a: m128) -> m128 {
m128(unsafe { _mm_sqrt_ss(a.0) })
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn store_m128(r: &mut m128, a: m128) {
unsafe { _mm_store_ps(r as *mut m128 as *mut f32, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn store_m128_s(r: &mut f32, a: m128) {
unsafe { _mm_store_ss(r as *mut f32, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn store_splat_m128(r: &mut m128, a: m128) {
unsafe { _mm_store1_ps(r as *mut m128 as *mut f32, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn store_reverse_m128(r: &mut m128, a: m128) {
unsafe { _mm_storer_ps(r as *mut m128 as *mut f32, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn store_unaligned_m128(r: &mut [f32; 4], a: m128) {
unsafe { _mm_storeu_ps(r.as_mut_ptr(), a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn sub_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_sub_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn sub_m128_s(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_sub_ss(a.0, b.0) })
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn transpose_four_m128(a: &mut m128, b: &mut m128, c: &mut m128, d: &mut m128) {
unsafe { _MM_TRANSPOSE4_PS(&mut a.0, &mut b.0, &mut c.0, &mut d.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn unpack_high_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_unpackhi_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn unpack_low_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_unpacklo_ps(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse")))]
pub fn bitxor_m128(a: m128, b: m128) -> m128 {
m128(unsafe { _mm_xor_ps(a.0, b.0) })
}
impl Add for m128 {
type Output = Self;
#[inline(always)]
fn add(self, rhs: Self) -> Self {
add_m128(self, rhs)
}
}
impl AddAssign for m128 {
#[inline(always)]
fn add_assign(&mut self, rhs: Self) {
*self = *self + rhs;
}
}
impl BitAnd for m128 {
type Output = Self;
#[inline(always)]
fn bitand(self, rhs: Self) -> Self {
bitand_m128(self, rhs)
}
}
impl BitAndAssign for m128 {
#[inline(always)]
fn bitand_assign(&mut self, rhs: Self) {
*self = *self & rhs;
}
}
impl BitOr for m128 {
type Output = Self;
#[inline(always)]
fn bitor(self, rhs: Self) -> Self {
bitor_m128(self, rhs)
}
}
impl BitOrAssign for m128 {
#[inline(always)]
fn bitor_assign(&mut self, rhs: Self) {
*self = *self | rhs;
}
}
impl BitXor for m128 {
type Output = Self;
#[inline(always)]
fn bitxor(self, rhs: Self) -> Self {
bitxor_m128(self, rhs)
}
}
impl BitXorAssign for m128 {
#[inline(always)]
fn bitxor_assign(&mut self, rhs: Self) {
*self = *self ^ rhs;
}
}
impl Div for m128 {
type Output = Self;
#[inline(always)]
fn div(self, rhs: Self) -> Self {
div_m128(self, rhs)
}
}
impl DivAssign for m128 {
#[inline(always)]
fn div_assign(&mut self, rhs: Self) {
*self = *self / rhs;
}
}
impl Mul for m128 {
type Output = Self;
#[inline(always)]
fn mul(self, rhs: Self) -> Self {
mul_m128(self, rhs)
}
}
impl MulAssign for m128 {
#[inline(always)]
fn mul_assign(&mut self, rhs: Self) {
*self = *self * rhs;
}
}
impl Neg for m128 {
type Output = Self;
#[inline(always)]
fn neg(self) -> Self {
sub_m128(zeroed_m128(), self)
}
}
impl Not for m128 {
type Output = Self;
#[inline(always)]
fn not(self) -> Self {
let all_bits = set_splat_m128(f32::from_bits(u32::MAX));
self ^ all_bits
}
}
impl Sub for m128 {
type Output = Self;
#[inline(always)]
fn sub(self, rhs: Self) -> Self {
sub_m128(self, rhs)
}
}
impl SubAssign for m128 {
#[inline(always)]
fn sub_assign(&mut self, rhs: Self) {
*self = *self - rhs;
}
}
impl PartialEq for m128 {
#[inline(always)]
fn eq(&self, other: &Self) -> bool {
move_mask_m128(cmp_eq_mask_m128(*self, *other)) == 0b1111
}
}