use super::*;
#[inline(always)]
pub unsafe fn _mm_cmpgt_epu8x_v1(a: __m128i, b: __m128i) -> __m128i {
let bias = _mm_set1_epi8(i8::MIN); _mm_cmpgt_epi8(_mm_xor_si128(a, bias), _mm_xor_si128(b, bias))
}
#[inline(always)]
pub unsafe fn _mm_min_epi8x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(a, b, _mm_cmpgt_epi8(a, b)) }
#[inline(always)]
pub unsafe fn _mm_max_epi8x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(b, a, _mm_cmpgt_epi8(a, b)) }
#[inline(always)]
pub unsafe fn _mm_max_epu32x_v1(a: __m128i, b: __m128i) -> __m128i {
let sign_mask = _mm_set1_epu32x(0x80000000);
let a_key = _mm_xor_si128(a, sign_mask);
let b_key = _mm_xor_si128(b, sign_mask);
let mask = _mm_cmpgt_epi32(a_key, b_key);
_mm_or_si128(_mm_and_si128(mask, a), _mm_andnot_si128(mask, b))
}
#[inline(always)]
pub unsafe fn _mm_min_epu32x_v1(a: __m128i, b: __m128i) -> __m128i {
let sign_mask = _mm_set1_epu32x(0x80000000);
let a_key = _mm_xor_si128(a, sign_mask);
let b_key = _mm_xor_si128(b, sign_mask);
let mask = _mm_cmpgt_epi32(b_key, a_key);
_mm_or_si128(_mm_and_si128(mask, a), _mm_andnot_si128(mask, b))
}
#[inline(always)]
pub unsafe fn _mm_cmpgt_epi64x_v1(a: __m128i, b: __m128i) -> __m128i {
let sign_mask = _mm_set1_epu32x(0x80000000);
let a_flip = _mm_xor_si128(a, sign_mask);
let b_flip = _mm_xor_si128(b, sign_mask);
let cmp_lo = _mm_cmpgt_epi32(a_flip, b_flip);
let cmp_lo = _mm_shuffle_epi32::<0b10_10_00_00>(cmp_lo);
let cmp_hi = _mm_cmpgt_epi32(a, b);
let eq_hi = _mm_cmpeq_epi32(a, b);
let mask = _mm_or_si128(cmp_hi, _mm_and_si128(eq_hi, cmp_lo));
_mm_shuffle_epi32::<0b11_11_01_01>(mask)
}
#[inline(always)]
pub unsafe fn _mm_cmpgt_epu32x_v1(a: __m128i, b: __m128i) -> __m128i {
let mask = _mm_set1_epu32x(0x80000000);
_mm_cmpgt_epi32(_mm_xor_si128(a, mask), _mm_xor_si128(b, mask))
}
#[inline(always)]
pub unsafe fn _mm_cmpgt_epu16x_v1(a: __m128i, b: __m128i) -> __m128i {
let bias = _mm_set1_epi16(i16::MIN); _mm_cmpgt_epi16(_mm_xor_si128(a, bias), _mm_xor_si128(b, bias))
}
#[inline(always)]
pub unsafe fn _mm_min_epu16x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_sub_epi16(a, _mm_subs_epu16(a, b))
}
#[inline(always)]
pub unsafe fn _mm_max_epu16x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_add_epi16(b, _mm_subs_epu16(a, b))
}
#[inline(always)]
pub unsafe fn _mm_cmpgt_epu64x_v1(a: __m128i, b: __m128i) -> __m128i {
let mask = _mm_set1_epu64x(1 << 63);
_mm_cmpgt_epi64x_v1(_mm_xor_si128(a, mask), _mm_xor_si128(b, mask))
}
#[inline(always)]
pub unsafe fn _mm_cmpge_epu32x_v1(lhs: __m128i, rhs: __m128i) -> __m128i {
_mm_cmpeq_epi32(_mm_max_epu32x_v1(lhs, rhs), lhs)
}
#[inline(always)]
pub unsafe fn _mm_cmple_epu32x_v1(lhs: __m128i, rhs: __m128i) -> __m128i {
_mm_cmpge_epu32x_v1(rhs, lhs)
}
#[inline(always)]
pub unsafe fn _mm_cmplt_epu32x_v1(lhs: __m128i, rhs: __m128i) -> __m128i {
_mm_cmpgt_epu32x_v1(rhs, lhs)
}
#[inline(always)]
pub unsafe fn _mm_min_epi32x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(a, b, _mm_cmpgt_epi32(a, b))
}
#[inline(always)]
pub unsafe fn _mm_max_epi32x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(b, a, _mm_cmpgt_epi32(a, b))
}
#[inline(always)]
pub unsafe fn _mm_min_epi64x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(a, b, _mm_cmpgt_epi64x_v1(a, b))
}
#[inline(always)]
pub unsafe fn _mm_max_epi64x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(b, a, _mm_cmpgt_epi64x_v1(a, b))
}
#[inline(always)]
pub unsafe fn _mm_max_epu64x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(b, a, _mm_cmpgt_epu64x_v1(a, b))
}
#[inline(always)]
pub unsafe fn _mm_min_epu64x_v1(a: __m128i, b: __m128i) -> __m128i {
_mm_blendv_epi8x_v1(a, b, _mm_cmpgt_epu64x_v1(a, b))
}
#[inline(always)]
pub unsafe fn _mm_movm_epi32x_v1(bitmask: u64) -> __m128i {
let bits = _mm_setr_epi32(1, 2, 4, 8);
let broadcast = _mm_set1_epi32(bitmask as i32);
_mm_cmpeq_epi32(_mm_and_si128(broadcast, bits), bits)
}
#[inline(always)]
pub unsafe fn _mm_movm_epi64x_v1(bitmask: u64) -> __m128i {
let bits = _mm_setr_epi32(1, 0, 2, 0);
let broadcast = _mm_set1_epi32(bitmask as i32);
let eq = _mm_cmpeq_epi32(_mm_and_si128(broadcast, bits), bits);
_mm_shuffle_epi32::<0b10_10_00_00>(eq)
}
#[inline(always)]
pub unsafe fn _mm_movm_epi16x_v1(bitmask: u64) -> __m128i {
let bits = _mm_setr_epi16(1, 2, 4, 8, 16, 32, 64, 128);
let broadcast = _mm_set1_epi16(bitmask as i16);
_mm_cmpeq_epi16(_mm_and_si128(broadcast, bits), bits)
}
#[inline(always)]
pub unsafe fn _mm_movm_epi8x_v1(bitmask: u64) -> __m128i {
const SPREAD: u64 = 0x0101_0101_0101_0101;
let lo = (bitmask & 0xFF) * SPREAD;
let hi = ((bitmask >> 8) & 0xFF) * SPREAD;
let bits = _mm_setr_epi8(
1, 2, 4, 8, 16, 32, 64, -128, 1, 2, 4, 8, 16, 32, 64, -128,
);
let broadcast = _mm_set_epi64x(hi as i64, lo as i64);
_mm_cmpeq_epi8(_mm_and_si128(broadcast, bits), bits)
}