use crate::*;
const DATA_ADDR: u64 = 0x2000;
fn write_f32(mem: u64, addr: u64, value: f32) {
let mut emu = emu64();
emu.maps.write_bytes_slice(addr, &value.to_le_bytes());
}
fn write_f64(mem: u64, addr: u64, value: f64) {
let mut emu = emu64();
emu.maps.write_bytes_slice(addr, &value.to_le_bytes());
}
fn write_i16(mem: u64, addr: u64, value: i16) {
let mut emu = emu64();
emu.maps.write_bytes_slice(addr, &value.to_le_bytes());
}
fn write_i32(mem: u64, addr: u64, value: i32) {
let mut emu = emu64();
emu.maps.write_bytes_slice(addr, &value.to_le_bytes());
}
fn read_f64(mem: u64, addr: u64) -> f64 {
let emu = emu64();
let mut buf = [0u8; 8];
emu.maps.read_bytes_buff(&mut buf, addr);
f64::from_le_bytes(buf)
}
#[test]
fn test_fdiv_m32fp_basic() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xD8, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 10.0);
emu.maps.write_f32(DATA_ADDR + 8, 2.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 5.0);
}
#[test]
fn test_fdiv_m32fp_fractional_result() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xD8, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 10.0);
emu.maps.write_f32(DATA_ADDR + 8, 3.0);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert!((result - 3.333333333333333).abs() < 1e-10);
}
#[test]
fn test_fdiv_m32fp_negative_result() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xD8, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, -10.0);
emu.maps.write_f32(DATA_ADDR + 8, 2.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), -5.0);
}
#[test]
fn test_fdiv_m32fp_both_negative() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xD8, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, -10.0);
emu.maps.write_f32(DATA_ADDR + 8, -2.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 5.0);
}
#[test]
fn test_fdiv_m64fp_basic() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 100.0);
emu.maps.write_f64(DATA_ADDR + 8, 4.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 25.0);
}
#[test]
fn test_fdiv_m64fp_precision() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 1.0);
emu.maps.write_f64(DATA_ADDR + 8, 3.0);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert!((result - 0.3333333333333333).abs() < 1e-15);
}
#[test]
fn test_fdiv_st0_st1() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xD8,
0xF1, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 4.0);
emu.maps.write_f64(DATA_ADDR + 8, 20.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 5.0); }
#[test]
fn test_fdiv_st1_st0() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDC,
0xF9, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xDD, 0x1C, 0x25, 0x08, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 4.0);
emu.maps.write_f64(DATA_ADDR + 8, 20.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 20.0); assert_eq!(emu.maps.read_f64(0x3008).unwrap(), 0.2); }
#[test]
fn test_fdivp_st1_st0() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDE,
0xF9, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 5.0);
emu.maps.write_f64(DATA_ADDR + 8, 25.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 0.2); }
#[test]
fn test_fidiv_m16int_positive() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDE, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 100.0);
emu.maps.write_word(DATA_ADDR + 8, (4) as i16 as u16);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 25.0);
}
#[test]
fn test_fidiv_m16int_negative() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDE, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 50.0);
emu.maps.write_word(DATA_ADDR + 8, (-5) as i16 as u16);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), -10.0);
}
#[test]
fn test_fidiv_m32int_positive() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDA, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 1000.0);
emu.maps.write_dword(DATA_ADDR + 8, (8) as i32 as u32);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 125.0);
}
#[test]
fn test_fdivr_m32fp_basic() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xD8, 0x3C, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 2.0);
emu.maps.write_f32(DATA_ADDR + 8, 10.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 5.0); }
#[test]
fn test_fdivr_m32fp_negative() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xD8, 0x3C, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, -4.0);
emu.maps.write_f32(DATA_ADDR + 8, 20.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), -5.0); }
#[test]
fn test_fdivr_m64fp_basic() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x3C, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 4.0);
emu.maps.write_f64(DATA_ADDR + 8, 100.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 25.0); }
#[test]
fn test_fdivr_st0_st1() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xD8,
0xF9, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 4.0);
emu.maps.write_f64(DATA_ADDR + 8, 20.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 0.2); }
#[test]
fn test_fdivr_st1_st0() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDC,
0xF1, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xDD, 0x1C, 0x25, 0x08, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 4.0);
emu.maps.write_f64(DATA_ADDR + 8, 20.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 20.0); assert_eq!(emu.maps.read_f64(0x3008).unwrap(), 5.0); }
#[test]
fn test_fdivrp_st1_st0() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDE,
0xF1, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 5.0);
emu.maps.write_f64(DATA_ADDR + 8, 25.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 5.0); }
#[test]
fn test_fidivr_m16int_positive() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDE, 0x3C, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 5.0);
emu.maps.write_word(DATA_ADDR + 8, (100) as i16 as u16);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 20.0); }
#[test]
fn test_fidivr_m32int_positive() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDA, 0x3C, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 8.0);
emu.maps.write_dword(DATA_ADDR + 8, (1000) as i32 as u32);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 125.0); }
#[test]
fn test_fdiv_infinity_by_finite() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, f64::INFINITY);
emu.maps.write_f64(DATA_ADDR + 8, 2.0);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert!(result.is_infinite() && result.is_sign_positive());
}
#[test]
fn test_fdiv_finite_by_infinity() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 100.0);
emu.maps.write_f64(DATA_ADDR + 8, f64::INFINITY);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert_eq!(result, 0.0);
assert!(!result.is_sign_negative());
}
#[test]
fn test_fdiv_zero_by_nonzero() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 0.0);
emu.maps.write_f64(DATA_ADDR + 8, 5.0);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert_eq!(result, 0.0);
}
#[test]
fn test_fdiv_nan_propagation() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, f64::NAN);
emu.maps.write_f64(DATA_ADDR + 8, 5.0);
emu.run(None).unwrap();
assert!(emu.maps.read_f64(0x3000).unwrap().is_nan());
}
#[test]
fn test_fdiv_sign_rules() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 10.0);
emu.maps.write_f64(DATA_ADDR + 8, 2.0);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert_eq!(result, 5.0);
assert!(!result.is_sign_negative());
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, -10.0);
emu.maps.write_f64(DATA_ADDR + 8, -2.0);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert_eq!(result, 5.0);
assert!(!result.is_sign_negative());
}
#[test]
fn test_fdiv_by_one() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 123.456);
emu.maps.write_f64(DATA_ADDR + 8, 1.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 123.456);
}
#[test]
fn test_fdivr_vs_fdiv() {
let mut emu = emu64();
let code1 = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00,
0x00, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
let code2 = [
0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDC, 0x3C, 0x25, 0x00, 0x20, 0x00,
0x00, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code1);
emu.maps.write_f64(DATA_ADDR, 10.0);
emu.maps.write_f64(DATA_ADDR + 8, 2.0);
emu.run(None).unwrap();
let result1 = emu.maps.read_f64(0x3000).unwrap();
emu.load_code_bytes(&code2);
emu.maps.write_f64(DATA_ADDR, 10.0);
emu.maps.write_f64(DATA_ADDR + 8, 2.0);
emu.run(None).unwrap();
let result2 = emu.maps.read_f64(0x3000).unwrap();
assert_eq!(result1, result2);
}
#[test]
fn test_fdiv_chain() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x10, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x18, 0x20, 0x00, 0x00, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 1000.0);
emu.maps.write_f64(DATA_ADDR + 8, 10.0);
emu.maps.write_f64(DATA_ADDR + 16, 5.0);
emu.maps.write_f64(DATA_ADDR + 24, 2.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 10.0); }
#[test]
fn test_fidiv_precision() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDA, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 100.5);
emu.maps.write_dword(DATA_ADDR + 8, (2) as i32 as u32);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 50.25);
}
#[test]
fn test_fidivr_precision() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDA, 0x3C, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 5.0);
emu.maps.write_dword(DATA_ADDR + 8, (100) as i32 as u32);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 20.0); }
#[test]
fn test_fdiv_very_small() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 1.0e-100);
emu.maps.write_f64(DATA_ADDR + 8, 1.0e100);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 1.0e-200);
}
#[test]
fn test_fdiv_very_large() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 1.0e100);
emu.maps.write_f64(DATA_ADDR + 8, 1.0e-100);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 1.0e200);
}
#[test]
fn test_fdivp_stack_behavior() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x10, 0x20, 0x00, 0x00, 0xDE, 0xF9, 0xDE, 0xF9, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 8.0);
emu.maps.write_f64(DATA_ADDR + 8, 4.0);
emu.maps.write_f64(DATA_ADDR + 16, 16.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 32.0); }
#[test]
fn test_fdivrp_stack_behavior() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDD, 0x04, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDE, 0xF1, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 10.0);
emu.maps.write_f64(DATA_ADDR + 8, 50.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 5.0);
}
#[test]
fn test_fdiv_reciprocal() {
let mut emu = emu64(); let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 1.0);
emu.maps.write_f64(DATA_ADDR + 8, 8.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 0.125);
}
#[test]
fn test_fdivr_inverse_symmetry() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x3C, 0x25, 0x08, 0x20, 0x00,
0x00, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 4.0);
emu.maps.write_f64(DATA_ADDR + 8, 20.0);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 5.0); }
#[test]
fn test_fdiv_zero_sign_preservation() {
let mut emu = emu64();
let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xDC, 0x34, 0x25, 0x08, 0x20, 0x00, 0x00, 0xDD,
0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, -0.0);
emu.maps.write_f64(DATA_ADDR + 8, 5.0);
emu.run(None).unwrap();
let result = emu.maps.read_f64(0x3000).unwrap();
assert!(result == 0.0 && result.is_sign_negative());
}
#[test]
fn test_fdiv_self() {
let mut emu = emu64(); let code = [
0xDD, 0x04, 0x25, 0x00, 0x20, 0x00, 0x00, 0xD9, 0xC0, 0xDE, 0xF9, 0xDD, 0x1C, 0x25, 0x00, 0x30, 0x00, 0x00, 0xf4,
];
emu.load_code_bytes(&code);
emu.maps.write_f64(DATA_ADDR, 123.456);
emu.run(None).unwrap();
assert_eq!(emu.maps.read_f64(0x3000).unwrap(), 1.0);
}