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