ソースを参照

UserspaceEmulator: Raise an error on FPU stack underflow

Accessing an unset part of the FPU stack should not be a simple warning,
but should trigger the FPU exception mechanism.
Hendiadyoin1 4 年 前
コミット
83f50a1507

+ 1 - 1
Userland/DevTools/UserspaceEmulator/SoftCPU.h

@@ -267,7 +267,7 @@ public:
     ValueWithShadow<u8> dl() const { return const_gpr8(X86::RegisterDL); }
     ValueWithShadow<u8> dh() const { return const_gpr8(X86::RegisterDH); }
 
-    long double fpu_get(u8 index) const { return m_fpu.fpu_get(index); }
+    long double fpu_get(u8 index) { return m_fpu.fpu_get(index); }
     long double fpu_pop() { return m_fpu.fpu_pop(); }
     MMX mmx_get(u8 index) const { return m_fpu.mmx_get(index); };
 

+ 3 - 11
Userland/DevTools/UserspaceEmulator/SoftFPU.cpp

@@ -38,15 +38,6 @@ ALWAYS_INLINE void warn_if_uninitialized(T value_with_shadow, const char* messag
 
 namespace UserspaceEmulator {
 
-ALWAYS_INLINE void SoftFPU::warn_if_fpu_not_set_absolute(u8 index) const
-{
-    if (!fpu_is_set(index)) [[unlikely]] {
-        // FIXME: Are we supposed to set a flag here?
-        //        We might need to raise a stack underflow here
-        reportln("\033[31;1mWarning! Read of uninitialized value on the FPU Stack ({} abs)\033[0m\n", index);
-        m_emulator.dump_backtrace();
-    }
-}
 ALWAYS_INLINE void SoftFPU::warn_if_mmx_absolute(u8 index) const
 {
     if (m_reg_is_mmx[index]) [[unlikely]] {
@@ -62,10 +53,11 @@ ALWAYS_INLINE void SoftFPU::warn_if_fpu_absolute(u8 index) const
     }
 }
 
-ALWAYS_INLINE long double SoftFPU::fpu_get(u8 index) const
+ALWAYS_INLINE long double SoftFPU::fpu_get(u8 index)
 {
     VERIFY(index < 8);
-    warn_if_fpu_not_set_absolute(index);
+    if (!fpu_is_set(index))
+        fpu_set_stack_underflow();
     warn_if_mmx_absolute(index);
 
     u8 effective_index = (m_fpu_stack_top + index) % 8;

+ 2 - 3
Userland/DevTools/UserspaceEmulator/SoftFPU.h

@@ -48,7 +48,7 @@ public:
     ALWAYS_INLINE void set_c2(bool val) { m_fpu_c2 = val; }
     ALWAYS_INLINE void set_c3(bool val) { m_fpu_c3 = val; }
 
-    long double fpu_get(u8 index) const;
+    long double fpu_get(u8 index);
 
     void fpu_push(long double value);
     long double fpu_pop();
@@ -246,7 +246,7 @@ private:
         set_tag_from_value_absolute((m_fpu_stack_top + index) % 8, val);
     }
 
-    ALWAYS_INLINE bool fpu_isnan(u8 index) const
+    ALWAYS_INLINE bool fpu_isnan(u8 index)
     {
         return isnan(fpu_get(index));
     }
@@ -279,7 +279,6 @@ private:
     }
     void warn_if_mmx_absolute(u8 index) const;
     void warn_if_fpu_absolute(u8 index) const;
-    void warn_if_fpu_not_set_absolute(u8 index) const;
 
     void mmx_common() { m_fpu_tw = 0; }