diff --git a/src/risc_v/interpreter/src/interpreter/rv64f.rs b/src/risc_v/interpreter/src/interpreter/rv64f.rs index ae1bf6312bf2b2c0002b0b9bcd939680aea848ea..35ba418d055d18ad41d5b3c8a9bef17af9e9a71b 100644 --- a/src/risc_v/interpreter/src/interpreter/rv64f.rs +++ b/src/risc_v/interpreter/src/interpreter/rv64f.rs @@ -6,6 +6,7 @@ //! //! Chapter 11 - "F" Standard Extension for Single-Precision Floating-Point +use super::float::FloatExt; use crate::{ machine_state::{ bus::main_memory::MainMemoryLayout, @@ -29,7 +30,14 @@ impl From for FValue { impl Into for FValue { fn into(self) -> Single { let val: u64 = self.into(); - Single::from_bits(val as u32 as u128) + + // Check value correctly NaN boxed: + // all upper bits must be set to 1 + if val >> 32 != 0xffffffff { + Single::canonical_nan() + } else { + Single::from_bits(val as u32 as u128) + } } }