#![cfg(target_feature = "sse2")]
use super::*;
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_add_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_add_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_i32_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_add_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_i64_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_add_epi64(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_add_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_add_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[rustfmt::skip]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_saturating_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_adds_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_saturating_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_adds_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[rustfmt::skip]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_saturating_u8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_adds_epu8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn add_saturating_u16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_adds_epu16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitand_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_and_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitand_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_and_si128(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitandnot_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_andnot_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitandnot_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_andnot_si128(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[rustfmt::skip]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn average_u8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_avg_epu8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn average_u16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_avg_epu16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn byte_shl_imm_u128_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_bslli_si128(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn byte_shr_imm_u128_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_bsrli_si128(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cast_to_m128_from_m128d(a: m128d) -> m128 {
m128(unsafe { _mm_castpd_ps(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cast_to_m128i_from_m128d(a: m128d) -> m128i {
m128i(unsafe { _mm_castpd_si128(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cast_to_m128d_from_m128(a: m128) -> m128d {
m128d(unsafe { _mm_castps_pd(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cast_to_m128i_from_m128(a: m128) -> m128i {
m128i(unsafe { _mm_castps_si128(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cast_to_m128d_from_m128i(a: m128i) -> m128d {
m128d(unsafe { _mm_castsi128_pd(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cast_to_m128_from_m128i(a: m128i) -> m128 {
m128(unsafe { _mm_castsi128_ps(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_eq_mask_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmpeq_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_eq_mask_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmpeq_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_eq_mask_i32_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmpeq_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_eq_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpeq_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_eq_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpeq_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_ge_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpge_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_ge_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpge_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_gt_mask_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmpgt_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_gt_mask_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmpgt_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_gt_mask_i32_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmpgt_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_gt_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpgt_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_gt_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpgt_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_le_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmple_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_le_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmple_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_lt_mask_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmplt_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_lt_mask_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmplt_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_lt_mask_i32_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_cmplt_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_lt_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmplt_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_lt_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmplt_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_neq_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpneq_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_neq_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpneq_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_nge_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpnge_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_nge_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpnge_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_ngt_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpngt_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_ngt_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpngt_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_nle_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpnle_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_nle_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpnle_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_nlt_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpnlt_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_nlt_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpnlt_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_ordered_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpord_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_ordered_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpord_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_unord_mask_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpunord_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_unord_mask_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_cmpunord_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_eq_i32_m128d_s(a: m128d, b: m128d) -> i32 {
unsafe { _mm_comieq_sd(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_ge_i32_m128d_s(a: m128d, b: m128d) -> i32 {
unsafe { _mm_comige_sd(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_gt_i32_m128d_s(a: m128d, b: m128d) -> i32 {
unsafe { _mm_comigt_sd(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_le_i32_m128d_s(a: m128d, b: m128d) -> i32 {
unsafe { _mm_comile_sd(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_lt_i32_m128d_s(a: m128d, b: m128d) -> i32 {
unsafe { _mm_comilt_sd(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn cmp_neq_i32_m128d_s(a: m128d, b: m128d) -> i32 {
unsafe { _mm_comineq_sd(a.0, b.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_to_m128d_from_lower2_i32_m128i(a: m128i) -> m128d {
m128d(unsafe { _mm_cvtepi32_pd(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_to_m128_from_i32_m128i(a: m128i) -> m128 {
m128(unsafe { _mm_cvtepi32_ps(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_to_i32_m128i_from_m128d(a: m128d) -> m128i {
m128i(unsafe { _mm_cvtpd_epi32(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_to_m128_from_m128d(a: m128d) -> m128 {
m128(unsafe { _mm_cvtpd_ps(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_to_i32_m128i_from_m128(a: m128) -> m128i {
m128i(unsafe { _mm_cvtps_epi32(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_to_m128d_from_lower2_m128(a: m128) -> m128d {
m128d(unsafe { _mm_cvtps_pd(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn get_f64_from_m128d_s(a: m128d) -> f64 {
unsafe { _mm_cvtsd_f64(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn get_i32_from_m128d_s(a: m128d) -> i32 {
unsafe { _mm_cvtsd_si32(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn get_i64_from_m128d_s(a: m128d) -> i64 {
unsafe { _mm_cvtsd_si64(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_m128d_s_replace_m128_s(a: m128, b: m128d) -> m128 {
m128(unsafe { _mm_cvtsd_ss(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn get_i32_from_m128i_s(a: m128i) -> i32 {
unsafe { _mm_cvtsi128_si32(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn get_i64_from_m128i_s(a: m128i) -> i64 {
unsafe { _mm_cvtsi128_si64(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_i32_replace_m128d_s(a: m128d, i: i32) -> m128d {
m128d(unsafe { _mm_cvtsi32_sd(a.0, i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_i32_m128i_s(i: i32) -> m128i {
m128i(unsafe { _mm_cvtsi32_si128(i) })
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_i64_replace_m128d_s(a: m128d, i: i64) -> m128d {
m128d(unsafe { _mm_cvtsi64_sd(a.0, i) })
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_i64_m128i_s(i: i64) -> m128i {
m128i(unsafe { _mm_cvtsi64_si128(i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn convert_m128_s_replace_m128d_s(a: m128d, b: m128) -> m128d {
m128d(unsafe { _mm_cvtss_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn truncate_m128d_to_m128i(a: m128d) -> m128i {
m128i(unsafe { _mm_cvttpd_epi32(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn truncate_m128_to_m128i(a: m128) -> m128i {
m128i(unsafe { _mm_cvttps_epi32(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn truncate_to_i32_m128d_s(a: m128d) -> i32 {
unsafe { _mm_cvttsd_si32(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg(target_arch = "x86_64")]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn truncate_to_i64_m128d_s(a: m128d) -> i64 {
unsafe { _mm_cvttsd_si64(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn div_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_div_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn div_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_div_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn extract_i16_as_i32_m128i<const LANE: i32>(a: m128i) -> i32 {
unsafe { _mm_extract_epi16(a.0, LANE) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn insert_i16_from_i32_m128i<const LANE: i32>(a: m128i, i: i32) -> m128i {
m128i(unsafe { _mm_insert_epi16(a.0, i, LANE) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_m128d(a: &m128d) -> m128d {
m128d(unsafe { _mm_load_pd(a as *const m128d as *const f64) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::trivially_copy_pass_by_ref)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_f64_splat_m128d(a: &f64) -> m128d {
m128d(unsafe { _mm_load1_pd(a) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::trivially_copy_pass_by_ref)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_f64_m128d_s(a: &f64) -> m128d {
m128d(unsafe { _mm_load_sd(a) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_m128i(a: &m128i) -> m128i {
m128i(unsafe { _mm_load_si128(a as *const m128i as *const __m128i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_replace_high_m128d(a: m128d, b: &f64) -> m128d {
m128d(unsafe { _mm_loadh_pd(a.0, b) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_i64_m128i_s(a: &m128i) -> m128i {
m128i(unsafe { _mm_loadl_epi64(a as *const m128i as *const __m128i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_replace_low_m128d(a: m128d, b: &f64) -> m128d {
m128d(unsafe { _mm_loadl_pd(a.0, b) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_reverse_m128d(a: &m128d) -> m128d {
m128d(unsafe { _mm_loadr_pd(a as *const m128d as *const f64) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_unaligned_m128d(a: &[f64; 2]) -> m128d {
m128d(unsafe { _mm_loadu_pd(a as *const [f64; 2] as *const f64) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::cast_ptr_alignment)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn load_unaligned_m128i(a: &[u8; 16]) -> m128i {
m128i(unsafe { _mm_loadu_si128(a as *const [u8; 16] as *const __m128i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn mul_i16_horizontal_add_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_madd_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn max_u8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_max_epu8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn max_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_max_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn max_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_max_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn max_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_max_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn min_u8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_min_epu8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn min_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_min_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn min_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_min_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn min_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_min_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn copy_i64_m128i_s(a: m128i) -> m128i {
m128i(unsafe { _mm_move_epi64(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn copy_replace_low_f64_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_move_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn move_mask_i8_m128i(a: m128i) -> i32 {
unsafe { _mm_movemask_epi8(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn move_mask_m128d(a: m128d) -> i32 {
unsafe { _mm_movemask_pd(a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn mul_widen_u32_odd_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_mul_epu32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn mul_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_mul_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn mul_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_mul_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn mul_i16_keep_high_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_mulhi_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn mul_u16_keep_high_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_mulhi_epu16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn mul_i16_keep_low_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_mullo_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitor_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_or_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitor_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_or_si128(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn pack_i16_to_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_packs_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn pack_i32_to_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_packs_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn pack_i16_to_u8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_packus_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sum_of_u8_abs_diff_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_sad_epu8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::too_many_arguments)]
#[allow(clippy::many_single_char_names)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_i8_m128i(a: i8, b: i8, c: i8, d: i8, e: i8, f: i8, g: i8, h: i8, i: i8, j: i8, k: i8, l: i8, m: i8, n: i8, o: i8, p: i8) -> m128i {
m128i(unsafe { _mm_set_epi8(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::too_many_arguments)]
#[allow(clippy::many_single_char_names)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_i16_m128i(a: i16, b: i16, c: i16, d: i16, e: i16, f: i16, g: i16, h: i16) -> m128i {
m128i(unsafe { _mm_set_epi16(a, b, c, d, e, f, g, h) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_i32_m128i(a: i32, b: i32, c: i32, d: i32) -> m128i {
m128i(unsafe { _mm_set_epi32(a, b, c, d) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_i64_m128i(a: i64, b: i64) -> m128i {
m128i(unsafe { _mm_set_epi64x(a, b) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_m128d(a: f64, b: f64) -> m128d {
m128d(unsafe { _mm_set_pd(a, b) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_m128d_s(a: f64) -> m128d {
m128d(unsafe { _mm_set_sd(a) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_splat_m128d(a: f64) -> m128d {
m128d(unsafe { _mm_set1_pd(a) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_splat_i8_m128i(i: i8) -> m128i {
m128i(unsafe { _mm_set1_epi8(i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_splat_i16_m128i(i: i16) -> m128i {
m128i(unsafe { _mm_set1_epi16(i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_splat_i32_m128i(i: i32) -> m128i {
m128i(unsafe { _mm_set1_epi32(i) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_splat_i64_m128i(i: i64) -> m128i {
m128i(unsafe { _mm_set1_epi64x(i) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::too_many_arguments)]
#[allow(clippy::many_single_char_names)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_reversed_i8_m128i(a: i8, b: i8, c: i8, d: i8, e: i8, f: i8, g: i8, h: i8, i: i8, j: i8, k: i8, l: i8, m: i8, n: i8, o: i8, p: i8) -> m128i {
m128i(unsafe { _mm_setr_epi8(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) })
}
#[must_use]
#[inline(always)]
#[allow(clippy::too_many_arguments)]
#[allow(clippy::many_single_char_names)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_reversed_i16_m128i(a: i16, b: i16, c: i16, d: i16, e: i16, f: i16, g: i16, h: i16) -> m128i {
m128i(unsafe { _mm_setr_epi16(a, b, c, d, e, f, g, h) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_reversed_i32_m128i(a: i32, b: i32, c: i32, d: i32) -> m128i {
m128i(unsafe { _mm_setr_epi32(a, b, c, d) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn set_reversed_m128d(a: f64, b: f64) -> m128d {
m128d(unsafe { _mm_setr_pd(a, b) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn zeroed_m128i() -> m128i {
m128i(unsafe { _mm_setzero_si128() })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn zeroed_m128d() -> m128d {
m128d(unsafe { _mm_setzero_pd() })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shuffle_ai_f32_all_m128i<const MASK: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_shuffle_epi32(a.0, MASK) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shuffle_abi_f64_all_m128d<const MASK: i32>(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_shuffle_pd(a.0, b.0, MASK) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shuffle_ai_i16_h64all_m128i<const MASK: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_shufflehi_epi16(a.0, MASK) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shuffle_ai_i16_l64all_m128i<const MASK: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_shufflelo_epi16(a.0, MASK) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shl_all_u16_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_sll_epi16(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shl_all_u32_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_sll_epi32(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shl_all_u64_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_sll_epi64(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shl_imm_u16_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_slli_epi16(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shl_imm_u32_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_slli_epi32(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shl_imm_u64_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_slli_epi64(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sqrt_m128d(a: m128d) -> m128d {
m128d(unsafe { _mm_sqrt_pd(a.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sqrt_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_sqrt_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_all_i16_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_sra_epi16(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_all_i32_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_sra_epi32(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_imm_i16_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_srai_epi16(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_imm_i32_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_srai_epi32(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_all_u16_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_srl_epi16(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_all_u32_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_srl_epi32(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_all_u64_m128i(a: m128i, count: m128i) -> m128i {
m128i(unsafe { _mm_srl_epi64(a.0, count.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_imm_u16_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_srli_epi16(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_imm_u32_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_srli_epi32(a.0, IMM) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn shr_imm_u64_m128i<const IMM: i32>(a: m128i) -> m128i {
m128i(unsafe { _mm_srli_epi64(a.0, IMM) })
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_m128d(r: &mut m128d, a: m128d) {
unsafe { _mm_store_pd(r as *mut m128d as *mut f64, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_m128d_s(r: &mut f64, a: m128d) {
unsafe { _mm_store_sd(r as *mut f64, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_splat_m128d(r: &mut m128d, a: m128d) {
unsafe { _mm_store1_pd(r as *mut m128d as *mut f64, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_m128i(r: &mut m128i, a: m128i) {
unsafe { _mm_store_si128(&mut r.0, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_high_m128d_s(r: &mut f64, a: m128d) {
unsafe { _mm_storeh_pd(r as *mut f64, a.0) }
}
#[inline(always)]
#[allow(clippy::cast_ptr_alignment)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_i64_m128i_s(r: &mut i64, a: m128i) {
unsafe { _mm_storel_epi64(r as *mut i64 as *mut __m128i, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_reversed_m128d(r: &mut m128d, a: m128d) {
unsafe { _mm_storer_pd(r as *mut m128d as *mut f64, a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_unaligned_m128d(r: &mut [f64; 2], a: m128d) {
unsafe { _mm_storeu_pd(r.as_mut_ptr(), a.0) }
}
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn store_unaligned_m128i(r: &mut [u8; 16], a: m128i) {
unsafe { _mm_storeu_si128(r.as_mut_ptr().cast(), a.0) }
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_sub_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_sub_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_i32_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_sub_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_i64_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_sub_epi64(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_sub_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_m128d_s(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_sub_sd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_saturating_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_subs_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_saturating_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_subs_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_saturating_u8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_subs_epu8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn sub_saturating_u16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_subs_epu16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_high_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpackhi_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_high_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpackhi_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_high_i32_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpackhi_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_high_i64_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpackhi_epi64(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_high_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_unpackhi_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_low_i8_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpacklo_epi8(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_low_i16_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpacklo_epi16(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_low_i32_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpacklo_epi32(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_low_i64_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_unpacklo_epi64(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn unpack_low_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_unpacklo_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitxor_m128d(a: m128d, b: m128d) -> m128d {
m128d(unsafe { _mm_xor_pd(a.0, b.0) })
}
#[must_use]
#[inline(always)]
#[cfg_attr(docsrs, doc(cfg(target_feature = "sse2")))]
pub fn bitxor_m128i(a: m128i, b: m128i) -> m128i {
m128i(unsafe { _mm_xor_si128(a.0, b.0) })
}
impl Add for m128d {
type Output = Self;
#[inline(always)]
fn add(self, rhs: Self) -> Self {
add_m128d(self, rhs)
}
}
impl AddAssign for m128d {
#[inline(always)]
fn add_assign(&mut self, rhs: Self) {
*self = *self + rhs;
}
}
impl BitAnd for m128d {
type Output = Self;
#[inline(always)]
fn bitand(self, rhs: Self) -> Self {
bitand_m128d(self, rhs)
}
}
impl BitAndAssign for m128d {
#[inline(always)]
fn bitand_assign(&mut self, rhs: Self) {
*self = *self & rhs;
}
}
impl BitOr for m128d {
type Output = Self;
#[inline(always)]
fn bitor(self, rhs: Self) -> Self {
bitor_m128d(self, rhs)
}
}
impl BitOrAssign for m128d {
#[inline(always)]
fn bitor_assign(&mut self, rhs: Self) {
*self = *self | rhs;
}
}
impl BitXor for m128d {
type Output = Self;
#[inline(always)]
fn bitxor(self, rhs: Self) -> Self {
bitxor_m128d(self, rhs)
}
}
impl BitXorAssign for m128d {
#[inline(always)]
fn bitxor_assign(&mut self, rhs: Self) {
*self = *self ^ rhs;
}
}
impl Div for m128d {
type Output = Self;
#[inline(always)]
fn div(self, rhs: Self) -> Self {
div_m128d(self, rhs)
}
}
impl DivAssign for m128d {
#[inline(always)]
fn div_assign(&mut self, rhs: Self) {
*self = *self / rhs;
}
}
impl Mul for m128d {
type Output = Self;
#[inline(always)]
fn mul(self, rhs: Self) -> Self {
mul_m128d(self, rhs)
}
}
impl MulAssign for m128d {
#[inline(always)]
fn mul_assign(&mut self, rhs: Self) {
*self = *self * rhs;
}
}
impl Neg for m128d {
type Output = Self;
#[inline(always)]
fn neg(self) -> Self {
sub_m128d(zeroed_m128d(), self)
}
}
impl Not for m128d {
type Output = Self;
#[inline(always)]
fn not(self) -> Self {
let all_bits = set_splat_m128d(f64::from_bits(u64::MAX));
self ^ all_bits
}
}
impl Sub for m128d {
type Output = Self;
#[inline(always)]
fn sub(self, rhs: Self) -> Self {
sub_m128d(self, rhs)
}
}
impl SubAssign for m128d {
#[inline(always)]
fn sub_assign(&mut self, rhs: Self) {
*self = *self - rhs;
}
}
impl PartialEq for m128d {
#[inline(always)]
fn eq(&self, other: &Self) -> bool {
move_mask_m128d(cmp_eq_mask_m128d(*self, *other)) == 0b11
}
}
impl BitAnd for m128i {
type Output = Self;
#[inline(always)]
fn bitand(self, rhs: Self) -> Self {
bitand_m128i(self, rhs)
}
}
impl BitAndAssign for m128i {
#[inline(always)]
fn bitand_assign(&mut self, rhs: Self) {
*self = *self & rhs;
}
}
impl BitOr for m128i {
type Output = Self;
#[inline(always)]
fn bitor(self, rhs: Self) -> Self {
bitor_m128i(self, rhs)
}
}
impl BitOrAssign for m128i {
#[inline(always)]
fn bitor_assign(&mut self, rhs: Self) {
*self = *self | rhs;
}
}
impl BitXor for m128i {
type Output = Self;
#[inline(always)]
fn bitxor(self, rhs: Self) -> Self {
bitxor_m128i(self, rhs)
}
}
impl BitXorAssign for m128i {
#[inline(always)]
fn bitxor_assign(&mut self, rhs: Self) {
*self = *self ^ rhs;
}
}
impl Not for m128i {
type Output = Self;
#[inline(always)]
fn not(self) -> Self {
let all_bits = set_splat_i32_m128i(-1);
self ^ all_bits
}
}
impl PartialEq for m128i {
#[inline(always)]
fn eq(&self, other: &Self) -> bool {
move_mask_i8_m128i(cmp_eq_mask_i8_m128i(*self, *other)) == 0b11111111_11111111
}
}
impl Eq for m128i {}