use crate::*;
const ALIGNED_ADDR: u64 = 0x3000;
const ALIGNED_ADDR2: u64 = 0x3100;
fn double_bits(val: f64) -> [u8; 8] {
val.to_le_bytes()
}
fn make_2doubles(f0: f64, f1: f64) -> Vec<u8> {
let mut data = Vec::new();
data.extend_from_slice(&double_bits(f0));
data.extend_from_slice(&double_bits(f1));
data
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let data = make_2doubles(1.0, 2.0);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(0.0, 0.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(0.0, 0.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(-1.0, -2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(-1.0, -2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_eq_high_precision() {
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, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(3.141592653589793, 2.718281828459045));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.141592653589793, 2.718281828459045));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(5.0, 6.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 6.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(5.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(-5.0, -4.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(-1.0, -0.5));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 10.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(5.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(10.0, 20.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(f64::NAN, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(f64::NAN, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(f64::NAN, f64::NAN));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(f64::NAN, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x03, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x04, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x04, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x04, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(f64::NAN, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x05, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(10.0, 20.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x05, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(10.0, 20.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x05, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(f64::NAN, 20.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(10.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x06, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(10.0, 20.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x06, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x06, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(f64::NAN, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(f64::NAN, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, f64::NAN));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x07, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(f64::NAN, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(f64::NAN, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, f64::NEG_INFINITY));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(f64::INFINITY, 0.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(0.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(-0.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
let denorm = f64::from_bits(0x0000000000000001); emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(denorm, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0xc2, 0x03, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let data = make_2doubles(1.0, 2.0);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0xc2, 0x03, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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, 0x28, 0x10, 0x66, 0x0f, 0x28, 0x1b, 0x66, 0x0f, 0xc2, 0xd3, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let data = make_2doubles(1.0, 2.0);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &data);
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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, 0x28, 0x38, 0x66, 0x0f, 0x28, 0x33, 0x66, 0x0f, 0xc2, 0xfe, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3.0, 4.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x44, 0x0f, 0x28, 0x38, 0x66, 0x44, 0x0f, 0x28, 0x03, 0x66, 0x45, 0x0f, 0xc2, 0xf8, 0x02, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1e200, 2e200));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3e200, 4e200));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1e-200, 2e-200));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(3e-200, 4e-200));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(-1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, -2.0));
emu.run(None).unwrap();
}
#[test]
fn test_cmppd_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(&[
0x66, 0x0f, 0x28, 0x00, 0x66, 0x0f, 0x28, 0x0b, 0x66, 0x0f, 0xc2, 0xc1, 0x00, 0x66, 0x0f, 0x28, 0x10, 0x66, 0x0f, 0xc2, 0xd3, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
emu.maps.write_bytes_slice(ALIGNED_ADDR, &make_2doubles(1.0, 2.0));
emu.maps.write_bytes_slice(ALIGNED_ADDR2, &make_2doubles(1.0, 2.0));
emu.run(None).unwrap();
}