use super::super::*;
fn legacy_rgb_plane(width: usize, seed: u32) -> std::vec::Vec<u8> {
let mut state = seed;
let mut out = std::vec::Vec::with_capacity(width * 2);
for _ in 0..width {
state = state.wrapping_mul(1_664_525).wrapping_add(1_013_904_223);
let px = (state as u16).to_le_bytes();
out.extend_from_slice(&px);
}
out
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb565_to_rgb_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xDEAD_BEEF);
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::rgb565_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
rgb565_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb565_to_rgb diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb565_to_rgba_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xCAFE_F00D);
let mut out_scalar = std::vec![0u8; w * 4];
let mut out_avx2 = std::vec![0u8; w * 4];
scalar::legacy_rgb::rgb565_to_rgba_row(&src, &mut out_scalar, w);
unsafe {
rgb565_to_rgba_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb565_to_rgba diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb565_to_rgb_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0x1234_5678);
let mut out_scalar = std::vec![0u16; w * 3];
let mut out_avx2 = std::vec![0u16; w * 3];
scalar::legacy_rgb::rgb565_to_rgb_u16_row(&src, &mut out_scalar, w);
unsafe {
rgb565_to_rgb_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb565_to_rgb_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb565_to_rgba_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xABCD_EF01);
let mut out_scalar = std::vec![0u16; w * 4];
let mut out_avx2 = std::vec![0u16; w * 4];
scalar::legacy_rgb::rgb565_to_rgba_u16_row(&src, &mut out_scalar, w);
unsafe {
rgb565_to_rgba_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb565_to_rgba_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb565_lane_order_r_only() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0xF800; let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::rgb565_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
rgb565_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb565 R-only lane order mismatch"
);
let expected: std::vec::Vec<u8> = std::iter::repeat_n([255u8, 0u8, 0u8], w)
.flatten()
.collect();
assert_eq!(out_avx2, expected, "AVX2 rgb565 R-only values wrong");
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb565_lane_order_g_only() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x07E0; let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::rgb565_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
rgb565_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb565 G-only lane order mismatch"
);
let expected: std::vec::Vec<u8> = std::iter::repeat_n([0u8, 255u8, 0u8], w)
.flatten()
.collect();
assert_eq!(out_avx2, expected, "AVX2 rgb565 G-only values wrong");
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb565_lane_order_b_only() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x001F; let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::rgb565_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
rgb565_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb565 B-only lane order mismatch"
);
let expected: std::vec::Vec<u8> = std::iter::repeat_n([0u8, 0u8, 255u8], w)
.flatten()
.collect();
assert_eq!(out_avx2, expected, "AVX2 rgb565 B-only values wrong");
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr565_to_rgb_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xDEAD_BEEF);
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::bgr565_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
bgr565_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr565_to_rgb diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr565_to_rgba_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xCAFE_F00D);
let mut out_scalar = std::vec![0u8; w * 4];
let mut out_avx2 = std::vec![0u8; w * 4];
scalar::legacy_rgb::bgr565_to_rgba_row(&src, &mut out_scalar, w);
unsafe {
bgr565_to_rgba_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr565_to_rgba diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr565_to_rgb_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0x1234_5678);
let mut out_scalar = std::vec![0u16; w * 3];
let mut out_avx2 = std::vec![0u16; w * 3];
scalar::legacy_rgb::bgr565_to_rgb_u16_row(&src, &mut out_scalar, w);
unsafe {
bgr565_to_rgb_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr565_to_rgb_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr565_to_rgba_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xABCD_EF01);
let mut out_scalar = std::vec![0u16; w * 4];
let mut out_avx2 = std::vec![0u16; w * 4];
scalar::legacy_rgb::bgr565_to_rgba_u16_row(&src, &mut out_scalar, w);
unsafe {
bgr565_to_rgba_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr565_to_rgba_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr565_lane_order_r_in_low_bits() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x001F;
let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_avx2 = std::vec![0u8; w * 3];
unsafe {
bgr565_to_rgb_row(&src, &mut out_avx2, w);
}
let expected: std::vec::Vec<u8> = std::iter::repeat_n([255u8, 0u8, 0u8], w)
.flatten()
.collect();
assert_eq!(
out_avx2, expected,
"AVX2 bgr565 R-in-low-bits lane order wrong"
);
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb555_to_rgb_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xDEAD_BEEF);
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::rgb555_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
rgb555_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb555_to_rgb diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb555_to_rgba_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xCAFE_F00D);
let mut out_scalar = std::vec![0u8; w * 4];
let mut out_avx2 = std::vec![0u8; w * 4];
scalar::legacy_rgb::rgb555_to_rgba_row(&src, &mut out_scalar, w);
unsafe {
rgb555_to_rgba_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb555_to_rgba diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb555_to_rgb_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0x1234_5678);
let mut out_scalar = std::vec![0u16; w * 3];
let mut out_avx2 = std::vec![0u16; w * 3];
scalar::legacy_rgb::rgb555_to_rgb_u16_row(&src, &mut out_scalar, w);
unsafe {
rgb555_to_rgb_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb555_to_rgb_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb555_to_rgba_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xABCD_EF01);
let mut out_scalar = std::vec![0u16; w * 4];
let mut out_avx2 = std::vec![0u16; w * 4];
scalar::legacy_rgb::rgb555_to_rgba_u16_row(&src, &mut out_scalar, w);
unsafe {
rgb555_to_rgba_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb555_to_rgba_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb555_lane_order_r_only() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x7C00; let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_avx2 = std::vec![0u8; w * 3];
unsafe {
rgb555_to_rgb_row(&src, &mut out_avx2, w);
}
let expected: std::vec::Vec<u8> = std::iter::repeat_n([255u8, 0u8, 0u8], w)
.flatten()
.collect();
assert_eq!(out_avx2, expected, "AVX2 rgb555 R-only values wrong");
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb555_lane_order_b_only() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x001F; let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_avx2 = std::vec![0u8; w * 3];
unsafe {
rgb555_to_rgb_row(&src, &mut out_avx2, w);
}
let expected: std::vec::Vec<u8> = std::iter::repeat_n([0u8, 0u8, 255u8], w)
.flatten()
.collect();
assert_eq!(out_avx2, expected, "AVX2 rgb555 B-only values wrong");
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr555_to_rgb_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xDEAD_BEEF);
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::bgr555_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
bgr555_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr555_to_rgb diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr555_to_rgba_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xCAFE_F00D);
let mut out_scalar = std::vec![0u8; w * 4];
let mut out_avx2 = std::vec![0u8; w * 4];
scalar::legacy_rgb::bgr555_to_rgba_row(&src, &mut out_scalar, w);
unsafe {
bgr555_to_rgba_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr555_to_rgba diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr555_to_rgb_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0x1234_5678);
let mut out_scalar = std::vec![0u16; w * 3];
let mut out_avx2 = std::vec![0u16; w * 3];
scalar::legacy_rgb::bgr555_to_rgb_u16_row(&src, &mut out_scalar, w);
unsafe {
bgr555_to_rgb_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr555_to_rgb_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr555_to_rgba_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xABCD_EF01);
let mut out_scalar = std::vec![0u16; w * 4];
let mut out_avx2 = std::vec![0u16; w * 4];
scalar::legacy_rgb::bgr555_to_rgba_u16_row(&src, &mut out_scalar, w);
unsafe {
bgr555_to_rgba_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr555_to_rgba_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb444_to_rgb_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xDEAD_BEEF);
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::rgb444_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
rgb444_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb444_to_rgb diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb444_to_rgba_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xCAFE_F00D);
let mut out_scalar = std::vec![0u8; w * 4];
let mut out_avx2 = std::vec![0u8; w * 4];
scalar::legacy_rgb::rgb444_to_rgba_row(&src, &mut out_scalar, w);
unsafe {
rgb444_to_rgba_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb444_to_rgba diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb444_to_rgb_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0x1234_5678);
let mut out_scalar = std::vec![0u16; w * 3];
let mut out_avx2 = std::vec![0u16; w * 3];
scalar::legacy_rgb::rgb444_to_rgb_u16_row(&src, &mut out_scalar, w);
unsafe {
rgb444_to_rgb_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb444_to_rgb_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb444_to_rgba_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xABCD_EF01);
let mut out_scalar = std::vec![0u16; w * 4];
let mut out_avx2 = std::vec![0u16; w * 4];
scalar::legacy_rgb::rgb444_to_rgba_u16_row(&src, &mut out_scalar, w);
unsafe {
rgb444_to_rgba_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 rgb444_to_rgba_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb444_lane_order_r_only() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x0F00; let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_avx2 = std::vec![0u8; w * 3];
unsafe {
rgb444_to_rgb_row(&src, &mut out_avx2, w);
}
let expected: std::vec::Vec<u8> = std::iter::repeat_n([255u8, 0u8, 0u8], w)
.flatten()
.collect();
assert_eq!(out_avx2, expected, "AVX2 rgb444 R-only values wrong");
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_rgb444_lane_order_b_only() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x000F; let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_avx2 = std::vec![0u8; w * 3];
unsafe {
rgb444_to_rgb_row(&src, &mut out_avx2, w);
}
let expected: std::vec::Vec<u8> = std::iter::repeat_n([0u8, 0u8, 255u8], w)
.flatten()
.collect();
assert_eq!(out_avx2, expected, "AVX2 rgb444 B-only values wrong");
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr444_to_rgb_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xDEAD_BEEF);
let mut out_scalar = std::vec![0u8; w * 3];
let mut out_avx2 = std::vec![0u8; w * 3];
scalar::legacy_rgb::bgr444_to_rgb_row(&src, &mut out_scalar, w);
unsafe {
bgr444_to_rgb_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr444_to_rgb diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr444_to_rgba_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xCAFE_F00D);
let mut out_scalar = std::vec![0u8; w * 4];
let mut out_avx2 = std::vec![0u8; w * 4];
scalar::legacy_rgb::bgr444_to_rgba_row(&src, &mut out_scalar, w);
unsafe {
bgr444_to_rgba_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr444_to_rgba diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr444_to_rgb_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0x1234_5678);
let mut out_scalar = std::vec![0u16; w * 3];
let mut out_avx2 = std::vec![0u16; w * 3];
scalar::legacy_rgb::bgr444_to_rgb_u16_row(&src, &mut out_scalar, w);
unsafe {
bgr444_to_rgb_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr444_to_rgb_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr444_to_rgba_u16_matches_scalar() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
for w in [1usize, 7, 8, 15, 16, 17, 32, 33, 64, 65] {
let src = legacy_rgb_plane(w, 0xABCD_EF01);
let mut out_scalar = std::vec![0u16; w * 4];
let mut out_avx2 = std::vec![0u16; w * 4];
scalar::legacy_rgb::bgr444_to_rgba_u16_row(&src, &mut out_scalar, w);
unsafe {
bgr444_to_rgba_u16_row(&src, &mut out_avx2, w);
}
assert_eq!(
out_scalar, out_avx2,
"AVX2 bgr444_to_rgba_u16 diverges (width={w})"
);
}
}
#[test]
#[cfg_attr(miri, ignore = "x86 AVX2 SIMD intrinsics unsupported by Miri")]
fn avx2_bgr444_lane_order_r_in_low_bits() {
if !std::arch::is_x86_feature_detected!("avx2") {
return;
}
let w = 17usize;
let px: u16 = 0x000F;
let src: std::vec::Vec<u8> = std::iter::repeat_n(px.to_le_bytes(), w).flatten().collect();
let mut out_avx2 = std::vec![0u8; w * 3];
unsafe {
bgr444_to_rgb_row(&src, &mut out_avx2, w);
}
let expected: std::vec::Vec<u8> = std::iter::repeat_n([255u8, 0u8, 0u8], w)
.flatten()
.collect();
assert_eq!(
out_avx2, expected,
"AVX2 bgr444 R-in-low-bits lane order wrong"
);
}