use super::*;
#[inline(always)]
pub unsafe fn _mm256_mullhi_epu64x_v3(x: __m256i, y: __m256i) -> __m256i {
let lomask = _mm256_set1_epi64x(0xffffffff);
let xh = _mm256_shuffle_epi32(x, 0xB1); let yh = _mm256_shuffle_epi32(y, 0xB1); let w0 = _mm256_mul_epu32(x, y); let w1 = _mm256_mul_epu32(x, yh); let w2 = _mm256_mul_epu32(xh, y); let w3 = _mm256_mul_epu32(xh, yh); let w0h = _mm256_srli_epi64(w0, 32);
let s1 = _mm256_add_epi64(w1, w0h);
let s1l = _mm256_and_si256(s1, lomask);
let s1h = _mm256_srli_epi64(s1, 32);
let s2 = _mm256_add_epi64(w2, s1l);
let s2h = _mm256_srli_epi64(s2, 32);
let mut hi = _mm256_add_epi64(w3, s1h);
hi = _mm256_add_epi64(hi, s2h);
hi
}
#[inline(always)]
pub unsafe fn _mm256_mullhi_epu32x_v3(a: __m256i, b: __m256i) -> __m256i {
let hi_product_0_z2_z = _mm256_srli_epi64(_mm256_mul_epu32(a, b), 32);
let a1_x3_x = _mm256_srli_epi64(a, 32);
let b1_x3_x = _mm256_srli_epi64(b, 32);
let mask = _mm256_set_epi32(-1, 0, -1, 0, -1, 0, -1, 0);
let hi_product_z1_z3 = _mm256_and_si256(_mm256_mul_epu32(a1_x3_x, b1_x3_x), mask);
_mm256_or_si256(hi_product_0_z2_z, hi_product_z1_z3)
}
#[inline(always)]
pub unsafe fn _mm256_mullhi_epi32x_v3(a: __m256i, b: __m256i) -> __m256i {
let hi_product_0_z2_z = _mm256_srli_epi64(_mm256_mul_epi32(a, b), 32);
let a1_x3_x = _mm256_srli_epi64(a, 32);
let b1_x3_x = _mm256_srli_epi64(b, 32);
let mask = _mm256_set_epi32(-1, 0, -1, 0, -1, 0, -1, 0);
let hi_product_z1_z3 = _mm256_and_si256(_mm256_mul_epi32(a1_x3_x, b1_x3_x), mask);
_mm256_or_si256(hi_product_0_z2_z, hi_product_z1_z3)
}
#[inline(always)]
pub unsafe fn _mm256_mullhi_epi64x_v3(x: __m256i, y: __m256i) -> __m256i {
let p = _mm256_mullhi_epu64x_v3(x, y);
let t1 = _mm256_and_si256(_mm256_signbits_epi64x_v3(x), y);
let t2 = _mm256_and_si256(_mm256_signbits_epi64x_v3(y), x);
_mm256_sub_epi64(_mm256_sub_epi64(p, t1), t2)
}