Module: wine Branch: master Commit: be77f0c83f5268285dc1f35d089c9278342fbf3c URL: https://gitlab.winehq.org/wine/wine/-/commit/be77f0c83f5268285dc1f35d089c927...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 6 10:47:02 2024 +0200
ntdll: Fix inverted floating point masks on ARM64EC.
---
dlls/ntdll/unwind.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/dlls/ntdll/unwind.h b/dlls/ntdll/unwind.h index 78a2df8f41e..5b29969eb81 100644 --- a/dlls/ntdll/unwind.h +++ b/dlls/ntdll/unwind.h @@ -83,16 +83,16 @@ static inline UINT64 mxcsr_to_fpcsr( UINT mxcsr ) if (mxcsr & 0x0010) fpsr |= 0x0008; /* underflow */ if (mxcsr & 0x0020) fpsr |= 0x0010; /* precision */
- if (mxcsr & 0x0040) fpcr |= 0x0001; /* denormals are zero */ - if (mxcsr & 0x0080) fpcr |= 0x0100; /* invalid operation mask */ - if (mxcsr & 0x0100) fpcr |= 0x8000; /* denormal mask */ - if (mxcsr & 0x0200) fpcr |= 0x0200; /* zero-divide mask */ - if (mxcsr & 0x0400) fpcr |= 0x0400; /* overflow mask */ - if (mxcsr & 0x0800) fpcr |= 0x0800; /* underflow mask */ - if (mxcsr & 0x1000) fpcr |= 0x1000; /* precision mask */ - if (mxcsr & 0x2000) fpcr |= 0x800000; /* round down */ - if (mxcsr & 0x4000) fpcr |= 0x400000; /* round up */ - if (mxcsr & 0x8000) fpcr |= 0x1000000; /* flush to zero */ + if (mxcsr & 0x0040) fpcr |= 0x80000; /* denormals are zero */ + if (!(mxcsr & 0x0080)) fpcr |= 0x0100; /* invalid operation mask */ + if (!(mxcsr & 0x0100)) fpcr |= 0x8000; /* denormal mask */ + if (!(mxcsr & 0x0200)) fpcr |= 0x0200; /* zero-divide mask */ + if (!(mxcsr & 0x0400)) fpcr |= 0x0400; /* overflow mask */ + if (!(mxcsr & 0x0800)) fpcr |= 0x0800; /* underflow mask */ + if (!(mxcsr & 0x1000)) fpcr |= 0x1000; /* precision mask */ + if (mxcsr & 0x2000) fpcr |= 0x800000; /* round down */ + if (mxcsr & 0x4000) fpcr |= 0x400000; /* round up */ + if (mxcsr & 0x8000) fpcr |= 0x1000000; /* flush to zero */ return fpcr | ((UINT64)fpsr << 32); }
@@ -107,16 +107,16 @@ static inline UINT fpcsr_to_mxcsr( UINT fpcr, UINT fpsr ) if (fpsr & 0x0010) ret |= 0x0020; /* precision */ if (fpsr & 0x0080) ret |= 0x0002; /* denormal */
- if (fpcr & 0x0000001) ret |= 0x0040; /* denormals are zero */ - if (fpcr & 0x0000100) ret |= 0x0080; /* invalid operation mask */ - if (fpcr & 0x0000200) ret |= 0x0200; /* zero-divide mask */ - if (fpcr & 0x0000400) ret |= 0x0400; /* overflow mask */ - if (fpcr & 0x0000800) ret |= 0x0800; /* underflow mask */ - if (fpcr & 0x0001000) ret |= 0x1000; /* precision mask */ - if (fpcr & 0x0008000) ret |= 0x0100; /* denormal mask */ - if (fpcr & 0x0400000) ret |= 0x4000; /* round up */ - if (fpcr & 0x0800000) ret |= 0x2000; /* round down */ - if (fpcr & 0x1000000) ret |= 0x8000; /* flush to zero */ + if (fpcr & 0x0080000) ret |= 0x0040; /* denormals are zero */ + if (!(fpcr & 0x0000100)) ret |= 0x0080; /* invalid operation mask */ + if (!(fpcr & 0x0000200)) ret |= 0x0200; /* zero-divide mask */ + if (!(fpcr & 0x0000400)) ret |= 0x0400; /* overflow mask */ + if (!(fpcr & 0x0000800)) ret |= 0x0800; /* underflow mask */ + if (!(fpcr & 0x0001000)) ret |= 0x1000; /* precision mask */ + if (!(fpcr & 0x0008000)) ret |= 0x0100; /* denormal mask */ + if (fpcr & 0x0400000) ret |= 0x4000; /* round up */ + if (fpcr & 0x0800000) ret |= 0x2000; /* round down */ + if (fpcr & 0x1000000) ret |= 0x8000; /* flush to zero */ return ret; }