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:
parent
7214b08f81
commit
fa02b46295
1 changed files with 6 additions and 13 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue