Module: wine Branch: master Commit: 201266769dace8f2afb57924a3f9c6e3f571aa21 URL: https://source.winehq.org/git/wine.git/?a=commit;h=201266769dace8f2afb57924a...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Jan 31 21:36:40 2022 +0100
msvcrt: Don't use fegetenv in nearbyintf.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/math.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 3907dc9dc94..b13a4e03fd1 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -6873,13 +6873,25 @@ double CDECL nearbyint(double x) */ float CDECL nearbyintf(float x) { - fenv_t env; + BOOL update_cw, update_sw; + unsigned int cw, sw;
- fegetenv(&env); - _control87(_MCW_EM, _MCW_EM); + _setfp(&cw, 0, &sw, 0); + update_cw = !(cw & _EM_INEXACT); + update_sw = !(sw & _SW_INEXACT); + if (update_cw) + { + cw |= _EM_INEXACT; + _setfp(&cw, _EM_INEXACT, NULL, 0); + } x = rintf(x); - feclearexcept(FE_INEXACT); - feupdateenv(&env); + if (update_cw || update_sw) + { + sw = 0; + cw &= ~_EM_INEXACT; + _setfp(update_cw ? &cw : NULL, _EM_INEXACT, + update_sw ? &sw : NULL, _SW_INEXACT); + } return x; }