use crate::*;
const DATA_ADDR: u64 = 0x3000;
#[test]
fn test_cvtps2pd_xmm0_to_xmm1() {
let mut emu = emu64();
let code = [
0x0f, 0x5a, 0xc8, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm2_to_xmm3() {
let mut emu = emu64();
let code = [
0x0f, 0x5a, 0xda, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm4_to_xmm5() {
let mut emu = emu64();
let code = [
0x0f, 0x5a, 0xec, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm6_to_xmm7() {
let mut emu = emu64();
let code = [
0x0f, 0x5a, 0xfe, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm8_to_xmm9() {
let mut emu = emu64();
let code = [
0x45, 0x0f, 0x5a, 0xc8, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm10_to_xmm11() {
let mut emu = emu64();
let code = [
0x45, 0x0f, 0x5a, 0xda, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm14_to_xmm15() {
let mut emu = emu64();
let code = [
0x45, 0x0f, 0x5a, 0xfe, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm0_to_xmm15() {
let mut emu = emu64();
let code = [
0x44, 0x0f, 0x5a, 0xf8, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_xmm15_to_xmm0() {
let mut emu = emu64();
let code = [
0x41, 0x0f, 0x5a, 0xc7, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_mem_to_xmm0() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 1.0;
let f2: f32 = 2.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_mem_to_xmm1() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x08, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 3.5;
let f2: f32 = -4.25;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_mem_to_xmm7() {
let mut emu = emu64();
let code = [
0x48, 0xbb, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x3b, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 0.5;
let f2: f32 = 100.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_mem_to_xmm8() {
let mut emu = emu64();
let code = [
0x48, 0xb9, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x44, 0x0f, 0x5a, 0x01, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = -1.5;
let f2: f32 = 256.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_mem_to_xmm15() {
let mut emu = emu64();
let code = [
0x48, 0xba, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x44, 0x0f, 0x5a, 0x3a, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 0.125;
let f2: f32 = -0.0625;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_positive_zero() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 0.0;
let f2: f32 = 0.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_negative_zero() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = -0.0;
let f2: f32 = -0.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_mixed_zeros() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 0.0;
let f2: f32 = -0.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_positive_infinity() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = f32::INFINITY;
let f2: f32 = 1.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_negative_infinity() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = f32::NEG_INFINITY;
let f2: f32 = -1.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_both_infinity() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = f32::INFINITY;
let f2: f32 = f32::NEG_INFINITY;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_quiet_nan() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = f32::NAN;
let f2: f32 = 0.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_signaling_nan() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let snan: u32 = 0x7F800001; let normal: u32 = 0x3F800000;
let mut data = Vec::new();
data.extend_from_slice(&snan.to_le_bytes());
data.extend_from_slice(&normal.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_both_nan() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = f32::NAN;
let f2: f32 = f32::NAN;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_denormal_positive() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let denorm: u32 = 0x00000001; let normal: u32 = 0x3F800000;
let mut data = Vec::new();
data.extend_from_slice(&denorm.to_le_bytes());
data.extend_from_slice(&normal.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_denormal_negative() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let denorm: u32 = 0x80000001; let normal: u32 = 0xBF800000;
let mut data = Vec::new();
data.extend_from_slice(&denorm.to_le_bytes());
data.extend_from_slice(&normal.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_denormal_largest() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let denorm: u32 = 0x007FFFFF;
let normal: u32 = 0x3F800000;
let mut data = Vec::new();
data.extend_from_slice(&denorm.to_le_bytes());
data.extend_from_slice(&normal.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_small_values() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 1.0e-10;
let f2: f32 = -1.0e-10;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_large_values() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 1.0e30;
let f2: f32 = -1.0e30;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_fractional_values() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 0.333333;
let f2: f32 = 0.666666;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_powers_of_two() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 128.0;
let f2: f32 = 0.0625; let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_mixed_signs() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 42.5;
let f2: f32 = -17.25;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_with_displacement() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&(DATA_ADDR - 16).to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x40, 0x10, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 7.5;
let f2: f32 = 8.25;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_with_negative_displacement() {
let mut emu = emu64();
let code = [
0x48, 0xbb, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&(DATA_ADDR + 8).to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x4b, 0xf8, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = -99.99;
let f2: f32 = 88.88;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_rip_relative() {
let mut emu = emu64();
let code = [
0x0f, 0x5a, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_multiple_conversions() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0x0f, 0x5a, 0x08, 0x0f, 0x5a, 0x10, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 3.14159;
let f2: f32 = 2.71828;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_chain_registers() {
let mut emu = emu64();
let code = [
0x0f, 0x5a, 0xc8, 0x0f, 0x5a, 0xd1, 0xf4, ];
emu.load_code_bytes(&code);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_max_float32() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = f32::MAX;
let f2: f32 = 1.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_min_positive_float32() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = f32::MIN_POSITIVE;
let f2: f32 = 1.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}
#[test]
fn test_cvtps2pd_one_and_minus_one() {
let mut emu = emu64();
let code = [
0x48, 0xb8, ];
let mut full_code = code.to_vec();
full_code.extend_from_slice(&DATA_ADDR.to_le_bytes());
full_code.extend_from_slice(&[
0x0f, 0x5a, 0x00, 0xf4, ]);
emu.load_code_bytes(&full_code);
let f1: f32 = 1.0;
let f2: f32 = -1.0;
let mut data = Vec::new();
data.extend_from_slice(&f1.to_le_bytes());
data.extend_from_slice(&f2.to_le_bytes());
emu.maps.write_bytes_slice(DATA_ADDR, &data);
emu.run(None).unwrap();
}