use super::kernels::KernelFloat;
pub(super) unsafe fn pack_a_panel<F: KernelFloat, const MR: usize>(
src: *const F,
rs: isize,
cs: isize,
rows: usize,
depth: usize,
dst: &mut [F],
) {
let dst = &mut dst[..MR * depth];
unsafe {
if rows == MR && rs == 1 {
for p in 0..depth {
let from = src.offset(p as isize * cs);
for i in 0..MR {
*dst.get_unchecked_mut(p * MR + i) = *from.add(i);
}
}
} else if cs == 1 {
for i in 0..rows {
let from = src.offset(i as isize * rs);
for p in 0..depth {
*dst.get_unchecked_mut(p * MR + i) = *from.add(p);
}
}
if rows < MR {
for p in 0..depth {
for i in rows..MR {
*dst.get_unchecked_mut(p * MR + i) = F::ZERO;
}
}
}
} else {
for p in 0..depth {
for i in 0..rows {
*dst.get_unchecked_mut(p * MR + i) =
*src.offset(i as isize * rs + p as isize * cs);
}
for i in rows..MR {
*dst.get_unchecked_mut(p * MR + i) = F::ZERO;
}
}
}
}
}
pub(super) unsafe fn pack_b_panel<F: KernelFloat, const NR: usize>(
src: *const F,
rs: isize,
cs: isize,
cols: usize,
depth: usize,
dst: &mut [F],
) {
let dst = &mut dst[..NR * depth];
unsafe {
if cols == NR && cs == 1 {
for p in 0..depth {
let from = src.offset(p as isize * rs);
for j in 0..NR {
*dst.get_unchecked_mut(p * NR + j) = *from.add(j);
}
}
} else if rs == 1 {
for j in 0..cols {
let from = src.offset(j as isize * cs);
for p in 0..depth {
*dst.get_unchecked_mut(p * NR + j) = *from.add(p);
}
}
if cols < NR {
for p in 0..depth {
for j in cols..NR {
*dst.get_unchecked_mut(p * NR + j) = F::ZERO;
}
}
}
} else {
for p in 0..depth {
for j in 0..cols {
*dst.get_unchecked_mut(p * NR + j) =
*src.offset(p as isize * rs + j as isize * cs);
}
for j in cols..NR {
*dst.get_unchecked_mut(p * NR + j) = F::ZERO;
}
}
}
}
}