1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:47:36 +00:00

UserspaceEmulator: Always set C1 when rounding

This commit is contained in:
Hendiadyoin1 2021-07-23 00:41:34 +02:00 committed by Linus Groh
parent 7214b08f81
commit fa02b46295

View file

@ -197,13 +197,12 @@ template<Arithmetic T>
ALWAYS_INLINE T SoftFPU::fpu_round_checked(long double value) ALWAYS_INLINE T SoftFPU::fpu_round_checked(long double value)
{ {
T result = fpu_round<T>(value); T result = fpu_round<T>(value);
if (auto rnd = value - result) { if (result != value)
if (rnd > 0)
set_c1(1);
else
set_c1(0);
fpu_set_exception(FPU_Exception::Precision); fpu_set_exception(FPU_Exception::Precision);
} if (result > value)
set_c1(1);
else
set_c1(0);
return result; return result;
} }
@ -791,13 +790,7 @@ void SoftFPU::FCHS(const X86::Instruction&)
void SoftFPU::FRNDINT(const X86::Instruction&) void SoftFPU::FRNDINT(const X86::Instruction&)
{ {
auto res = fpu_round<long double>(fpu_get(0)); auto res = fpu_round_checked<long double>(fpu_get(0));
if (auto rnd = (res - fpu_get(0))) {
if (rnd > 0)
set_c1(1);
else
set_c1(0);
}
fpu_set(0, res); fpu_set(0, res);
} }