#[cfg(all(target_arch = "x86_64", feature = "avx2"))]
mod avx2;
#[cfg(all(target_arch = "x86_64", feature = "avx512"))]
mod avx512;
mod rust;
#[cfg(test)]
mod tests;
use std::num::{NonZeroU8, NonZeroUsize};
use crate::util::Pixel;
#[inline]
pub fn refine_horizontal_wiener<T: Pixel>(
dest: &mut [T],
src: &[T],
pitch: NonZeroUsize,
width: NonZeroUsize,
height: NonZeroUsize,
bits_per_sample: NonZeroU8,
) {
debug_assert!(
bits_per_sample.get() as usize > (size_of::<T>() - 1) * 8
&& (bits_per_sample.get() as usize <= size_of::<T>() * 8)
);
#[cfg(all(target_arch = "x86_64", feature = "avx512"))]
if crate::util::has_avx512_znver5() {
unsafe {
avx512::refine_horizontal_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
#[cfg(all(target_arch = "x86_64", feature = "avx512"))]
if crate::util::has_avx512_skylake() {
cfg_select! {
feature = "experimental" => {
unsafe {
avx512::refine_horizontal_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
_ => {
if size_of::<T>() == 1 || bits_per_sample.get() < 16 {
unsafe {
avx512::refine_horizontal_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
}
}
}
#[cfg(all(target_arch = "x86_64", feature = "avx2"))]
if crate::util::has_avx2() {
unsafe {
avx2::refine_horizontal_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
rust::refine_horizontal_wiener(dest, src, pitch, width, height, bits_per_sample);
}
#[inline]
pub fn refine_vertical_wiener<T: Pixel>(
dest: &mut [T],
src: &[T],
pitch: NonZeroUsize,
width: NonZeroUsize,
height: NonZeroUsize,
bits_per_sample: NonZeroU8,
) {
debug_assert!(
bits_per_sample.get() as usize > (size_of::<T>() - 1) * 8
&& (bits_per_sample.get() as usize <= size_of::<T>() * 8)
);
#[cfg(all(target_arch = "x86_64", feature = "avx512"))]
if crate::util::has_avx512_znver5() {
unsafe {
avx512::refine_vertical_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
#[cfg(all(target_arch = "x86_64", feature = "avx512"))]
if crate::util::has_avx512_skylake() {
cfg_select! {
feature = "experimental" => {
unsafe {
avx512::refine_vertical_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
_ => {
if size_of::<T>() == 1 || bits_per_sample.get() < 16 {
unsafe {
avx512::refine_vertical_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
}
}
}
#[cfg(all(target_arch = "x86_64", feature = "avx2"))]
if crate::util::has_avx2() {
unsafe {
avx2::refine_vertical_wiener(dest, src, pitch, width, height, bits_per_sample);
}
return;
}
rust::refine_vertical_wiener(dest, src, pitch, width, height, bits_per_sample);
}