Alexandre Julliard : msvcrt: Import ilogb() from musl.

Alexandre Julliard julliard at winehq.org
Tue Nov 17 15:04:07 CST 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov 17 09:59:54 2020 +0100

msvcrt: Import ilogb() from musl.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 configure           |  2 --
 configure.ac        |  2 --
 dlls/msvcrt/math.c  | 53 +++++++++++++++++++++++++++++++++++++----------------
 include/config.h.in |  6 ------
 4 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/configure b/configure
index e6409e264f9..4846c93e270 100755
--- a/configure
+++ b/configure
@@ -19512,8 +19512,6 @@ for ac_func in \
 	expm1f \
 	fma \
 	fmaf \
-	ilogb \
-	ilogbf \
 	j0 \
 	j1 \
 	jn \
diff --git a/configure.ac b/configure.ac
index f70329b41ae..d09fedccbb1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2698,8 +2698,6 @@ AC_CHECK_FUNCS(\
 	expm1f \
 	fma \
 	fmaf \
-	ilogb \
-	ilogbf \
 	j0 \
 	j1 \
 	jn \
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index f5e933fc188..6763b4a00dd 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -4402,32 +4402,53 @@ double CDECL MSVCR120_creal(_Dcomplex z)
     return z.x;
 }
 
+/*********************************************************************
+ *      ilogb (MSVCR120.@)
+ *
+ * Copied from musl: src/math/ilogb.c
+ */
 int CDECL MSVCR120_ilogb(double x)
 {
-    if (!x) return MSVCRT_FP_ILOGB0;
-    if (isnan(x)) return MSVCRT_FP_ILOGBNAN;
-    if (isinf(x)) return MSVCRT_INT_MAX;
+    union { double f; UINT64 i; } u = { x };
+    int e = u.i >> 52 & 0x7ff;
 
-#ifdef HAVE_ILOGB
-    return ilogb(x);
-#else
-    return logb(x);
-#endif
+    if (!e)
+    {
+        u.i <<= 12;
+        if (u.i == 0) return MSVCRT_FP_ILOGB0;
+        /* subnormal x */
+        for (e = -0x3ff; u.i >> 63 == 0; e--, u.i <<= 1);
+        return e;
+    }
+    if (e == 0x7ff) return u.i << 12 ? MSVCRT_FP_ILOGBNAN : MSVCRT_INT_MAX;
+    return e - 0x3ff;
 }
 
+/*********************************************************************
+ *      ilogbf (MSVCR120.@)
+ *
+ * Copied from musl: src/math/ilogbf.c
+ */
 int CDECL MSVCR120_ilogbf(float x)
 {
-    if (!x) return MSVCRT_FP_ILOGB0;
-    if (isnan(x)) return MSVCRT_FP_ILOGBNAN;
-    if (isinf(x)) return MSVCRT_INT_MAX;
+    union { float f; UINT32 i; } u = { x };
+    int e = u.i >> 23 & 0xff;
 
-#ifdef HAVE_ILOGBF
-    return ilogbf(x);
-#else
-    return logbf(x);
-#endif
+    if (!e)
+    {
+        u.i <<= 9;
+        if (u.i == 0) return MSVCRT_FP_ILOGB0;
+        /* subnormal x */
+        for (e = -0x7f; u.i >> 31 == 0; e--, u.i <<= 1);
+        return e;
+    }
+    if (e == 0xff) return u.i << 9 ? MSVCRT_FP_ILOGBNAN : MSVCRT_INT_MAX;
+    return e - 0x7f;
 }
 
+/*********************************************************************
+ *      ilogbl (MSVCR120.@)
+ */
 int CDECL MSVCR120_ilogbl(LDOUBLE x)
 {
     return MSVCR120_ilogb(x);
diff --git a/include/config.h.in b/include/config.h.in
index 241fa7ede38..cd13b9d4bee 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -288,12 +288,6 @@
 /* Define to 1 if you have the `if_nameindex' function. */
 #undef HAVE_IF_NAMEINDEX
 
-/* Define to 1 if you have the `ilogb' function. */
-#undef HAVE_ILOGB
-
-/* Define to 1 if you have the `ilogbf' function. */
-#undef HAVE_ILOGBF
-
 /* Define to 1 if you have the <inet/mib2.h> header file. */
 #undef HAVE_INET_MIB2_H
 




More information about the wine-cvs mailing list