use crate::*;
const ALIGNED_ADDR: u64 = 0x3000;
const ALIGNED_ADDR2: u64 = 0x3100;
fn float_bits(val: f32) -> [u8; 4] {
val.to_le_bytes()
}
fn make_4floats(f0: f32, f1: f32, f2: f32, f3: f32) -> Vec<u8> {
let mut data = Vec::new();
data.extend_from_slice(&float_bits(f0));
data.extend_from_slice(&float_bits(f1));
data.extend_from_slice(&float_bits(f2));
data.extend_from_slice(&float_bits(f3));
data
}
#[test]
fn test_cmpps_eq_all_equal() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let data = make_4floats(1.0, 2.0, 3.0, 4.0);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_eq_none_equal() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_eq_partial_equal() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 5.0, 3.0, 6.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_eq_with_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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(0.0, 0.0, 0.0, 0.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(0.0, 0.0, 0.0, 0.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_eq_with_negatives() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(-1.0, -2.0, -3.0, -4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(-1.0, -2.0, -3.0, -4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_lt_all_less() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_lt_none_less() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_lt_partial_less() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 6.0, 3.0, 8.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 2.0, 7.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_lt_with_negatives() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(-5.0, -4.0, -3.0, -2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(-1.0, -0.5, 0.0, 1.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_lt_equal_not_less() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_le_all_less_or_equal() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_le_mixed() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 5.0, 3.0, 10.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 5.0, 7.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_le_none() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(10.0, 20.0, 30.0, 40.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_unord_with_nan_first() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(f32::NAN, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_unord_with_nan_second() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(f32::NAN, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_unord_with_nan_both() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(f32::NAN, f32::NAN, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(f32::NAN, 2.0, f32::NAN, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_unord_no_nan() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_neq_all_different() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x04, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_neq_all_same() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x04, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_neq_with_nan() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x04, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(f32::NAN, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_nlt_all_greater_or_equal() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x05, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(10.0, 20.0, 30.0, 40.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_nlt_all_less() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x05, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(10.0, 20.0, 30.0, 40.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_nlt_with_nan() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x05, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(f32::NAN, 20.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(10.0, 2.0, 30.0, 40.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_nle_all_greater() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x06, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(10.0, 20.0, 30.0, 40.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_nle_all_equal() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x06, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_nle_with_nan() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x06, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(f32::NAN, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_ord_all_ordered() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_ord_with_nan_first() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(f32::NAN, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_ord_with_nan_second() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, f32::NAN, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_ord_with_nan_both() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(f32::NAN, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(f32::NAN, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_with_infinity() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, f32::NEG_INFINITY, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(f32::INFINITY, 0.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_positive_negative_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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(0.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(-0.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_denormal_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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
let denorm = f32::from_bits(0x00000001); emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(denorm, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_xmm_mem_eq() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0xc2, 0x03, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let data = make_4floats(1.0, 2.0, 3.0, 4.0);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_xmm_mem_lt() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0xc2, 0x03, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_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(&[
0x0f, 0x28, 0x10, 0x0f, 0x28, 0x1b, 0x0f, 0xc2, 0xd3, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let data = make_4floats(1.0, 2.0, 3.0, 4.0);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_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(&[
0x0f, 0x28, 0x38, 0x0f, 0x28, 0x33, 0x0f, 0xc2, 0xfe, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5.0, 6.0, 7.0, 8.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_xmm15_xmm8() {
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(&[
0x44, 0x0f, 0x28, 0x38, 0x44, 0x0f, 0x28, 0x03, 0x45, 0x0f, 0xc2, 0xf8, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_alternating_pattern() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 5.0, 3.0, 7.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_large_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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1e30, 2e30, 3e30, 4e30));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5e30, 6e30, 7e30, 8e30));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_small_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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1e-30, 2e-30, 3e-30, 4e-30));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(5e-30, 6e-30, 7e-30, 8e-30));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_mixed_signs() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(-1.0, 2.0, -3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, -2.0, 3.0, -4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmpps_multiple_comparisons() {
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(&[
0x0f, 0x28, 0x00, 0x0f, 0x28, 0x0b, 0x0f, 0xc2, 0xc1, 0x00, 0x0f, 0x28, 0x10, 0x0f, 0xc2, 0xd3, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_4floats(1.0, 2.0, 3.0, 4.0));
emu.run(None).unwrap();
}