use super::*;
#[inline(always)]
pub unsafe fn _mm_cvtepu32_psx_v2(x: __m128i) -> __m128 {
let xmm0 = x;
let xmm1 = _mm_set1_epu32x(0x4B000000);
let xmm1 = _mm_blend_epi16(xmm0, xmm1, 170);
let xmm0 = _mm_srli_epi32(xmm0, 16);
let xmm2 = _mm_set1_epu32x(0x53000000);
let xmm0 = _mm_castsi128_ps(_mm_blend_epi16(xmm0, xmm2, 170));
let xmm2 = _mm_set1_ps(f32::from_bits(0x53000080));
let xmm0 = _mm_sub_ps(xmm0, xmm2);
let xmm0 = _mm_add_ps(_mm_castsi128_ps(xmm1), xmm0);
xmm0
}
#[inline(always)]
pub unsafe fn _mm_cvtpd_epi64x_v2(x: __m128d) -> __m128i {
let x0 = _mm_cvttsd_si64(x);
let x1 = _mm_cvttsd_si64(_mm_shuffle_pd(x, x, 0b11));
_mm_set_epi64x(x1, x0)
}
#[inline(always)]
#[rustfmt::skip]
pub unsafe fn _mm_cvtepu64_pdx_v2(v: __m128i) -> __m128d {
let magic_i_lo = _mm_set1_epi64x(0x4330000000000000); let magic_i_hi32 = _mm_set1_epi64x(0x4530000000000000); let magic_i_all = _mm_set1_epi64x(0x4530000000100000); let magic_d_all = _mm_castsi128_pd(magic_i_all);
let v_lo = _mm_blend_epi16(magic_i_lo, v, 0b00110011); let mut v_hi = _mm_srli_epi64(v, 32); v_hi = _mm_xor_si128(v_hi, magic_i_hi32); let v_hi_dbl = _mm_sub_pd(_mm_castsi128_pd(v_hi), magic_d_all); _mm_add_pd(v_hi_dbl, _mm_castsi128_pd(v_lo)) }
#[inline(always)]
#[rustfmt::skip]
pub unsafe fn _mm_cvtepi64_pdx_v2(v: __m128i) -> __m128d {
let magic_i_lo = _mm_set1_epi64x(0x4330000000000000); let magic_i_hi32 = _mm_set1_epi64x(0x4530000080000000); let magic_i_all = _mm_set1_epi64x(0x4530000080100000); let magic_d_all = _mm_castsi128_pd(magic_i_all);
let v_lo = _mm_blend_epi16(magic_i_lo, v, 0b00110011); let mut v_hi = _mm_srli_epi64(v, 32); v_hi = _mm_xor_si128(v_hi, magic_i_hi32); let v_hi_dbl = _mm_sub_pd(_mm_castsi128_pd(v_hi), magic_d_all); _mm_add_pd(v_hi_dbl, _mm_castsi128_pd(v_lo)) }
#[inline(always)]
pub unsafe fn _mm_cvtps_epu32x_v2(x: __m128) -> __m128i {
let xmm0 = x;
let xmm1 = _mm_set1_ps(f32::from_bits(0x4f000000));
let xmm2 = _mm_cmplt_ps(xmm0, xmm1);
let xmm1 = _mm_sub_ps(xmm0, xmm1);
let xmm1 = _mm_cvttps_epi32(xmm1);
let xmm3 = _mm_set1_epu32x(0x80000000);
let xmm1 = _mm_xor_si128(xmm1, xmm3);
let xmm0 = _mm_cvttps_epi32(xmm0);
let xmm0 = _mm_blendv_ps(_mm_castsi128_ps(xmm1), _mm_castsi128_ps(xmm0), xmm2);
_mm_castps_si128(xmm0)
}
#[inline(always)]
pub unsafe fn _mm_cvtboolx4_to_epi32_mask_v2(
value: generic_array::GenericArray<bool, generic_array::typenum::U4>,
) -> __m128i {
let value: [u8; 4] = core::mem::transmute(value);
#[rustfmt::skip]
let mask = _mm_setr_epi8(
value[0] as i8,
value[1] as i8,
value[2] as i8,
value[3] as i8,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
);
_mm_cmpgt_epi32(_mm_cvtepi8_epi32(mask), _mm_setzero_si128())
}
#[inline(always)]
pub unsafe fn _mm_cvtboolx2_to_epi64_mask_v2(
value: generic_array::GenericArray<bool, generic_array::typenum::U2>,
) -> __m128i {
let value: [u8; 2] = core::mem::transmute(value);
#[rustfmt::skip]
let mask = _mm_setr_epi8(
value[0] as i8,
value[1] as i8,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
);
_mm_cmpgt_epi64(_mm_cvtepi8_epi64(mask), _mm_setzero_si128())
}
#[inline(always)]
pub unsafe fn _mm_cvtepi64_epi32x_v2(a: __m128i, b: __m128i) -> __m128i {
let a_shuffled = _mm_shuffle_epi32::<{ MM_SHUFFLE!(3, 2, 2, 0) }>(a);
let b_shuffled = _mm_shuffle_epi32::<{ MM_SHUFFLE!(2, 0, 1, 0) }>(b);
_mm_blend_epi16(a_shuffled, b_shuffled, 0xF0)
}
#[inline(always)]
pub unsafe fn _mm_narrow_word_to_byte_maskx_v2() -> __m128i {
_mm_setr_epi8(0, 2, 4, 6, 8, 10, 12, 14, -1, -1, -1, -1, -1, -1, -1, -1)
}
#[inline(always)]
pub unsafe fn _mm_narrow_dword_to_byte_maskx_v2() -> __m128i {
_mm_setr_epi8(0, 4, 8, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
}
#[inline(always)]
pub unsafe fn _mm_narrow_dword_to_word_maskx_v2() -> __m128i {
_mm_setr_epi8(0, 1, 4, 5, 8, 9, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1)
}
#[inline(always)]
pub unsafe fn _mm_narrow_qword_to_byte_maskx_v2() -> __m128i {
_mm_setr_epi8(0, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
}
#[inline(always)]
pub unsafe fn _mm_narrow_qword_to_word_maskx_v2() -> __m128i {
_mm_setr_epi8(0, 1, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
}
#[inline(always)]
pub unsafe fn _mm_cvt2epi16_epi8x_v2(v: [__m128i; 2]) -> __m128i {
let mask = _mm_narrow_word_to_byte_maskx_v2();
let lo = _mm_shuffle_epi8(v[0], mask); let hi = _mm_shuffle_epi8(v[1], mask);
_mm_unpacklo_epi64(lo, hi) }
#[inline(always)]
pub unsafe fn _mm_cvt4epi32_epi8x_v2(v: [__m128i; 4]) -> __m128i {
let mask = _mm_narrow_dword_to_byte_maskx_v2();
let a = _mm_shuffle_epi8(v[0], mask);
let b = _mm_shuffle_epi8(v[1], mask);
let c = _mm_shuffle_epi8(v[2], mask);
let d = _mm_shuffle_epi8(v[3], mask);
let ab = _mm_unpacklo_epi32(a, b); let cd = _mm_unpacklo_epi32(c, d);
_mm_unpacklo_epi64(ab, cd) }
#[inline(always)]
pub unsafe fn _mm_cvt4epi64_epi8x_v2(v: [__m128i; 4]) -> __m128i {
let mask = _mm_narrow_qword_to_byte_maskx_v2();
let a = _mm_shuffle_epi8(v[0], mask); let b = _mm_shuffle_epi8(v[1], mask);
let c = _mm_shuffle_epi8(v[2], mask);
let d = _mm_shuffle_epi8(v[3], mask);
let ab = _mm_unpacklo_epi16(a, b); let cd = _mm_unpacklo_epi16(c, d);
_mm_unpacklo_epi32(ab, cd) }
#[inline(always)]
pub unsafe fn _mm_cvt8epi64_epi8x_v2(v: [__m128i; 8]) -> __m128i {
let lo = _mm_cvt4epi64_epi8x_v2([v[0], v[1], v[2], v[3]]); let hi = _mm_cvt4epi64_epi8x_v2([v[4], v[5], v[6], v[7]]);
_mm_unpacklo_epi64(lo, hi) }
#[inline(always)]
pub unsafe fn _mm_cvt4epi64_epi16x_v2(v: [__m128i; 4]) -> __m128i {
let mask = _mm_narrow_qword_to_word_maskx_v2();
let a = _mm_shuffle_epi8(v[0], mask); let b = _mm_shuffle_epi8(v[1], mask);
let c = _mm_shuffle_epi8(v[2], mask);
let d = _mm_shuffle_epi8(v[3], mask);
let ab = _mm_unpacklo_epi32(a, b); let cd = _mm_unpacklo_epi32(c, d);
_mm_unpacklo_epi64(ab, cd) }
#[inline(always)]
pub unsafe fn _mm_cvtepi16_4epi64x_v2(v: __m128i) -> [__m128i; 4] {
[
_mm_cvtepi16_epi64(v),
_mm_cvtepi16_epi64(_mm_srli_si128(v, 4)),
_mm_cvtepi16_epi64(_mm_srli_si128(v, 8)),
_mm_cvtepi16_epi64(_mm_srli_si128(v, 12)),
]
}
#[inline(always)]
pub unsafe fn _mm_cvtepu16_4epi64x_v2(v: __m128i) -> [__m128i; 4] {
[
_mm_cvtepu16_epi64(v),
_mm_cvtepu16_epi64(_mm_srli_si128(v, 4)),
_mm_cvtepu16_epi64(_mm_srli_si128(v, 8)),
_mm_cvtepu16_epi64(_mm_srli_si128(v, 12)),
]
}
#[inline(always)]
pub unsafe fn _mm_cvtepi32_2pdx_v2(v: __m128i) -> [__m128d; 2] {
let lo = _mm_cvtepi32_pd(v); let hi = _mm_cvtepi32_pd(_mm_srli_si128(v, 8)); [lo, hi]
}
#[inline(always)]
pub unsafe fn _mm_cvtt2pd_epi32x_v2(v: [__m128d; 2]) -> __m128i {
let lo = _mm_cvttpd_epi32(v[0]); let hi = _mm_cvttpd_epi32(v[1]);
_mm_unpacklo_epi64(lo, hi) }
#[inline(always)]
pub unsafe fn _mm_cvtpd_epu32x_v2(xmm0: __m128d) -> __m128i {
let bound = _mm_set1_pd(f64::from_bits(0x41e0000000000000));
let cmp_mask = _mm_cmplt_pd(xmm0, bound);
let mask_32 = _mm_shuffle_epi32(_mm_castpd_si128(cmp_mask), 0b11_11_10_00);
let offset_f64 = _mm_sub_pd(xmm0, bound);
let offset_i32 = _mm_cvttpd_epi32(offset_f64);
let sign_flip = _mm_set1_epi32(0x80000000u32 as i32);
let offset_converted = _mm_xor_si128(offset_i32, sign_flip);
let direct_converted = _mm_cvttpd_epi32(xmm0);
_mm_or_si128(
_mm_and_si128(mask_32, direct_converted),
_mm_andnot_si128(mask_32, offset_converted),
)
}