pub static COMPRESS_LUT: [[i32; 8]; 256] = {
let mut lut = [[0i32; 8]; 256];
let mut mask: usize = 0;
while mask < 256 {
let mut left = 0usize;
let mut right = 7usize;
let mut perm = [0i32; 8];
let mut lane = 0usize;
while lane < 8 {
if (mask >> lane) & 1 == 1 {
perm[left] = lane as i32;
left += 1;
} else {
perm[right] = lane as i32;
right = right.saturating_sub(1);
}
lane += 1;
}
lut[mask] = perm;
mask += 1;
}
lut
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lut_all_selected() {
let perm = COMPRESS_LUT[0xFF];
assert_eq!(perm, [0, 1, 2, 3, 4, 5, 6, 7]);
}
#[test]
fn lut_none_selected() {
let perm = COMPRESS_LUT[0x00];
assert_eq!(perm[0..8].iter().copied().collect::<Vec<_>>().len(), 8);
}
#[test]
fn lut_single_lane() {
let perm = COMPRESS_LUT[0x04];
assert_eq!(perm[0], 2, "lane 2 should be packed to position 0");
}
#[test]
fn lut_popcount_consistency() {
for mask in 0..256usize {
let perm = COMPRESS_LUT[mask];
let popcount = mask.count_ones() as usize;
let mut selected = Vec::new();
for lane in 0..8 {
if (mask >> lane) & 1 == 1 {
selected.push(lane as i32);
}
}
assert_eq!(
&perm[..popcount],
&selected[..],
"mask {mask:#010b}: first {popcount} entries should be selected lanes in order"
);
}
}
}