[PATCH] msvcrt: Implement nearbyint and nearbyintf

Stefan Silviu sylviu44 at gmail.com
Thu Nov 17 13:53:20 CST 2016


It now has a fallback if the functions are missing.

Fixes https://bugs.winehq.org/show_bug.cgi?id=41695

Signed-off-by: Stefan Silviu <sylviu44 at gmail.com>
---
 configure                                          |  2 ++
 configure.ac                                       |  2 ++
 .../api-ms-win-crt-math-l1-1-0.spec                |  4 ++--
 dlls/msvcrt/math.c                                 | 24 ++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec                            |  2 ++
 dlls/ucrtbase/ucrtbase.spec                        |  4 ++--
 include/msvcrt/math.h                              |  3 +++
 7 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/configure b/configure
index f91d64d..d347956 100755
--- a/configure
+++ b/configure
@@ -17121,6 +17121,8 @@ for ac_func in \
  lrintf \
  lround \
  lroundf \
+  nearbyint \
+  nearbyintf \
  powl \
  remainder \
  remainderf \
diff --git a/configure.ac b/configure.ac
index 2489ac0..9c03fc8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2554,6 +2554,8 @@ AC_CHECK_FUNCS(\
  lrintf \
  lround \
  lroundf \
+  nearbyint \
+  nearbyintf \
  powl \
  remainder \
  remainderf \
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 f886b97..b781276 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
@@ -291,8 +291,8 @@
 @ stub nan
 @ stub nanf
 @ stub nanl
-@ stub nearbyint
-@ stub nearbyintf
+@ cdecl nearbyint(double) ucrtbase.nearbyint
+@ cdecl nearbyintf(float) ucrtbase.nearbyintf
 @ stub nearbyintl
 @ cdecl nextafter(double double) ucrtbase.nextafter
 @ cdecl nextafterf(float float) ucrtbase.nextafterf
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index e87151a..32c32b0 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -1354,6 +1354,30 @@ double CDECL MSVCRT__yn(int order, double num)
 }

 /*********************************************************************
+ * _nearbyint (MSVCRT.@)
+ */
+double CDECL MSVCRT_nearbyint(double num)
+{
+  #ifdef HAVE_NEARBYINT
+    return nearbyint(num);
+  #else
+    return num >= 0 ? floor(num + 0.5) : ceil(num - 0.5);
+  #endif
+}
+
+/*********************************************************************
+ * _nearbyintf (MSVCRT.@)
+ */
+float CDECL MSVCRT_nearbyintf(float num)
+{
+  #ifdef HAVE_NEARBYINTF
+    return nearbyintf(num);
+  #else
+    return MSVCRT_nearbyint(num);
+  #endif
+}
+
+/*********************************************************************
  * _nextafter (MSVCRT.@)
  */
 double CDECL MSVCRT__nextafter(double num, double next)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 0c1d4ad..d44e880 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -837,6 +837,8 @@
 @ cdecl _msize(ptr)
 # stub -arch=win32 _msize_debug(ptr long)
 # stub -arch=win64 _msize_dbg(ptr long)
+@ cdecl nearbyint(double) MSVCRT_nearbyint
+@ cdecl nearbyintf(float) MSVCRT_nearbyintf
 @ cdecl _nextafter(double double) MSVCRT__nextafter
 @ cdecl -arch=arm,x86_64 _nextafterf(float float) MSVCRT__nextafterf
 @ cdecl _onexit(ptr) MSVCRT__onexit
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 2aa0563..111de2e 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -2432,8 +2432,8 @@
 @ stub nan
 @ stub nanf
 @ stub nanl
-@ stub nearbyint
-@ stub nearbyintf
+@ cdecl nearbyint(double) MSVCRT_nearbyint
+@ cdecl nearbyintf(float) MSVCRT_nearbyintf
 @ stub nearbyintl
 @ cdecl nextafter(double double) MSVCRT__nextafter
 @ cdecl nextafterf(float float) MSVCRT__nextafterf
diff --git a/include/msvcrt/math.h b/include/msvcrt/math.h
index c76fe0d..5b42b4d 100644
--- a/include/msvcrt/math.h
+++ b/include/msvcrt/math.h
@@ -148,6 +148,9 @@ float __cdecl fmodf(float, float);

 #define ldexpf(x,y) ((float)ldexp((double)(x),(y)))

+double __cdecl nearbyint(double);
+float __cdecl nearbyintf(float);
+
 float __cdecl _hypotf(float, float);

 int __cdecl _matherr(struct _exception*);
-- 
2.10.2



More information about the wine-devel mailing list