use crate::*;
const ALIGNED_ADDR: u64 = 0x3000;
const ALIGNED_ADDR2: u64 = 0x3100;
#[test]
fn test_packuswb_all_zeros() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00, 0x66, 0x0f, 0x6f, 0x0b, 0x66, 0x0f, 0x67, 0xc1, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_positive_values() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00,
0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00];
let data2 = [0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00,
0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_negative_saturate_to_zero() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0xFF, 0xFF, 0xFE, 0xFF, 0xFD, 0xFF, 0xFC, 0xFF,
0xFB, 0xFF, 0xFA, 0xFF, 0xF9, 0xFF, 0xF8, 0xFF];
let data2 = [0xF7, 0xFF, 0xF6, 0xFF, 0x9C, 0xFF, 0x18, 0xFC,
0xF0, 0xD8, 0xE0, 0xB1, 0xD0, 0x8A, 0x00, 0x80];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_saturate_positive_max() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x01, 0x2C, 0x01, 0xE8, 0x03, 0xFF, 0x7F,
0x00, 0x10, 0xFF, 0x0F, 0x00, 0x20, 0x00, 0x40];
let data2 = [0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F,
0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_boundary_values() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00];
let data2 = [0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_mixed_saturation() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x0A, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x2C, 0x01,
0x64, 0x00, 0x90, 0x01, 0x96, 0x00, 0xF4, 0x01];
let data2 = [0xF6, 0xFF, 0xFF, 0x00, 0xCE, 0xFF, 0x00, 0x01,
0x00, 0x00, 0xE8, 0x03, 0xFF, 0xFF, 0x18, 0xFC];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_xmm2_xmm3() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x10, 0x66, 0x0f, 0x6f, 0x1b, 0x66, 0x0f, 0x67, 0xd3, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x10, 0x00, 0x20, 0x00, 0x30, 0x00, 0x40, 0x00,
0x50, 0x00, 0x60, 0x00, 0x70, 0x00, 0x80, 0x00];
let data2 = [0x90, 0x00, 0xA0, 0x00, 0xB0, 0x00, 0xC0, 0x00,
0xD0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xFF, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_from_memory() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00, 0x66, 0x0f, 0x67, 0x03, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00,
0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00];
let data2 = [0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00,
0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_xmm7_xmm6() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x38, 0x66, 0x0f, 0x6f, 0x33, 0x66, 0x0f, 0x67, 0xfe, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00];
let data2 = [0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00,
0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_all_zeros() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1, 0xf4,
]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_positive_values() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00];
let data2 = [0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_negative_saturate_to_zero() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
0xFD, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF];
let data2 = [0x9C, 0xFF, 0xFF, 0xFF, 0x18, 0xFC, 0xFF, 0xFF,
0x60, 0x79, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x80];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_saturate_positive_max() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x00, 0x01, 0x00, 0x70, 0x11, 0x01, 0x00,
0xA0, 0x86, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x7F];
let data2 = [0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_boundary_values() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00];
let data2 = [0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_mixed_saturation() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x64, 0x00, 0x00, 0x00, 0x70, 0x11, 0x01, 0x00,
0x88, 0x13, 0x00, 0x00, 0xA0, 0x86, 0x01, 0x00];
let data2 = [0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x78, 0xEC, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_xmm4_xmm5() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x20, 0x66, 0x0f, 0x6f, 0x2b, 0x66, 0x0f, 0x38, 0x2b, 0xe5, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00];
let data2 = [0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_from_memory() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00, 0x66, 0x0f, 0x38, 0x2b, 0x03, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x0A, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x1E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00];
let data2 = [0x32, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
0x46, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_xmm1_xmm2() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x08, 0x66, 0x0f, 0x6f, 0x13, 0x66, 0x0f, 0x38, 0x2b, 0xca, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0xFF, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
0xFD, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00];
let data2 = [0xFB, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00,
0xF9, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_xmm8_xmm9() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x44, 0x0f, 0x6f, 0x00, 0x66, 0x44, 0x0f, 0x6f, 0x0b, 0x66, 0x45, 0x0f, 0x67, 0xc1, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00,
0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00];
let data2 = [0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00,
0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_xmm10_xmm11() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x44, 0x0f, 0x6f, 0x10, 0x66, 0x44, 0x0f, 0x6f, 0x1b, 0x66, 0x45, 0x0f, 0x38, 0x2b, 0xd3, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00];
let data2 = [0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_xmm12_xmm13() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x44, 0x0f, 0x6f, 0x20, 0x66, 0x44, 0x0f, 0x6f, 0x2b, 0x66, 0x45, 0x0f, 0x67, 0xe5, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x00, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01,
0x7F, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x00, 0x00];
let data2 = [0x50, 0x00, 0xA0, 0x00, 0x64, 0x00, 0xC8, 0x00,
0x32, 0x00, 0x96, 0x00, 0x14, 0x00, 0xFA, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_xmm14_xmm15() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x44, 0x0f, 0x6f, 0x30, 0x66, 0x44, 0x0f, 0x6f, 0x3b, 0x66, 0x45, 0x0f, 0x38, 0x2b, 0xf7, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x9C, 0xFF, 0xFF, 0xFF];
let data2 = [0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x7F,
0x10, 0x27, 0x00, 0x00, 0xF0, 0xD8, 0xFF, 0xFF];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_sequence() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00, 0x66, 0x0f, 0x6f, 0x0b, 0x66, 0x0f, 0x6f, 0x10, 0x66, 0x0f, 0x67, 0xc1, 0x66, 0x0f, 0x67, 0xd1, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00,
0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00];
let data2 = [0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00,
0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_sequence() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00, 0x66, 0x0f, 0x6f, 0x0b, 0x66, 0x0f, 0x6f, 0x10, 0x66, 0x0f, 0x38, 0x2b, 0xc1, 0x66, 0x0f, 0x38, 0x2b, 0xd1, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00];
let data2 = [0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_then_packuswb() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00, 0x66, 0x0f, 0x6f, 0x0b, 0x66, 0x0f, 0x6f, 0x10, 0x66, 0x0f, 0x38, 0x2b, 0xc1, 0x66, 0x0f, 0x38, 0x2b, 0xd1, 0x66, 0x0f, 0x67, 0xc2, 0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00];
let data2 = [0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_all_saturate_positive() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data = [0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03,
0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_all_saturate_negative() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data = [0x18, 0xFC, 0x18, 0xFC, 0x18, 0xFC, 0x18, 0xFC,
0x18, 0xFC, 0x18, 0xFC, 0x18, 0xFC, 0x18, 0xFC];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_all_saturate_positive() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data = [0xA0, 0x86, 0x01, 0x00, 0xA0, 0x86, 0x01, 0x00,
0xA0, 0x86, 0x01, 0x00, 0xA0, 0x86, 0x01, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_all_saturate_negative() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data = [0x60, 0x79, 0xFE, 0xFF, 0x60, 0x79, 0xFE, 0xFF,
0x60, 0x79, 0xFE, 0xFF, 0x60, 0x79, 0xFE, 0xFF];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_alternating_saturation() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x0A, 0x00, 0x2C, 0x01, 0x14, 0x00, 0x90, 0x01,
0x1E, 0x00, 0xF4, 0x01, 0x28, 0x00, 0x58, 0x02];
let data2 = [0xF6, 0xFF, 0xFF, 0x00, 0xEC, 0xFF, 0x00, 0x01,
0xE2, 0xFF, 0x00, 0x00, 0xD8, 0xFF, 0x01, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_alternating_saturation() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0x64, 0x00, 0x00, 0x00, 0x70, 0x11, 0x01, 0x00,
0xE8, 0x03, 0x00, 0x00, 0xA0, 0x86, 0x01, 0x00];
let data2 = [0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x18, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packuswb_edge_cases() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x67, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0xFE, 0x00, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x01,
0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x01, 0x00];
let data2 = [0x7F, 0x00, 0x80, 0x00, 0x81, 0x00, 0x00, 0x80,
0xFF, 0x7F, 0x01, 0x80, 0x00, 0x00, 0xFF, 0xFF];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}
#[test]
fn test_packusdw_edge_cases() {
let mut emu = emu64();
let code = [0x48, 0xb8];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&ALIGNED_ADDR.to_le_bytes());
full_code.extend_from_slice(&[0x48, 0xbb]);
full_code.extend_from_slice(&ALIGNED_ADDR2.to_le_bytes());
full_code.extend_from_slice(&[
0x66, 0x0f, 0x6f, 0x00,
0x66, 0x0f, 0x6f, 0x0b,
0x66, 0x0f, 0x38, 0x2b, 0xc1,
0xf4,
]);
emu.load_code_bytes(&full_code);
let data1 = [0xFE, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00];
let data2 = [0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00];
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data1);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data2);
emu.run(None).unwrap();
}