#![allow(unsafe_op_in_unsafe_fn, clippy::missing_safety_doc)]
use super::arch::*;
pub use crate::backend::x86_v2::polyfills::*;
pub mod bits;
pub mod casts;
pub mod cmp;
pub mod divider;
pub mod interleave;
pub mod math;
pub mod transpose256;
pub use bits::*;
pub use casts::*;
pub use cmp::*;
pub use divider::*;
pub use interleave::*;
pub use math::*;
pub use transpose256::*;
#[inline(always)]
pub unsafe fn _mm256_blendv_epi32x_v3(ymm0: __m256i, ymm1: __m256i, mask: __m256i) -> __m256i {
_mm256_castps_si256(_mm256_blendv_ps(
_mm256_castsi256_ps(ymm0),
_mm256_castsi256_ps(ymm1),
_mm256_castsi256_ps(mask),
))
}
#[inline(always)]
pub unsafe fn _mm256_blendv_epi64x_v3(ymm0: __m256i, ymm1: __m256i, mask: __m256i) -> __m256i {
_mm256_castpd_si256(_mm256_blendv_pd(
_mm256_castsi256_pd(ymm0),
_mm256_castsi256_pd(ymm1),
_mm256_castsi256_pd(mask),
))
}
#[inline(always)]
pub unsafe fn _mm256_srai_epi64x_v3(v: __m256i, cnt: i32) -> __m256i {
let m = _mm256_set1_epi64x(1i64 << (63 - cnt));
_mm256_sub_epi64(_mm256_xor_si256(_mm256_srl_epi64(v, _mm_cvtsi32_si128(cnt)), m), m)
}
#[inline(always)]
pub unsafe fn _mm_srav_epi64x_v3(value: __m128i, shifts: __m128i) -> __m128i {
let m = _mm_srlv_epi64(_mm_set1_epu64x(1 << 63), shifts);
_mm_sub_epi64(_mm_xor_si128(_mm_srlv_epi64(value, shifts), m), m)
}
#[inline(always)]
pub unsafe fn _mm256_srav_epi64x_v3(value: __m256i, shifts: __m256i) -> __m256i {
let m = _mm256_srlv_epi64(_mm256_set1_epu64x(1 << 63), shifts);
_mm256_sub_epi64(_mm256_xor_si256(_mm256_srlv_epi64(value, shifts), m), m)
}
#[inline(always)]
pub unsafe fn _mm256_permutev_epi16x_v3(value: __m256i, idx0: __m256i, idx1: __m256i) -> __m256i {
let packed = _mm256_packus_epi32(idx0, idx1);
let widx = _mm256_permute4x64_epi64(packed, 0b11_01_10_00);
let byte_mask = _mm256_add_epi16(
_mm256_mullo_epi16(widx, _mm256_set1_epi16(0x0202u16 as i16)),
_mm256_set1_epi16(0x0100),
);
let swapped = _mm256_permute2x128_si256(value, value, 0x01); let from_same = _mm256_shuffle_epi8(value, byte_mask);
let from_other = _mm256_shuffle_epi8(swapped, byte_mask);
let idx_bit3 = _mm256_and_si256(widx, _mm256_set1_epi16(8));
let pos_bit3 = _mm256_setr_epi16(0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8);
let blend = _mm256_cmpeq_epi16(_mm256_xor_si256(idx_bit3, pos_bit3), _mm256_set1_epi16(8));
_mm256_blendv_epi8(from_same, from_other, blend)
}
#[inline(always)]
pub unsafe fn _mm256_permutev_epi8x_v3(value: __m256i, i0: __m256i, i1: __m256i, i2: __m256i, i3: __m256i) -> __m256i {
let packed = _mm256_packus_epi16(_mm256_packus_epi32(i0, i1), _mm256_packus_epi32(i2, i3));
let ctrl = _mm256_permutevar8x32_epi32(packed, _mm256_setr_epi32(0, 4, 1, 5, 2, 6, 3, 7));
let swapped = _mm256_permute2x128_si256(value, value, 0x01); let from_same = _mm256_shuffle_epi8(value, ctrl);
let from_other = _mm256_shuffle_epi8(swapped, ctrl);
let idx_bit4 = _mm256_and_si256(ctrl, _mm256_set1_epi8(16));
let pos_bit4 = _mm256_setr_epi8(
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, );
let blend = _mm256_cmpeq_epi8(_mm256_xor_si256(idx_bit4, pos_bit4), _mm256_set1_epi8(16));
_mm256_blendv_epi8(from_same, from_other, blend)
}
#[inline(always)]
pub unsafe fn _mm256_set1_epu32x(value: u32) -> __m256i {
_mm256_set1_epi32(value as i32)
}
#[inline(always)]
pub unsafe fn _mm256_set1_epu64x(value: u64) -> __m256i {
_mm256_set1_epi64x(value as i64)
}