#![allow(dead_code)]
pub(crate) unsafe trait Is128BitsUnaligned {}
unsafe impl Is128BitsUnaligned for [u16; 8] {}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub(crate) unsafe trait Is256BitsUnaligned {}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
unsafe impl Is256BitsUnaligned for [u16; 16] {}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub(crate) mod x86 {
use core::ptr;
use super::{Is128BitsUnaligned, Is256BitsUnaligned};
#[cfg(target_arch = "x86")]
use core::arch::x86::{self as arch, __m128, __m128i, __m256i};
#[cfg(target_arch = "x86_64")]
use core::arch::x86_64::{self as arch, __m128, __m128i, __m256i};
#[inline]
#[target_feature(enable = "sse")]
pub(crate) fn _mm_load_ss(mem_addr: &f32) -> __m128 {
unsafe { arch::_mm_load_ss(mem_addr) }
}
#[inline]
#[target_feature(enable = "avx")]
pub(crate) fn _mm_broadcast_ss(mem_addr: &f32) -> __m128 {
#[allow(unused_unsafe)]
unsafe {
arch::_mm_broadcast_ss(mem_addr)
}
}
#[inline]
#[target_feature(enable = "sse2")]
pub(crate) fn _mm_storeu_si128<T: Is128BitsUnaligned>(mem_addr: &mut T, a: __m128i) {
unsafe { arch::_mm_storeu_si128(ptr::from_mut(mem_addr).cast(), a) }
}
#[inline]
#[target_feature(enable = "avx")]
pub(crate) fn _mm256_storeu_si256<T: Is256BitsUnaligned>(mem_addr: &mut T, a: __m256i) {
unsafe { arch::_mm256_storeu_si256(ptr::from_mut(mem_addr).cast(), a) }
}
}
#[cfg(target_arch = "aarch64")]
pub(crate) mod aarch64 {
use core::ptr;
use super::Is128BitsUnaligned;
use core::arch::aarch64::{self as arch, float32x4_t, int16x4_t, int32x4_t, uint32x4_t};
#[inline]
#[target_feature(enable = "neon")]
pub(crate) fn vld1_s16(mem_addr: &[i16; 4]) -> int16x4_t {
unsafe { arch::vld1_s16(mem_addr.as_ptr()) }
}
#[inline]
#[target_feature(enable = "neon")]
pub(crate) fn vld1_dup_s16(mem_addr: &i16) -> int16x4_t {
unsafe { arch::vld1_dup_s16(mem_addr) }
}
#[inline]
#[target_feature(enable = "neon")]
pub(crate) fn vld1q_f32(mem_addr: &[f32; 4]) -> float32x4_t {
unsafe { arch::vld1q_f32(mem_addr.as_ptr()) }
}
#[inline]
#[target_feature(enable = "neon")]
pub(crate) fn vld1q_dup_f32(mem_addr: &f32) -> float32x4_t {
unsafe { arch::vld1q_dup_f32(mem_addr) }
}
#[inline]
#[target_feature(enable = "neon")]
pub(crate) fn vld1q_s32(mem_addr: &[i32; 4]) -> int32x4_t {
unsafe { arch::vld1q_s32(mem_addr.as_ptr()) }
}
#[inline]
#[target_feature(enable = "neon")]
pub(crate) fn vld1q_dup_s32(mem_addr: &i32) -> int32x4_t {
unsafe { arch::vld1q_dup_s32(mem_addr) }
}
#[inline]
#[target_feature(enable = "neon")]
pub(crate) fn vst1q_u32<T: Is128BitsUnaligned>(mem_addr: &mut T, a: uint32x4_t) {
unsafe { arch::vst1q_u32(ptr::from_mut(mem_addr).cast(), a) }
}
}