#![allow(dead_code)]
use core::arch::x86_64::*;
const BYTESWAP_MASK_U16: __m128i =
unsafe { core::mem::transmute([1u8, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14]) };
const BYTESWAP_MASK_U32: __m128i =
unsafe { core::mem::transmute([3u8, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12]) };
#[inline(always)]
pub(crate) unsafe fn load_le_u16x8(ptr: *const u8) -> __m128i {
let v = unsafe { _mm_loadu_si128(ptr.cast()) };
#[cfg(target_endian = "big")]
let v = unsafe { _mm_shuffle_epi8(v, BYTESWAP_MASK_U16) };
v
}
#[inline(always)]
pub(crate) unsafe fn load_be_u16x8(ptr: *const u8) -> __m128i {
let v = unsafe { _mm_loadu_si128(ptr.cast()) };
#[cfg(target_endian = "little")]
let v = unsafe { _mm_shuffle_epi8(v, BYTESWAP_MASK_U16) };
v
}
#[inline(always)]
pub(crate) unsafe fn load_endian_u16x8<const BE: bool>(ptr: *const u8) -> __m128i {
if BE {
unsafe { load_be_u16x8(ptr) }
} else {
unsafe { load_le_u16x8(ptr) }
}
}
const BYTESWAP_MASK_U16X4: __m128i = unsafe {
core::mem::transmute([
1u8, 0, 3, 2, 5, 4, 7, 6, 0x80u8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
])
};
#[inline(always)]
pub(crate) unsafe fn load_le_u16x4(ptr: *const u8) -> __m128i {
let v = unsafe { _mm_loadl_epi64(ptr.cast()) };
#[cfg(target_endian = "big")]
let v = unsafe { _mm_shuffle_epi8(v, BYTESWAP_MASK_U16X4) };
v
}
#[inline(always)]
pub(crate) unsafe fn load_be_u16x4(ptr: *const u8) -> __m128i {
let v = unsafe { _mm_loadl_epi64(ptr.cast()) };
#[cfg(target_endian = "little")]
let v = unsafe { _mm_shuffle_epi8(v, BYTESWAP_MASK_U16X4) };
v
}
#[inline(always)]
pub(crate) unsafe fn load_endian_u16x4<const BE: bool>(ptr: *const u8) -> __m128i {
if BE {
unsafe { load_be_u16x4(ptr) }
} else {
unsafe { load_le_u16x4(ptr) }
}
}
#[inline(always)]
pub(crate) unsafe fn load_le_u32x4(ptr: *const u8) -> __m128i {
let v = unsafe { _mm_loadu_si128(ptr.cast()) };
#[cfg(target_endian = "big")]
let v = unsafe { _mm_shuffle_epi8(v, BYTESWAP_MASK_U32) };
v
}
#[inline(always)]
pub(crate) unsafe fn load_be_u32x4(ptr: *const u8) -> __m128i {
let v = unsafe { _mm_loadu_si128(ptr.cast()) };
#[cfg(target_endian = "little")]
let v = unsafe { _mm_shuffle_epi8(v, BYTESWAP_MASK_U32) };
v
}
#[inline(always)]
pub(crate) unsafe fn load_endian_u32x4<const BE: bool>(ptr: *const u8) -> __m128i {
if BE {
unsafe { load_be_u32x4(ptr) }
} else {
unsafe { load_le_u32x4(ptr) }
}
}