Browse Source

UserspaceEmulator: Always set C1 when rounding

Hendiadyoin1 4 years ago
parent
commit
fa02b46295
1 changed files with 6 additions and 13 deletions
  1. 6 13
      Userland/DevTools/UserspaceEmulator/SoftFPU.cpp

+ 6 - 13
Userland/DevTools/UserspaceEmulator/SoftFPU.cpp

@@ -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 (rnd > 0)
-            set_c1(1);
-        else
-            set_c1(0);
+    if (result != value)
         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));
-    if (auto rnd = (res - fpu_get(0))) {
-        if (rnd > 0)
-            set_c1(1);
-        else
-            set_c1(0);
-    }
+    auto res = fpu_round_checked<long double>(fpu_get(0));
     fpu_set(0, res);
     fpu_set(0, res);
 }
 }