Module: wine Branch: master Commit: 522e13e6825f9dd50ddb7ddc079f0abf5dfd1034 URL: https://source.winehq.org/git/wine.git/?a=commit;h=522e13e6825f9dd50ddb7ddc0...
Author: Piotr Caban piotr@codeweavers.com Date: Thu May 13 21:15:20 2021 +0200
include: Fix denormals handling in _fpclassf inline implementation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
include/msvcrt/math.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/include/msvcrt/math.h b/include/msvcrt/math.h index 43e82fc3bea..d2977b67c34 100644 --- a/include/msvcrt/math.h +++ b/include/msvcrt/math.h @@ -166,7 +166,20 @@ static inline float fmodf(float x, float y) { return fmod(x, y); }
static inline int _finitef(float x) { return _finite(x); } static inline int _isnanf(float x) { return _isnan(x); } -static inline int _fpclassf(float x) { return _fpclass(x); } + +static inline int _fpclassf(float x) +{ + unsigned int ix = *(int*)&x; + double d = x; + + /* construct denormal double */ + if (!(ix >> 23 & 0xff) && (ix << 1)) + { + unsigned __int64 id = (((unsigned __int64)ix >> 31) << 63) | 1; + d = *(double*)&id; + } + return _fpclass(d); +}
#endif