mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 01:17:35 +00:00
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.
This commit is contained in:
parent
0d6d780183
commit
83f50a1507
3 changed files with 6 additions and 15 deletions
|
@ -267,7 +267,7 @@ public:
|
||||||
ValueWithShadow<u8> dl() const { return const_gpr8(X86::RegisterDL); }
|
ValueWithShadow<u8> dl() const { return const_gpr8(X86::RegisterDL); }
|
||||||
ValueWithShadow<u8> dh() const { return const_gpr8(X86::RegisterDH); }
|
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(); }
|
long double fpu_pop() { return m_fpu.fpu_pop(); }
|
||||||
MMX mmx_get(u8 index) const { return m_fpu.mmx_get(index); };
|
MMX mmx_get(u8 index) const { return m_fpu.mmx_get(index); };
|
||||||
|
|
||||||
|
|
|
@ -38,15 +38,6 @@ ALWAYS_INLINE void warn_if_uninitialized(T value_with_shadow, const char* messag
|
||||||
|
|
||||||
namespace UserspaceEmulator {
|
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
|
ALWAYS_INLINE void SoftFPU::warn_if_mmx_absolute(u8 index) const
|
||||||
{
|
{
|
||||||
if (m_reg_is_mmx[index]) [[unlikely]] {
|
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);
|
VERIFY(index < 8);
|
||||||
warn_if_fpu_not_set_absolute(index);
|
if (!fpu_is_set(index))
|
||||||
|
fpu_set_stack_underflow();
|
||||||
warn_if_mmx_absolute(index);
|
warn_if_mmx_absolute(index);
|
||||||
|
|
||||||
u8 effective_index = (m_fpu_stack_top + index) % 8;
|
u8 effective_index = (m_fpu_stack_top + index) % 8;
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
ALWAYS_INLINE void set_c2(bool val) { m_fpu_c2 = val; }
|
ALWAYS_INLINE void set_c2(bool val) { m_fpu_c2 = val; }
|
||||||
ALWAYS_INLINE void set_c3(bool val) { m_fpu_c3 = 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);
|
void fpu_push(long double value);
|
||||||
long double fpu_pop();
|
long double fpu_pop();
|
||||||
|
@ -246,7 +246,7 @@ private:
|
||||||
set_tag_from_value_absolute((m_fpu_stack_top + index) % 8, val);
|
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));
|
return isnan(fpu_get(index));
|
||||||
}
|
}
|
||||||
|
@ -279,7 +279,6 @@ private:
|
||||||
}
|
}
|
||||||
void warn_if_mmx_absolute(u8 index) const;
|
void warn_if_mmx_absolute(u8 index) const;
|
||||||
void warn_if_fpu_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; }
|
void mmx_common() { m_fpu_tw = 0; }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue