use super::*;
#[inline(always)]
pub unsafe fn _mm_cvtepu32_psx_v1(x: __m128i) -> __m128 {
let lo = _mm_or_si128(_mm_and_si128(x, _mm_set1_epi32(0xFFFF)), _mm_set1_epu32x(0x4B000000));
let hi = _mm_or_si128(_mm_srli_epi32(x, 16), _mm_set1_epu32x(0x53000000));
let hi = _mm_sub_ps(_mm_castsi128_ps(hi), _mm_set1_ps(f32::from_bits(0x53000080)));
_mm_add_ps(_mm_castsi128_ps(lo), hi)
}
#[inline(always)]
pub unsafe fn _mm_cvtps_epu32x_v1(x: __m128) -> __m128i {
let bound = _mm_set1_ps(f32::from_bits(0x4f000000)); let in_range = _mm_cmplt_ps(x, bound);
let offset = _mm_xor_si128(_mm_cvttps_epi32(_mm_sub_ps(x, bound)), _mm_set1_epu32x(0x80000000));
let direct = _mm_cvttps_epi32(x);
_mm_castps_si128(_mm_blendv_psx_v1(
_mm_castsi128_ps(offset),
_mm_castsi128_ps(direct),
in_range,
))
}
#[inline(always)]
pub unsafe fn _mm_cvtpd_epu32x_v1(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_converted = _mm_xor_si128(
_mm_cvttpd_epi32(_mm_sub_pd(xmm0, bound)),
_mm_set1_epi32(0x80000000u32 as i32),
);
let direct_converted = _mm_cvttpd_epi32(xmm0);
_mm_or_si128(
_mm_and_si128(mask_32, direct_converted),
_mm_andnot_si128(mask_32, offset_converted),
)
}
#[inline(always)]
#[cfg(target_arch = "x86_64")]
pub unsafe fn _mm_cvtpd_epi64x_v1(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)]
#[cfg(target_arch = "x86_64")]
pub unsafe fn _mm_cvtpd_epu64x_v1(x: __m128d) -> __m128i {
let bound = _mm_set1_pd(9223372036854775808.0); let big = _mm_cmpge_pd(x, bound);
let xs = _mm_sub_pd(x, _mm_and_pd(big, bound));
_mm_or_si128(
_mm_cvtpd_epi64x_v1(xs),
_mm_and_si128(_mm_castpd_si128(big), _mm_set1_epi64x(i64::MIN)),
)
}
#[inline(always)]
pub unsafe fn _mm_cvtps_epi32_satx_v1(x: __m128) -> __m128i {
let t = _mm_cvttps_epi32(x);
let hi = _mm_castps_si128(_mm_cmpge_ps(x, _mm_set1_ps(2147483648.0))); let nan = _mm_castps_si128(_mm_cmpunord_ps(x, x));
_mm_andnot_si128(nan, _mm_xor_si128(t, hi))
}
#[inline(always)]
pub unsafe fn _mm_cvtps_epu32_satx_v1(x: __m128) -> __m128i {
let x0 = _mm_max_ps(x, _mm_setzero_ps());
let t = _mm_cvtps_epu32x_v1(x0);
let hi = _mm_castps_si128(_mm_cmpge_ps(x0, _mm_set1_ps(4294967296.0)));
_mm_or_si128(t, hi)
}
#[inline(always)]
#[cfg(target_arch = "x86_64")]
pub unsafe fn _mm_cvtpd_epi64_satx_v1(x: __m128d) -> __m128i {
let t = _mm_cvtpd_epi64x_v1(x);
let hi = _mm_castpd_si128(_mm_cmpge_pd(x, _mm_set1_pd(9223372036854775808.0))); let nan = _mm_castpd_si128(_mm_cmpunord_pd(x, x));
_mm_andnot_si128(nan, _mm_xor_si128(t, hi))
}
#[inline(always)]
#[cfg(target_arch = "x86_64")]
pub unsafe fn _mm_cvtpd_epu64_satx_v1(x: __m128d) -> __m128i {
let x0 = _mm_max_pd(x, _mm_setzero_pd()); let t = _mm_cvtpd_epu64x_v1(x0);
let hi = _mm_castpd_si128(_mm_cmpge_pd(x0, _mm_set1_pd(18446744073709551616.0)));
_mm_or_si128(t, hi)
}
#[inline(always)]
#[rustfmt::skip]
pub unsafe fn _mm_cvtepu64_pdx_v1(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_or_si128(_mm_and_si128(v, _mm_set1_epi64x(0xFFFFFFFF)), magic_i_lo);
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_v1(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_or_si128(_mm_and_si128(v, _mm_set1_epi64x(0xFFFFFFFF)), magic_i_lo);
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_cvtepu32_pdx_v1(v: __m128i) -> __m128d {
let magic_i = _mm_set1_epi64x(0x4330000000000000u64 as i64); let zext = _mm_cvtepu32_epi64x_v1(v);
let biased = _mm_or_si128(zext, magic_i);
_mm_sub_pd(_mm_castsi128_pd(biased), _mm_castsi128_pd(magic_i))
}
#[inline(always)]
pub unsafe fn _mm_cvtepi32_epi64x_v1(v: __m128i) -> __m128i {
_mm_unpacklo_epi32(v, _mm_srai_epi32(v, 31))
}
#[inline(always)]
pub unsafe fn _mm_cvtepu32_epi64x_v1(v: __m128i) -> __m128i {
_mm_unpacklo_epi32(v, _mm_setzero_si128())
}
#[inline(always)]
pub unsafe fn _mm_cvtboolx4_to_epi32_mask_v1(
value: generic_array::GenericArray<bool, generic_array::typenum::U4>,
) -> __m128i {
_mm_setr_epi32(
-(value[0] as i32),
-(value[1] as i32),
-(value[2] as i32),
-(value[3] as i32),
)
}
#[inline(always)]
pub unsafe fn _mm_cvtboolx2_to_epi64_mask_v1(
value: generic_array::GenericArray<bool, generic_array::typenum::U2>,
) -> __m128i {
_mm_setr_epi64x(-(value[0] as i64), -(value[1] as i64))
}
#[inline(always)]
pub unsafe fn _mm_extract_epi32x_v1<const IMM8: i32>(v: __m128i) -> i32 {
_mm_cvtsi128_si32(_mm_shuffle_epi32::<IMM8>(v))
}
#[inline(always)]
pub unsafe fn _mm_extract_psx_v1<const IMM8: i32>(v: __m128) -> i32 {
_mm_extract_epi32x_v1::<IMM8>(_mm_castps_si128(v))
}
#[inline(always)]
pub unsafe fn _mm_cvtpd_epi64x_limited_v1(mut x: __m128d) -> __m128i {
let m = _mm_set1_pd(0x0018000000000000u64 as i64 as f64);
x = _mm_add_pd(x, m);
_mm_sub_epi64(_mm_castpd_si128(x), _mm_castpd_si128(m))
}
#[inline(always)]
pub unsafe fn _mm_cvtpd_epu64x_limited_v1(x: __m128d) -> __m128i {
let m = _mm_set1_pd(0x0010000000000000u64 as i64 as f64);
_mm_castpd_si128(_mm_xor_pd(_mm_add_pd(x, m), m))
}
#[inline(always)]
pub unsafe fn _mm_cvtepi64_pdx_limited_v1(x: __m128i) -> __m128d {
let m = _mm_set1_pd(0x0018000000000000u64 as i64 as f64);
_mm_sub_pd(_mm_castsi128_pd(_mm_add_epi64(x, _mm_castpd_si128(m))), m)
}
#[inline(always)]
pub unsafe fn _mm_cvtepu64_pdx_limited_v1(x: __m128i) -> __m128d {
let m = _mm_set1_pd(0x0010000000000000u64 as i64 as f64);
_mm_sub_pd(_mm_castsi128_pd(_mm_or_si128(x, _mm_castpd_si128(m))), m)
}
#[inline(always)]
pub unsafe fn _mm_cvtepi64_epi32x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), 0b10_00_10_00))
}
#[inline(always)]
pub unsafe fn _mm_signbits_epi8x_v1(v: __m128i) -> __m128i {
_mm_cmpgt_epi8(_mm_setzero_si128(), v)
}
#[inline(always)]
pub unsafe fn _mm_cvtepi8_epi16x_v1(v: __m128i) -> __m128i {
_mm_unpacklo_epi8(v, _mm_signbits_epi8x_v1(v))
}
#[inline(always)]
pub unsafe fn _mm_cvtepu8_epi16x_v1(v: __m128i) -> __m128i {
_mm_unpacklo_epi8(v, _mm_setzero_si128())
}
#[inline(always)]
pub unsafe fn _mm_cvtepi16_epi8x_v1(v: __m128i) -> __m128i {
let mut a = [0i16; 8];
_mm_storeu_si128(a.as_mut_ptr() as *mut _, v);
_mm_setr_epi8(
a[0] as i8, a[1] as i8, a[2] as i8, a[3] as i8, a[4] as i8, a[5] as i8, a[6] as i8, a[7] as i8, 0, 0, 0, 0, 0,
0, 0, 0,
)
}
#[inline(always)]
pub unsafe fn _mm_cvt2epi16_epi8x_v1(v: [__m128i; 2]) -> __m128i {
let mut lo = [0i16; 8];
let mut hi = [0i16; 8];
_mm_storeu_si128(lo.as_mut_ptr() as *mut _, v[0]);
_mm_storeu_si128(hi.as_mut_ptr() as *mut _, v[1]);
_mm_setr_epi8(
lo[0] as i8,
lo[1] as i8,
lo[2] as i8,
lo[3] as i8,
lo[4] as i8,
lo[5] as i8,
lo[6] as i8,
lo[7] as i8,
hi[0] as i8,
hi[1] as i8,
hi[2] as i8,
hi[3] as i8,
hi[4] as i8,
hi[5] as i8,
hi[6] as i8,
hi[7] as i8,
)
}
#[inline(always)]
pub unsafe fn _mm_cvtepi8_epi32x_v1(v: __m128i) -> __m128i {
let words = _mm_unpacklo_epi8(v, _mm_signbits_epi8x_v1(v)); _mm_unpacklo_epi16(words, _mm_srai_epi16(words, 15)) }
#[inline(always)]
pub unsafe fn _mm_cvtepu8_epi32x_v1(v: __m128i) -> __m128i {
let z = _mm_setzero_si128();
_mm_unpacklo_epi16(_mm_unpacklo_epi8(v, z), z)
}
#[inline(always)]
pub unsafe fn _mm_cvt4epi32_epi8x_v1(v: [__m128i; 4]) -> __m128i {
let mut a = [0i32; 4];
let mut b = [0i32; 4];
let mut c = [0i32; 4];
let mut d = [0i32; 4];
_mm_storeu_si128(a.as_mut_ptr() as *mut _, v[0]);
_mm_storeu_si128(b.as_mut_ptr() as *mut _, v[1]);
_mm_storeu_si128(c.as_mut_ptr() as *mut _, v[2]);
_mm_storeu_si128(d.as_mut_ptr() as *mut _, v[3]);
_mm_setr_epi8(
a[0] as i8, a[1] as i8, a[2] as i8, a[3] as i8, b[0] as i8, b[1] as i8, b[2] as i8, b[3] as i8, c[0] as i8,
c[1] as i8, c[2] as i8, c[3] as i8, d[0] as i8, d[1] as i8, d[2] as i8, d[3] as i8,
)
}
#[inline(always)]
pub unsafe fn _mm_cvtepi8_4epi32x_v1(v: __m128i) -> [__m128i; 4] {
[
_mm_cvtepi8_epi32x_v1(v),
_mm_cvtepi8_epi32x_v1(_mm_srli_si128(v, 4)),
_mm_cvtepi8_epi32x_v1(_mm_srli_si128(v, 8)),
_mm_cvtepi8_epi32x_v1(_mm_srli_si128(v, 12)),
]
}
#[inline(always)]
pub unsafe fn _mm_cvtepu8_4epi32x_v1(v: __m128i) -> [__m128i; 4] {
[
_mm_cvtepu8_epi32x_v1(v),
_mm_cvtepu8_epi32x_v1(_mm_srli_si128(v, 4)),
_mm_cvtepu8_epi32x_v1(_mm_srli_si128(v, 8)),
_mm_cvtepu8_epi32x_v1(_mm_srli_si128(v, 12)),
]
}
#[inline(always)]
pub unsafe fn _mm_cvt2epi8_epi64x_v1(lo: i8, hi: i8) -> __m128i {
_mm_set_epi64x(hi as i64, lo as i64)
}
#[inline(always)]
pub unsafe fn _mm_cvt2epu8_epi64x_v1(lo: u8, hi: u8) -> __m128i {
_mm_set_epi64x(hi as i64, lo as i64)
}
#[inline(always)]
pub unsafe fn _mm_cvt4epi64_epi8x_v1(v: [__m128i; 4]) -> __m128i {
let mut a = [0i64; 2];
let mut b = [0i64; 2];
let mut c = [0i64; 2];
let mut d = [0i64; 2];
_mm_storeu_si128(a.as_mut_ptr() as *mut _, v[0]);
_mm_storeu_si128(b.as_mut_ptr() as *mut _, v[1]);
_mm_storeu_si128(c.as_mut_ptr() as *mut _, v[2]);
_mm_storeu_si128(d.as_mut_ptr() as *mut _, v[3]);
_mm_setr_epi8(
a[0] as i8, a[1] as i8, b[0] as i8, b[1] as i8, c[0] as i8, c[1] as i8, d[0] as i8, d[1] as i8, 0, 0, 0, 0, 0,
0, 0, 0,
)
}
#[inline(always)]
pub unsafe fn _mm_cvt8epi64_epi8x_v1(v: [__m128i; 8]) -> __m128i {
let mut a = [0i64; 2];
let mut b = [0i64; 2];
let mut c = [0i64; 2];
let mut d = [0i64; 2];
let mut e = [0i64; 2];
let mut f = [0i64; 2];
let mut g = [0i64; 2];
let mut h = [0i64; 2];
_mm_storeu_si128(a.as_mut_ptr() as *mut _, v[0]);
_mm_storeu_si128(b.as_mut_ptr() as *mut _, v[1]);
_mm_storeu_si128(c.as_mut_ptr() as *mut _, v[2]);
_mm_storeu_si128(d.as_mut_ptr() as *mut _, v[3]);
_mm_storeu_si128(e.as_mut_ptr() as *mut _, v[4]);
_mm_storeu_si128(f.as_mut_ptr() as *mut _, v[5]);
_mm_storeu_si128(g.as_mut_ptr() as *mut _, v[6]);
_mm_storeu_si128(h.as_mut_ptr() as *mut _, v[7]);
_mm_setr_epi8(
a[0] as i8, a[1] as i8, b[0] as i8, b[1] as i8, c[0] as i8, c[1] as i8, d[0] as i8, d[1] as i8, e[0] as i8,
e[1] as i8, f[0] as i8, f[1] as i8, g[0] as i8, g[1] as i8, h[0] as i8, h[1] as i8,
)
}
#[inline(always)]
pub unsafe fn _mm_cvtepi16_epi32x_v1(v: __m128i) -> __m128i {
_mm_unpacklo_epi16(v, _mm_srai_epi16(v, 15))
}
#[inline(always)]
pub unsafe fn _mm_cvtepu16_epi32x_v1(v: __m128i) -> __m128i {
_mm_unpacklo_epi16(v, _mm_setzero_si128())
}
#[inline(always)]
pub unsafe fn _mm_cvt2epi16_epi64x_v1(lo: i16, hi: i16) -> __m128i {
_mm_set_epi64x(hi as i64, lo as i64)
}
#[inline(always)]
pub unsafe fn _mm_cvt2epu16_epi64x_v1(lo: u16, hi: u16) -> __m128i {
_mm_set_epi64x(hi as i64, lo as i64)
}
#[inline(always)]
pub unsafe fn _mm_cvt4epi64_epi16x_v1(v: [__m128i; 4]) -> __m128i {
let mut a = [0i64; 2];
let mut b = [0i64; 2];
let mut c = [0i64; 2];
let mut d = [0i64; 2];
_mm_storeu_si128(a.as_mut_ptr() as *mut _, v[0]);
_mm_storeu_si128(b.as_mut_ptr() as *mut _, v[1]);
_mm_storeu_si128(c.as_mut_ptr() as *mut _, v[2]);
_mm_storeu_si128(d.as_mut_ptr() as *mut _, v[3]);
_mm_setr_epi16(
a[0] as i16,
a[1] as i16,
b[0] as i16,
b[1] as i16,
c[0] as i16,
c[1] as i16,
d[0] as i16,
d[1] as i16,
)
}
#[inline(always)]
pub unsafe fn _mm_cvtepi16_4epi64x_v1(v: __m128i) -> [__m128i; 4] {
let mut a = [0i16; 8];
_mm_storeu_si128(a.as_mut_ptr() as *mut _, v);
[
_mm_cvt2epi16_epi64x_v1(a[0], a[1]),
_mm_cvt2epi16_epi64x_v1(a[2], a[3]),
_mm_cvt2epi16_epi64x_v1(a[4], a[5]),
_mm_cvt2epi16_epi64x_v1(a[6], a[7]),
]
}
#[inline(always)]
pub unsafe fn _mm_cvtepu16_4epi64x_v1(v: __m128i) -> [__m128i; 4] {
let mut a = [0u16; 8];
_mm_storeu_si128(a.as_mut_ptr() as *mut _, v);
[
_mm_cvt2epu16_epi64x_v1(a[0], a[1]),
_mm_cvt2epu16_epi64x_v1(a[2], a[3]),
_mm_cvt2epu16_epi64x_v1(a[4], a[5]),
_mm_cvt2epu16_epi64x_v1(a[6], a[7]),
]
}
#[inline(always)]
pub unsafe fn _mm_cvttpd_2i32x_v1(v: __m128d) -> [i32; 2] {
let mut d = [0i32; 4];
_mm_storeu_si128(d.as_mut_ptr() as *mut _, _mm_cvttpd_epi32(v));
[d[0], d[1]]
}
#[inline(always)]
pub unsafe fn _mm_cvtepi32_2pdx_v1(ints: __m128i) -> [__m128d; 2] {
[_mm_cvtepi32_pd(ints), _mm_cvtepi32_pd(_mm_srli_si128(ints, 8))]
}
#[inline(always)]
pub unsafe fn _mm_cvtepu32_2pdx_v1(ints: __m128i) -> [__m128d; 2] {
[_mm_cvtepu32_pdx_v1(ints), _mm_cvtepu32_pdx_v1(_mm_srli_si128(ints, 8))]
}