[PATCH 3/3] msvcrt: Implement fesetenv for arm

Martin Storsjö martin at martin.st
Wed Aug 4 05:21:27 CDT 2021


Signed-off-by: Martin Storsjö <martin at martin.st>
---
 dlls/msvcrt/math.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 6f98d2ffaff..57345e634fe 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -6061,6 +6061,32 @@ int CDECL fesetenv(const fenv_t *env)
     if (fp_stat & _SW_DENORMAL)   fpsr |= 0x80;
     __asm__ __volatile__( "msr fpsr, %0" :: "r" (fpsr) );
     return 0;
+#elif defined(__arm__) && !defined(__SOFTFP__)
+    DWORD fpscr;
+    unsigned int unused_cw, fp_cw, unused_stat, fp_stat;
+
+    if (!env->_Fe_ctl && !env->_Fe_stat) {
+        _fpreset();
+        return 0;
+    }
+
+    if (!fenv_decode(env->_Fe_ctl, &unused_cw, &fp_cw))
+        return 1;
+    if (!fenv_decode(env->_Fe_stat, &unused_stat, &fp_stat))
+        return 1;
+
+    _control87(fp_cw, 0xffffffff);
+
+    __asm__ __volatile__( "vmrs %0, fpscr" : "=r" (fpscr) );
+    fpscr &= ~0x9f;
+    if (fp_stat & _SW_INVALID)    fpscr |= 0x1;
+    if (fp_stat & _SW_ZERODIVIDE) fpscr |= 0x2;
+    if (fp_stat & _SW_OVERFLOW)   fpscr |= 0x4;
+    if (fp_stat & _SW_UNDERFLOW)  fpscr |= 0x8;
+    if (fp_stat & _SW_INEXACT)    fpscr |= 0x10;
+    if (fp_stat & _SW_DENORMAL)   fpscr |= 0x80;
+    __asm__ __volatile__( "vmsr fpscr, %0" :: "r" (fpscr) );
+    return 0;
 #else
     FIXME( "not implemented\n" );
 #endif
-- 
2.25.1




More information about the wine-devel mailing list