Daniel Lehman : msvcr120: Add feclearexcept.

Alexandre Julliard julliard at winehq.org
Fri Mar 12 14:36:15 CST 2021


Module: wine
Branch: master
Commit: fd0c03c6447d272f22cde9ef6d4680995ecb6e5b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=fd0c03c6447d272f22cde9ef6d4680995ecb6e5b

Author: Daniel Lehman <dlehman25 at gmail.com>
Date:   Thu Mar 11 23:12:09 2021 -0800

msvcr120: Add feclearexcept.

Signed-off-by: Daniel Lehman <dlehman25 at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 .../api-ms-win-crt-runtime-l1-1-0.spec             |  2 +-
 dlls/msvcr120/msvcr120.spec                        |  2 +-
 dlls/msvcr120/tests/msvcr120.c                     | 26 ++++++++++++++++++++--
 dlls/msvcr120_app/msvcr120_app.spec                |  2 +-
 dlls/msvcrt/math.c                                 | 12 ++++++++++
 dlls/ucrtbase/ucrtbase.spec                        |  2 +-
 include/msvcrt/fenv.h                              |  1 +
 7 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec
index 1440e96db17..017155c65d5 100644
--- a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec
@@ -87,7 +87,7 @@
 @ cdecl _wsystem(wstr) ucrtbase._wsystem
 @ cdecl abort() ucrtbase.abort
 @ cdecl exit(long) ucrtbase.exit
-@ stub feclearexcept
+@ cdecl feclearexcept(long) ucrtbase.feclearexcept
 @ cdecl fegetenv(ptr) ucrtbase.fegetenv
 @ stub fegetexceptflag
 @ cdecl fegetround() ucrtbase.fegetround
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 7719bc662e0..105c349355e 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -2143,7 +2143,7 @@
 @ cdecl fdim(double double)
 @ cdecl fdimf(float float)
 @ cdecl fdiml(double double) fdim
-@ stub feclearexcept
+@ cdecl feclearexcept(long)
 @ cdecl fegetenv(ptr)
 @ stub fegetexceptflag
 @ cdecl fegetround()
diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c
index 9104cfcd447..cff6128bbe9 100644
--- a/dlls/msvcr120/tests/msvcr120.c
+++ b/dlls/msvcr120/tests/msvcr120.c
@@ -184,6 +184,7 @@ static int (CDECL *p_fegetround)(void);
 static int (CDECL *p_fesetround)(int);
 static int (CDECL *p_fesetexceptflag)(const fexcept_t*,int);
 static int (CDECL *p_fetestexcept)(int);
+static int (CDECL *p_feclearexcept)(int);
 static int (CDECL *p__clearfp)(void);
 static _locale_t (__cdecl *p_wcreate_locale)(int, const wchar_t *);
 static void (__cdecl *p_free_locale)(_locale_t);
@@ -261,6 +262,7 @@ static BOOL init(void)
     SET(p_fesetround, "fesetround");
     SET(p_fesetexceptflag, "fesetexceptflag");
     SET(p_fetestexcept, "fetestexcept");
+    SET(p_feclearexcept, "feclearexcept");
 
     SET(p__clearfp, "_clearfp");
     SET(p_vsscanf, "vsscanf");
@@ -854,6 +856,11 @@ static void test_feenv(void)
     except = p_fetestexcept(FE_ALL_EXCEPT);
     ok(except == (FE_INEXACT|FE_UNDERFLOW), "expected %x, got %lx\n", FE_INEXACT|FE_UNDERFLOW, except);
 
+    ret = p_feclearexcept(~FE_ALL_EXCEPT);
+    ok(!ret, "feclearexceptflag returned %x\n", ret);
+    except = p_fetestexcept(FE_ALL_EXCEPT);
+    ok(except == (FE_INEXACT|FE_UNDERFLOW), "expected %x, got %lx\n", FE_INEXACT|FE_UNDERFLOW, except);
+
     /* no crash, but no-op */
     ret = p_fesetexceptflag(NULL, 0);
     ok(!ret, "fesetexceptflag returned %x\n", ret);
@@ -885,7 +892,18 @@ static void test_feenv(void)
         ok(ret == flags, "Test %d: expected %x, got %x\n", i, flags, ret);
     }
 
-    p__clearfp();
+    for(i=0; i<ARRAY_SIZE(tests); i++) {
+        ret = p_feclearexcept(tests[i]);
+        ok(!ret, "Test %d: feclearexceptflag returned %x\n", i, ret);
+
+        flags &= ~tests[i];
+        except = p_fetestexcept(tests[i]);
+        ok(!except, "Test %d: expected %x, got %lx\n", i, flags, except);
+    }
+
+    except = p_fetestexcept(FE_ALL_EXCEPT);
+    ok(!except, "expected 0, got %lx\n", except);
+
     /* setting bits with except */
     for(i=0; i<ARRAY_SIZE(tests); i++) {
         except = tests[i];
@@ -909,7 +927,11 @@ static void test_feenv(void)
         ret = p_fetestexcept(tests2[i].get);
         ok(ret == tests2[i].expect, "Test %d: expected %lx, got %x\n", i, tests2[i].expect, ret);
     }
-    p__clearfp();
+
+    ret = p_feclearexcept(FE_ALL_EXCEPT);
+    ok(!ret, "feclearexceptflag returned %x\n", ret);
+    except = p_fetestexcept(FE_ALL_EXCEPT);
+    ok(!except, "expected 0, got %lx\n", except);
 }
 
 static void test__wcreate_locale(void)
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index 24d98427acf..e3cda9a0022 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -1809,7 +1809,7 @@
 @ cdecl fdim(double double) msvcr120.fdim
 @ cdecl fdimf(float float) msvcr120.fdimf
 @ cdecl fdiml(double double) msvcr120.fdiml
-@ stub feclearexcept
+@ cdecl feclearexcept(long) msvcr120.feclearexcept
 @ cdecl fegetenv(ptr) msvcr120.fegetenv
 @ stub fegetexceptflag
 @ cdecl fegetround() msvcr120.fegetround
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 16ff50f0334..16e940c21ce 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -2239,6 +2239,18 @@ int CDECL fesetexceptflag(const fexcept_t *status, int excepts)
     env._Fe_stat |= (*status & excepts);
     return fesetenv(&env);
 }
+
+/*********************************************************************
+ *      feclearexcept (MSVCR120.@)
+ */
+int CDECL feclearexcept(int flags)
+{
+    fenv_t env;
+
+    fegetenv(&env);
+    env._Fe_stat &= ~(flags & FE_ALL_EXCEPT);
+    return fesetenv(&env);
+}
 #endif
 
 #if _MSVCR_VER>=140
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index cd012aa0ab9..1df40c81b76 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -2286,7 +2286,7 @@
 @ cdecl fdim(double double)
 @ cdecl fdimf(float float)
 @ cdecl fdiml(double double) fdim
-@ stub feclearexcept
+@ cdecl feclearexcept(long)
 @ cdecl fegetenv(ptr)
 @ stub fegetexceptflag
 @ cdecl fegetround()
diff --git a/include/msvcrt/fenv.h b/include/msvcrt/fenv.h
index 6396bd688f3..b37fbc100bf 100644
--- a/include/msvcrt/fenv.h
+++ b/include/msvcrt/fenv.h
@@ -37,6 +37,7 @@ _ACRTIMP int __cdecl fesetenv(const fenv_t*);
 _ACRTIMP int __cdecl fegetround(void);
 _ACRTIMP int __cdecl fesetround(int);
 _ACRTIMP int __cdecl fesetexceptflag(const fexcept_t*, int);
+_ACRTIMP int __cdecl feclearexcept(int);
 _ACRTIMP int __cdecl fetestexcept(int);
 
 #ifdef __cplusplus




More information about the wine-cvs mailing list