use crate::arch::regs::fpr::Fpr;
use crate::isa::reg::RegIdx;
#[test]
fn fpr_all_registers_initially_zero() {
let fpr = Fpr::new();
for i in 0u8..32 {
assert_eq!(fpr.read(RegIdx::new(i)), 0, "f{} should be 0 initially", i);
}
}
#[test]
fn fpr_write_read_basic() {
let mut fpr = Fpr::new();
#[allow(clippy::approx_constant)]
let bits = f64::to_bits(3.14159);
fpr.write(RegIdx::new(0), bits);
assert_eq!(fpr.read(RegIdx::new(0)), bits);
}
#[test]
fn fpr_write_all_registers() {
let mut fpr = Fpr::new();
for i in 0u8..32 {
fpr.write(RegIdx::new(i), (i as u64 + 1) * 0x1000);
}
for i in 0u8..32 {
assert_eq!(fpr.read(RegIdx::new(i)), (i as u64 + 1) * 0x1000);
}
}
#[test]
fn fpr_overwrite() {
let mut fpr = Fpr::new();
fpr.write(RegIdx::new(5), f64::to_bits(1.0));
assert_eq!(fpr.read(RegIdx::new(5)), f64::to_bits(1.0));
fpr.write(RegIdx::new(5), f64::to_bits(2.0));
assert_eq!(fpr.read(RegIdx::new(5)), f64::to_bits(2.0));
}
#[test]
fn fpr_f0_writable() {
let mut fpr = Fpr::new();
fpr.write(RegIdx::new(0), f64::to_bits(42.0));
assert_eq!(fpr.read(RegIdx::new(0)), f64::to_bits(42.0));
}
#[test]
fn fpr_nan_boxed_f32_preserved() {
let mut fpr = Fpr::new();
let boxed: u64 = 0xFFFF_FFFF_3F80_0000; fpr.write(RegIdx::new(10), boxed);
assert_eq!(fpr.read(RegIdx::new(10)), boxed);
}
#[test]
fn fpr_canonical_nan_preserved() {
let mut fpr = Fpr::new();
let canon_nan_64 = 0x7FF8_0000_0000_0000u64;
fpr.write(RegIdx::new(15), canon_nan_64);
assert_eq!(fpr.read(RegIdx::new(15)), canon_nan_64);
}
#[test]
fn fpr_negative_zero_preserved() {
let mut fpr = Fpr::new();
let neg_zero = f64::to_bits(-0.0);
fpr.write(RegIdx::new(1), neg_zero);
assert_eq!(fpr.read(RegIdx::new(1)), neg_zero);
}
#[test]
fn fpr_infinity_preserved() {
let mut fpr = Fpr::new();
let pos_inf = f64::to_bits(f64::INFINITY);
let neg_inf = f64::to_bits(f64::NEG_INFINITY);
fpr.write(RegIdx::new(2), pos_inf);
fpr.write(RegIdx::new(3), neg_inf);
assert_eq!(fpr.read(RegIdx::new(2)), pos_inf);
assert_eq!(fpr.read(RegIdx::new(3)), neg_inf);
}
#[test]
fn fpr_subnormal_preserved() {
let mut fpr = Fpr::new();
let subnormal = f64::to_bits(f64::MIN_POSITIVE / 2.0);
fpr.write(RegIdx::new(20), subnormal);
assert_eq!(fpr.read(RegIdx::new(20)), subnormal);
}
#[test]
fn fpr_max_value() {
let mut fpr = Fpr::new();
fpr.write(RegIdx::new(31), u64::MAX);
assert_eq!(fpr.read(RegIdx::new(31)), u64::MAX);
}