Alexandre Julliard : msvcrt: Reimplement _fpclass().
Alexandre Julliard
julliard at winehq.org
Mon Nov 16 15:28:56 CST 2020
Module: wine
Branch: master
Commit: fd51f229f68ac17670aaa525cb4f6acc01807346
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fd51f229f68ac17670aaa525cb4f6acc01807346
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Nov 16 12:10:53 2020 +0100
msvcrt: Reimplement _fpclass().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
configure | 1 -
configure.ac | 1 -
.../api-ms-win-crt-math-l1-1-0.spec | 2 +-
.../api-ms-win-crt-private-l1-1-0.spec | 2 +-
dlls/msvcr100/msvcr100.spec | 2 +-
dlls/msvcr110/msvcr110.spec | 2 +-
dlls/msvcr120/msvcr120.spec | 2 +-
dlls/msvcr120_app/msvcr120_app.spec | 2 +-
dlls/msvcr80/msvcr80.spec | 2 +-
dlls/msvcr90/msvcr90.spec | 2 +-
dlls/msvcrt/math.c | 66 ++++++++++++----------
dlls/msvcrt/msvcrt.spec | 2 +-
dlls/ucrtbase/ucrtbase.spec | 4 +-
include/config.h.in | 3 -
14 files changed, 48 insertions(+), 45 deletions(-)
diff --git a/configure b/configure
index 42c9090c912..e6409e264f9 100755
--- a/configure
+++ b/configure
@@ -17728,7 +17728,6 @@ for ac_func in \
finitef \
fnmatch \
fork \
- fpclass \
fstatfs \
fstatvfs \
futimens \
diff --git a/configure.ac b/configure.ac
index 9103484d597..f70329b41ae 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2167,7 +2167,6 @@ AC_CHECK_FUNCS(\
finitef \
fnmatch \
fork \
- fpclass \
fstatfs \
fstatvfs \
futimens \
diff --git a/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec b/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec
index 579b97fee34..5f0cce6f05d 100644
--- a/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-math-l1-1-0/api-ms-win-crt-math-l1-1-0.spec
@@ -79,7 +79,7 @@
@ cdecl _finite(double) ucrtbase._finite
@ cdecl -arch=!i386 _finitef(float) ucrtbase._finitef
@ cdecl _fpclass(double) ucrtbase._fpclass
-@ stub _fpclassf
+@ cdecl -arch=!i386 _fpclassf(float) ucrtbase._fpclassf
@ cdecl -arch=i386 -ret64 _ftol() ucrtbase._ftol
@ cdecl -arch=win64 _get_FMA3_enable() ucrtbase._get_FMA3_enable
@ cdecl _hypot(double double) ucrtbase._hypot
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
index 6fcbab0f108..2a912bba7bf 100644
--- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
@@ -282,7 +282,7 @@
@ cdecl _o__findnext64i32(long ptr) ucrtbase._o__findnext64i32
@ cdecl _o__flushall() ucrtbase._o__flushall
@ cdecl _o__fpclass(double) ucrtbase._o__fpclass
-@ stub _o__fpclassf
+@ cdecl -arch=!i386 _o__fpclassf(float) ucrtbase._o__fpclassf
@ cdecl _o__fputc_nolock(long ptr) ucrtbase._o__fputc_nolock
@ cdecl _o__fputchar(long) ucrtbase._o__fputchar
@ cdecl _o__fputwc_nolock(long ptr) ucrtbase._o__fputwc_nolock
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 780c86ee715..fc15a97cfd8 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -824,7 +824,7 @@
@ cdecl _flushall() MSVCRT__flushall
@ extern _fmode MSVCRT__fmode
@ cdecl _fpclass(double) MSVCRT__fpclass
-# stub -arch=x86_64 _fpclassf
+@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr)
@ cdecl _fpreset()
@ stub _fprintf_l
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index 54196f63690..ff3b4a4dd0b 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1171,7 +1171,7 @@
@ cdecl _flushall() MSVCRT__flushall
@ extern _fmode MSVCRT__fmode
@ cdecl _fpclass(double) MSVCRT__fpclass
-# stub -arch=x86_64 _fpclassf
+@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr)
@ cdecl _fpreset()
@ stub _fprintf_l
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index f1e6fe210a7..08c817d8133 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1171,7 +1171,7 @@
@ cdecl _flushall() MSVCRT__flushall
@ extern _fmode MSVCRT__fmode
@ cdecl _fpclass(double) MSVCRT__fpclass
-# stub -arch=x86_64 _fpclassf
+@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr)
@ cdecl _fpreset()
@ stub _fprintf_l
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index 87a55210951..f74140c2311 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -1099,7 +1099,7 @@
@ cdecl _flushall() msvcr120._flushall
@ extern _fmode msvcr120._fmode
@ cdecl _fpclass(double) msvcr120._fpclass
-# stub -arch=x86_64 _fpclassf
+@ cdecl -arch=!i386 _fpclassf(float) msvcr120._fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr) msvcr120._fpieee_flt
@ cdecl _fpreset() msvcr120._fpreset
@ stub _fprintf_l
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 97e30c5563f..5f68ef2ec9b 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -490,7 +490,7 @@
@ cdecl _flushall() MSVCRT__flushall
@ extern _fmode MSVCRT__fmode
@ cdecl _fpclass(double) MSVCRT__fpclass
-# stub -arch=x86_64 _fpclassf
+@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr)
@ cdecl _fpreset()
@ stub _fprintf_l
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 5ea0226b3ba..c1cae65c933 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -473,7 +473,7 @@
@ cdecl _flushall() MSVCRT__flushall
@ extern _fmode MSVCRT__fmode
@ cdecl _fpclass(double) MSVCRT__fpclass
-# stub -arch=win64 _fpclassf(float)
+@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr)
@ cdecl _fpreset()
@ stub _fprintf_l
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index f113943c392..aa0c6f2f3de 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -208,6 +208,28 @@ float CDECL MSVCRT__logbf( float num )
#ifndef __i386__
+/*********************************************************************
+ * _fpclassf (MSVCRT.@)
+ */
+int CDECL MSVCRT__fpclassf( float num )
+{
+ union { float f; UINT32 i; } u = { num };
+ int e = u.i >> 23 & 0xff;
+ int s = u.i >> 31;
+
+ switch (e)
+ {
+ case 0:
+ if (u.i << 1) return s ? MSVCRT__FPCLASS_ND : MSVCRT__FPCLASS_PD;
+ return s ? MSVCRT__FPCLASS_NZ : MSVCRT__FPCLASS_PZ;
+ case 0xff:
+ if (u.i << 9) return ((u.i >> 22) & 1) ? MSVCRT__FPCLASS_QNAN : MSVCRT__FPCLASS_SNAN;
+ return s ? MSVCRT__FPCLASS_NINF : MSVCRT__FPCLASS_PINF;
+ default:
+ return s ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN;
+ }
+}
+
/*********************************************************************
* _finitef (MSVCRT.@)
*/
@@ -1391,35 +1413,21 @@ __ASM_GLOBAL_FUNC(MSVCRT__ftol,
*/
int CDECL MSVCRT__fpclass(double num)
{
-#if defined(HAVE_FPCLASS) || defined(fpclass)
- switch (fpclass( num ))
- {
- case FP_SNAN: return MSVCRT__FPCLASS_SNAN;
- case FP_QNAN: return MSVCRT__FPCLASS_QNAN;
- case FP_NINF: return MSVCRT__FPCLASS_NINF;
- case FP_PINF: return MSVCRT__FPCLASS_PINF;
- case FP_NDENORM: return MSVCRT__FPCLASS_ND;
- case FP_PDENORM: return MSVCRT__FPCLASS_PD;
- case FP_NZERO: return MSVCRT__FPCLASS_NZ;
- case FP_PZERO: return MSVCRT__FPCLASS_PZ;
- case FP_NNORM: return MSVCRT__FPCLASS_NN;
- case FP_PNORM: return MSVCRT__FPCLASS_PN;
- default: return MSVCRT__FPCLASS_PN;
- }
-#elif defined (fpclassify)
- switch (fpclassify( num ))
- {
- case FP_NAN: return MSVCRT__FPCLASS_QNAN;
- case FP_INFINITE: return signbit(num) ? MSVCRT__FPCLASS_NINF : MSVCRT__FPCLASS_PINF;
- case FP_SUBNORMAL: return signbit(num) ?MSVCRT__FPCLASS_ND : MSVCRT__FPCLASS_PD;
- case FP_ZERO: return signbit(num) ? MSVCRT__FPCLASS_NZ : MSVCRT__FPCLASS_PZ;
- }
- return signbit(num) ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN;
-#else
- if (!isfinite(num))
- return MSVCRT__FPCLASS_QNAN;
- return num == 0.0 ? MSVCRT__FPCLASS_PZ : (num < 0 ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN);
-#endif
+ union { double f; UINT64 i; } u = { num };
+ int e = u.i >> 52 & 0x7ff;
+ int s = u.i >> 63;
+
+ switch (e)
+ {
+ case 0:
+ if (u.i << 1) return s ? MSVCRT__FPCLASS_ND : MSVCRT__FPCLASS_PD;
+ return s ? MSVCRT__FPCLASS_NZ : MSVCRT__FPCLASS_PZ;
+ case 0x7ff:
+ if (u.i << 12) return ((u.i >> 51) & 1) ? MSVCRT__FPCLASS_QNAN : MSVCRT__FPCLASS_SNAN;
+ return s ? MSVCRT__FPCLASS_NINF : MSVCRT__FPCLASS_PINF;
+ default:
+ return s ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN;
+ }
}
/*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index f6eead8a518..cdf8859e1dd 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -456,7 +456,7 @@
@ cdecl _flushall() MSVCRT__flushall
@ extern _fmode MSVCRT__fmode
@ cdecl _fpclass(double) MSVCRT__fpclass
-# stub -arch=win64 _fpclassf(float)
+@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr)
@ cdecl _fpreset()
# stub _fprintf_l(ptr str ptr)
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 5f65b97a981..23e7824fe36 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -324,7 +324,7 @@
@ cdecl -arch=!i386 _finitef(float) MSVCRT__finitef
@ cdecl _flushall() MSVCRT__flushall
@ cdecl _fpclass(double) MSVCRT__fpclass
-@ stub _fpclassf
+@ cdecl -arch=!i386 _fpclassf(float) MSVCRT__fpclassf
@ cdecl -arch=i386,x86_64,arm,arm64 _fpieee_flt(long ptr ptr)
@ cdecl _fpreset()
@ cdecl _fputc_nolock(long ptr) MSVCRT__fputc_nolock
@@ -946,7 +946,7 @@
@ cdecl _o__findnext64i32(long ptr) MSVCRT__findnext64i32
@ cdecl _o__flushall() MSVCRT__flushall
@ cdecl _o__fpclass(double) MSVCRT__fpclass
-@ stub _o__fpclassf
+@ cdecl -arch=!i386 _o__fpclassf(float) MSVCRT__fpclassf
@ cdecl _o__fputc_nolock(long ptr) MSVCRT__fputc_nolock
@ cdecl _o__fputchar(long) MSVCRT__fputchar
@ cdecl _o__fputwc_nolock(long ptr) MSVCRT__fputwc_nolock
diff --git a/include/config.h.in b/include/config.h.in
index f2dfe2c9fa3..241fa7ede38 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -192,9 +192,6 @@
/* Define to 1 if you have the `fork' function. */
#undef HAVE_FORK
-/* Define to 1 if you have the `fpclass' function. */
-#undef HAVE_FPCLASS
-
/* Define if FreeType 2 is installed */
#undef HAVE_FREETYPE
More information about the wine-cvs
mailing list