pub mod f32_ops;
pub mod f64_ops;
#[cfg(target_arch = "aarch64")]
pub(crate) mod neon_f32_ops;
#[cfg(target_arch = "aarch64")]
pub(crate) mod neon_f64_ops;
macro_rules! dispatch_f64 {
($avx_fn:expr, $neon_fn:expr, $fallback_fn:expr, $($arg:expr),* $(,)?) => {{
#[cfg(target_arch = "x86_64")]
{
if is_x86_feature_detected!("avx") {
unsafe { $avx_fn($($arg),*) }
} else {
$fallback_fn($($arg),*)
}
}
#[cfg(target_arch = "aarch64")]
{
unsafe { $neon_fn($($arg),*) }
}
#[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
{
$fallback_fn($($arg),*)
}
}};
}
macro_rules! dispatch_f32 {
($avx_fn:expr, $neon_fn:expr, $fallback_fn:expr, $($arg:expr),* $(,)?) => {{
#[cfg(target_arch = "x86_64")]
{
if is_x86_feature_detected!("avx") {
unsafe { $avx_fn($($arg),*) }
} else {
$fallback_fn($($arg),*)
}
}
#[cfg(target_arch = "aarch64")]
{
unsafe { $neon_fn($($arg),*) }
}
#[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
{
$fallback_fn($($arg),*)
}
}};
}
pub(crate) use dispatch_f32;
pub(crate) use dispatch_f64;
#[inline]
pub(crate) unsafe fn slice_as_f64<T>(s: &[T]) -> &[f64] {
unsafe { core::slice::from_raw_parts(s.as_ptr().cast::<f64>(), s.len()) }
}
#[inline]
pub(crate) unsafe fn slice_as_f32<T>(s: &[T]) -> &[f32] {
unsafe { core::slice::from_raw_parts(s.as_ptr().cast::<f32>(), s.len()) }
}
#[inline]
pub(crate) unsafe fn slice_as_f64_mut<T>(s: &mut [T]) -> &mut [f64] {
unsafe { core::slice::from_raw_parts_mut(s.as_mut_ptr().cast::<f64>(), s.len()) }
}
#[inline]
pub(crate) unsafe fn slice_as_f32_mut<T>(s: &mut [T]) -> &mut [f32] {
unsafe { core::slice::from_raw_parts_mut(s.as_mut_ptr().cast::<f32>(), s.len()) }
}
#[inline]
pub(crate) unsafe fn f64_to_t<T: Copy>(v: f64) -> T {
unsafe { *(&raw const v).cast::<T>() }
}
#[inline]
pub(crate) unsafe fn f32_to_t<T: Copy>(v: f32) -> T {
unsafe { *(&raw const v).cast::<T>() }
}
#[inline]
pub(crate) unsafe fn t_to_f64<T: Copy>(v: T) -> f64 {
unsafe { *(&raw const v).cast::<f64>() }
}
#[inline]
pub(crate) unsafe fn t_to_f32<T: Copy>(v: T) -> f32 {
unsafe { *(&raw const v).cast::<f32>() }
}