use crate::tests::helpers;
use crate::*;
#[test]
pub fn elf64lin_fpu() {
helpers::setup();
let mut emu = emu64();
emu.cfg.maps_folder = "../../maps/maps64/".to_string();
let sample = "../../test/elf64lin_fpu.bin";
emu.load_code(sample);
emu.fpu_mut().clear();
emu.fpu_mut().trace = true;
assert_eq!(emu.fpu_mut().peek_st_u80(7), 0);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_f64(7), 1.0);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x4000c90fdaa22168c234); assert_eq!(emu.fpu_mut().peek_st_f64(6), 3.141592653589793);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x40018487ed5110b4611a);
assert_eq!(emu.fpu_mut().peek_st_f64(6), 4.141592653589793);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x4000c90fdaa22168c234);
assert_eq!(emu.fpu_mut().peek_st_f64(6), 3.141592653589793);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0xc000890fdaa22168c234);
assert_eq!(emu.fpu_mut().peek_st_f64(6), -2.141592653589793238);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x4000890fdaa22168c234);
assert_eq!(emu.fpu_mut().peek_st_f64(6), 2.141592653589793);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fffbb51491ea66b7000); assert_eq!(emu.fpu_mut().peek_st_f64(6), 1.4634181403788165);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3fffbb51491ea66b7000); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_f64(7), 1.4634181403788165);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3fffbb51491ea66b7000); if emu.fpu_mut().peek_st_u80(6) != 0x3fffc75922e5f71d3000 {
log::info!("f64:tan() -> 0x{:x}", emu.fpu_mut().peek_st_u80(6));
return; }
assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fffc75922e5f71d3000);
assert_eq!(emu.fpu_mut().peek_st_u80(5), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_f64(7), 1.4634181403788165);
assert_eq!(emu.fpu_mut().peek_st_f64(6), 1.5574077246549023);
assert_eq!(emu.fpu_mut().peek_st_f64(5), 1.0);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3fffbb51491ea66b7000); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fffc75922e5f71d3000); assert_eq!(emu.fpu_mut().peek_st_f64(7), 1.4634181403788165);
assert_eq!(emu.fpu_mut().peek_st_f64(6), 1.5574077246549023);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3ffef08ce6b636464000); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fffc75922e5f71d3000); assert_eq!(emu.fpu_mut().peek_st_u80(5), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_f64(7), 0.9396499819615878);
assert_eq!(emu.fpu_mut().peek_st_f64(6), 1.5574077246549023);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0x3fff8000000000000000); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fffc75922e5f71d3000); assert_eq!(emu.fpu_mut().peek_st_u80(5), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
emu.step(); assert_eq!(emu.fpu_mut().st.get_top(), 6);
assert_eq!(emu.fpu_mut().st.get_depth(), 2);
assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3ffd9a209a84fbcff800); assert_eq!(emu.fpu_mut().peek_st_f64(6), 0.3010299956639812);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0xbfffddb2dbec0456f800); assert_eq!(emu.fpu_mut().peek_st_f64(7), -1.7320208456446193);
emu.step(); emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0xbfffddb2dbec0456f800); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_u80(5), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
assert_eq!(emu.fpu_mut().peek_st_f64(7), -1.7320208456446193);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0xbfffddb2dbec0456f800); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_u80(5), 0x3fff8000000000000000);
assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
assert_eq!(emu.fpu_mut().peek_st_f64(7), -1.7320208456446193);
emu.step(); emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0xbfffddb2dbec0456f800); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0xbfffddb2dbec0456f800); assert_eq!(emu.fpu_mut().peek_st_f64(7), -1.7320208456446193);
assert_eq!(emu.fpu_mut().peek_st_f64(6), -1.7320208456446193);
assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
emu.step(); emu.step(); emu.step(); assert_eq!(emu.fpu_mut().peek_st_u80(7), 0xbfffddb2dbec0456f800); assert_eq!(emu.fpu_mut().peek_st_u80(6), 0xbfffddb2dbec0456f800); assert_eq!(emu.fpu_mut().peek_st_u80(0), 0xffffc000000000000000);
}