use super::*;
#[inline(always)]
unsafe fn regroup_ps(a: __m256, b: __m256, c: __m256) -> (__m256, __m256, __m256) {
(
_mm256_permute2f128_ps::<0x30>(a, b), _mm256_permute2f128_ps::<0x21>(a, c), _mm256_permute2f128_ps::<0x30>(b, c), )
}
#[inline(always)]
unsafe fn restitch_ps(p0: __m256, p1: __m256, p2: __m256) -> (__m256, __m256, __m256) {
(
_mm256_permute2f128_ps::<0x20>(p0, p1), _mm256_permute2f128_ps::<0x30>(p2, p0), _mm256_permute2f128_ps::<0x31>(p1, p2), )
}
#[inline(always)]
pub unsafe fn _mm256_deinterleave3_ps(a: __m256, b: __m256, c: __m256) -> (__m256, __m256, __m256) {
let (p0, p1, p2) = regroup_ps(a, b, c);
let t0 = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(2, 3, 1, 2) }>(p1, p2); let t1 = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(1, 2, 0, 1) }>(p0, p1);
let x = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(0, 3, 0, 2) }>(p0, t0);
let y = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(0, 2, 1, 3) }>(t1, t0);
let z = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(1, 3, 0, 3) }>(t1, p2);
(x, y, z)
}
#[inline(always)]
pub unsafe fn _mm256_interleave3_ps(x: __m256, y: __m256, z: __m256) -> (__m256, __m256, __m256) {
let xy = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(0, 2, 0, 2) }>(x, y); let yz = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(1, 3, 1, 3) }>(y, z); let zx = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(0, 2, 1, 3) }>(z, x);
let p0 = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(0, 2, 0, 2) }>(xy, zx); let p1 = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(0, 2, 1, 3) }>(yz, xy); let p2 = _mm256_shuffle_ps::<{ MM_SHUFFLE_R!(1, 3, 1, 3) }>(zx, yz);
restitch_ps(p0, p1, p2)
}
#[inline(always)]
pub unsafe fn _mm256_deinterleave3_pd(a: __m256d, b: __m256d, c: __m256d) -> (__m256d, __m256d, __m256d) {
let p0 = _mm256_permute2f128_pd::<0x30>(a, b);
let p1 = _mm256_permute2f128_pd::<0x21>(a, c);
let p2 = _mm256_permute2f128_pd::<0x30>(b, c);
let x = _mm256_shuffle_pd::<0b1010>(p0, p1); let y = _mm256_shuffle_pd::<0b0101>(p0, p2); let z = _mm256_shuffle_pd::<0b1010>(p1, p2);
(x, y, z)
}
#[inline(always)]
pub unsafe fn _mm256_interleave3_pd(x: __m256d, y: __m256d, z: __m256d) -> (__m256d, __m256d, __m256d) {
let p0 = _mm256_shuffle_pd::<0b0000>(x, y); let p1 = _mm256_shuffle_pd::<0b1010>(z, x); let p2 = _mm256_shuffle_pd::<0b1111>(y, z);
(
_mm256_permute2f128_pd::<0x20>(p0, p1),
_mm256_permute2f128_pd::<0x30>(p2, p0),
_mm256_permute2f128_pd::<0x31>(p1, p2),
)
}
#[inline(always)]
pub unsafe fn _mm256_deinterleave3_epi32(a: __m256i, b: __m256i, c: __m256i) -> (__m256i, __m256i, __m256i) {
let (x, y, z) = _mm256_deinterleave3_ps(_mm256_castsi256_ps(a), _mm256_castsi256_ps(b), _mm256_castsi256_ps(c));
(_mm256_castps_si256(x), _mm256_castps_si256(y), _mm256_castps_si256(z))
}
#[inline(always)]
pub unsafe fn _mm256_interleave3_epi32(x: __m256i, y: __m256i, z: __m256i) -> (__m256i, __m256i, __m256i) {
let (a, b, c) = _mm256_interleave3_ps(_mm256_castsi256_ps(x), _mm256_castsi256_ps(y), _mm256_castsi256_ps(z));
(_mm256_castps_si256(a), _mm256_castps_si256(b), _mm256_castps_si256(c))
}
#[inline(always)]
pub unsafe fn _mm256_deinterleave3_epi64(a: __m256i, b: __m256i, c: __m256i) -> (__m256i, __m256i, __m256i) {
let (x, y, z) = _mm256_deinterleave3_pd(_mm256_castsi256_pd(a), _mm256_castsi256_pd(b), _mm256_castsi256_pd(c));
(_mm256_castpd_si256(x), _mm256_castpd_si256(y), _mm256_castpd_si256(z))
}
#[inline(always)]
pub unsafe fn _mm256_interleave3_epi64(x: __m256i, y: __m256i, z: __m256i) -> (__m256i, __m256i, __m256i) {
let (a, b, c) = _mm256_interleave3_pd(_mm256_castsi256_pd(x), _mm256_castsi256_pd(y), _mm256_castsi256_pd(z));
(_mm256_castpd_si256(a), _mm256_castpd_si256(b), _mm256_castpd_si256(c))
}