use super::*;
#[inline(always)]
pub unsafe fn _mm_popcnt_epi8x_v2(v: __m128i) -> __m128i {
let lookup = _mm_setr_epi8(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4);
let low_mask = _mm_set1_epi8(0x0f);
let lo = _mm_and_si128(v, low_mask);
let hi = _mm_and_si128(_mm_srli_epi16(v, 4), low_mask);
let cnt1 = _mm_shuffle_epi8(lookup, lo);
let cnt2 = _mm_shuffle_epi8(lookup, hi);
_mm_add_epi8(cnt1, cnt2)
}
#[inline(always)]
pub unsafe fn _mm_popcnt_epi16x_v2(v: __m128i) -> __m128i {
_mm_maddubs_epi16(_mm_popcnt_epi8x_v2(v), _mm_set1_epi8(1))
}
#[inline(always)]
pub unsafe fn _mm_popcnt_epi32x_v2(v: __m128i) -> __m128i {
_mm_madd_epi16(
_mm_maddubs_epi16(_mm_popcnt_epi8x_v2(v), _mm_set1_epi8(1)),
_mm_set1_epi16(1),
)
}
#[inline(always)]
pub unsafe fn _mm_popcnt_epi64x_v2(v: __m128i) -> __m128i {
_mm_sad_epu8(_mm_popcnt_epi8x_v2(v), _mm_setzero_si128())
}
#[inline(always)]
pub unsafe fn _mm_bswap_epi16x_v2(value: __m128i) -> __m128i {
_mm_shuffle_epi8(
value,
_mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14),
)
}
#[inline(always)]
pub unsafe fn _mm_bswap_epi32x_v2(x: __m128i) -> __m128i {
_mm_shuffle_epi8(x, _mm_setr_epi8(3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12))
}
#[inline(always)]
pub unsafe fn _mm_bswap_epi64x_v2(x: __m128i) -> __m128i {
_mm_shuffle_epi8(x, _mm_setr_epi8(7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8))
}
#[inline(always)]
pub unsafe fn _mm_bswap_psx_v2(x: __m128) -> __m128 {
_mm_castsi128_ps(_mm_bswap_epi32x_v2(_mm_castps_si128(x)))
}
#[inline(always)]
pub unsafe fn _mm_bswap_pdx_v2(x: __m128d) -> __m128d {
_mm_castsi128_pd(_mm_bswap_epi64x_v2(_mm_castpd_si128(x)))
}
#[inline(always)]
pub unsafe fn _mm_morton2_spread_epu16x_v2(v: __m128i) -> __m128i {
let lut = _mm_setr_epi8(
0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15, 0x40, 0x41, 0x44, 0x45, 0x50, 0x51, 0x54, 0x55,
);
let c = _mm_and_si128(v, _mm_set1_epi16(0x00FF));
let n = _mm_and_si128(_mm_or_si128(c, _mm_slli_epi16(c, 4)), _mm_set1_epi16(0x0F0F));
_mm_shuffle_epi8(lut, n)
}
#[inline(always)]
pub unsafe fn _mm_morton2_spread_epu32x_v2(v: __m128i) -> __m128i {
let lut = _mm_setr_epi8(
0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15, 0x40, 0x41, 0x44, 0x45, 0x50, 0x51, 0x54, 0x55,
);
let c = _mm_and_si128(v, _mm_set1_epi32(0x0000_FFFF));
let c = _mm_and_si128(_mm_or_si128(c, _mm_slli_epi32(c, 8)), _mm_set1_epi32(0x00FF_00FF));
let n = _mm_and_si128(_mm_or_si128(c, _mm_slli_epi32(c, 4)), _mm_set1_epi32(0x0F0F_0F0F));
_mm_shuffle_epi8(lut, n)
}
#[inline(always)]
pub unsafe fn _mm_morton2_epu16x_v2(x: __m128i, y: __m128i) -> __m128i {
_mm_or_si128(
_mm_morton2_spread_epu16x_v2(x),
_mm_slli_epi16(_mm_morton2_spread_epu16x_v2(y), 1),
)
}
#[inline(always)]
pub unsafe fn _mm_morton2_epu32x_v2(x: __m128i, y: __m128i) -> __m128i {
_mm_or_si128(
_mm_morton2_spread_epu32x_v2(x),
_mm_slli_epi32(_mm_morton2_spread_epu32x_v2(y), 1),
)
}
#[inline(always)]
pub unsafe fn _mm_morton2_compress_epu16x_v2(v: __m128i) -> __m128i {
let lut = _mm_setr_epi8(0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3);
let e = _mm_and_si128(v, _mm_set1_epi16(0x5555)); let lo = _mm_shuffle_epi8(lut, e);
let hi = _mm_shuffle_epi8(lut, _mm_srli_epi16(e, 4));
let n = _mm_and_si128(_mm_or_si128(lo, _mm_slli_epi16(hi, 2)), _mm_set1_epi16(0x0F0F));
_mm_and_si128(_mm_or_si128(n, _mm_srli_epi16(n, 4)), _mm_set1_epi16(0x00FF))
}
#[inline(always)]
pub unsafe fn _mm_morton2_compress_epu32x_v2(v: __m128i) -> __m128i {
let lut = _mm_setr_epi8(0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3);
let e = _mm_and_si128(v, _mm_set1_epi32(0x5555_5555));
let lo = _mm_shuffle_epi8(lut, e);
let hi = _mm_shuffle_epi8(lut, _mm_srli_epi32(e, 4));
let n = _mm_and_si128(_mm_or_si128(lo, _mm_slli_epi32(hi, 2)), _mm_set1_epi32(0x0F0F_0F0F));
let c = _mm_and_si128(_mm_or_si128(n, _mm_srli_epi32(n, 4)), _mm_set1_epi32(0x00FF_00FF));
_mm_and_si128(_mm_or_si128(c, _mm_srli_epi32(c, 8)), _mm_set1_epi32(0x0000_FFFF))
}