use super::common::{USizeConvertTo, iota_slice};
use crate::{
bitmask,
constant::Const,
traits::{ArrayType, BitMaskType, SIMDMask, SIMDVector},
};
pub(crate) fn test_load_simd<T, const N: usize, V>(arch: V::Arch)
where
T: Default + std::marker::Copy + std::cmp::PartialEq + std::fmt::Debug,
usize: USizeConvertTo<T>,
Const<N>: ArrayType<T, Type = [T; N]>,
bitmask::BitMask<N, V::Arch>: SIMDMask<Arch = V::Arch>,
V: SIMDVector<Scalar = T, ConstLanes = Const<N>>,
{
let mut input = vec![T::default(); 2 * N];
iota_slice(input.as_mut_slice());
for i in 0..N {
let v = unsafe { V::load_simd(arch, input.as_ptr().add(i)) };
let arr = v.to_array();
for (j, value) in arr.iter().enumerate().take(N) {
assert_eq!(*value, (i + j).test_convert());
}
}
let mut input = [T::default(); N];
iota_slice(input.as_mut_slice());
for keep_first in 0..=N + 5 {
let offset = N - keep_first.min(N);
let ptr = unsafe { input.as_ptr().add(offset) };
let check = |arr: [T; N]| {
for (i, value) in arr.iter().enumerate().take(N) {
if i < keep_first {
assert_eq!(*value, (N - keep_first.min(N) + i).test_convert());
} else {
assert_eq!(*value, 0.test_convert());
}
}
};
let v = unsafe { V::load_simd_first(arch, ptr, keep_first) };
let arr = v.to_array();
println!("Array From First = {:?}", arr);
check(arr);
let v = unsafe {
V::load_simd_masked_logical(arch, ptr, V::Mask::keep_first(arch, keep_first))
};
let arr = v.to_array();
println!("Array Logical Mask = {:?}", arr);
check(arr);
let v = unsafe {
V::load_simd_masked(
arch,
ptr,
<Const<N> as BitMaskType<V::Arch>>::Type::keep_first(arch, keep_first),
)
};
let arr = v.to_array();
println!("Array Logical Mask = {:?}", arr);
check(arr);
}
}