[12/28] math: Use wordsize-64 version for isnan
diff mbox series

Message ID 20190329133529.22523-13-adhemerval.zanella@linaro.org
State New
Headers show
Series
  • powerpc floating-point optimization refactor
Related show

Commit Message

Adhemerval Zanella March 29, 2019, 1:35 p.m. UTC
- math.h will use compiler builtin for gcc 4.4+ when built without
    -fsignaling-nans and the builtin is expanded inline for all
    supported architectures.  As an example, there is no intra isnan
    call on libm for the architecture I checked (x86, arm, aarch64,
    and powerpc).

  - The resulting binary difference on 32 bits architecture is minimum
    for the non hotspot symbol.

  - It helps wordsize-64 architectures that use ldbl-opt.

  - It add some code simplification with reduction of duplicated
    implementations.

Checked on powerpc-linux-gnu (built without --with-cpu, with
--with-cpu=power4 and with --with-cpu=power5+ and --disable-multi-arch),
powerpc64-linux-gnu (built without --with-cp and with --with-cpu=power5+
and --disable-multi-arch).

	* sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c: Move to ...
	* sysdeps/ieee754/dbl-64/s_isnan.c: ... here and format code.
---
 sysdeps/ieee754/dbl-64/s_isnan.c             | 17 +++------
 sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c | 40 --------------------
 2 files changed, 6 insertions(+), 51 deletions(-)
 delete mode 100644 sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c

Comments

Gabriel F. T. Gomes June 5, 2019, 10:45 p.m. UTC | #1
On Fri, Mar 29 2019, Adhemerval Zanella wrote:
> 
>   - The resulting binary difference on 32 bits architecture is minimum
>     for the non hotspot symbol.

I don't actually understand what the impact on 32-bits platforms would
be, so I can't comment on that, but, if this patch turns out to be
problematic for 32-bits, we could patch sysdeps/ieee754/ldbl-opt files
to be mindful of __WORDSIZE and selectively include files from
sysdeps/ieee754/dbl-64 or sysdeps/ieee754/dbl-64/wordsize-64 (see
attached patch for an explanation of what I mean).

My point in raising this is that the subsequent patch [1] benefits from
this current patch (or, alternatively, from the attached patch, since
they have the same outcame, as expected).  So, if this patch gets
objections we could go with the alternative.

[1] https://sourceware.org/ml/libc-alpha/2019-03/msg00674.html
diff --git a/sysdeps/ieee754/ldbl-opt/s_finite.c b/sysdeps/ieee754/ldbl-opt/s_finite.c
index 7d3ab0068d..85ad5e625a 100644
--- a/sysdeps/ieee754/ldbl-opt/s_finite.c
+++ b/sysdeps/ieee754/ldbl-opt/s_finite.c
@@ -1,5 +1,10 @@
+#include <limits.h>
 #include <math_ldbl_opt.h>
+#if __WORDSIZE == 64
+#include <sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c>
+#else
 #include <sysdeps/ieee754/dbl-64/s_finite.c>
+#endif
 weak_alias (__finite, ___finite)
 #if IS_IN (libm)
 # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
diff --git a/sysdeps/ieee754/ldbl-opt/s_isinf.c b/sysdeps/ieee754/ldbl-opt/s_isinf.c
index 1f760a0320..da5dc01601 100644
--- a/sysdeps/ieee754/ldbl-opt/s_isinf.c
+++ b/sysdeps/ieee754/ldbl-opt/s_isinf.c
@@ -1,5 +1,10 @@
+#include <limits.h>
 #include <math_ldbl_opt.h>
+#if __WORDSIZE == 64
+#include <sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c>
+#else
 #include <sysdeps/ieee754/dbl-64/s_isinf.c>
+#endif
 #if !IS_IN (libm)
 # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
 compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0);
diff --git a/sysdeps/ieee754/ldbl-opt/s_isnan.c b/sysdeps/ieee754/ldbl-opt/s_isnan.c
index 33f57f1955..99ee75ce34 100644
--- a/sysdeps/ieee754/ldbl-opt/s_isnan.c
+++ b/sysdeps/ieee754/ldbl-opt/s_isnan.c
@@ -1,5 +1,10 @@
+#include <limits.h>
 #include <math_ldbl_opt.h>
+#if __WORDSIZE == 64
+#include <sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c>
+#else
 #include <sysdeps/ieee754/dbl-64/s_isnan.c>
+#endif
 #if !IS_IN (libm)
 # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
 compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);

Patch
diff mbox series

diff --git a/sysdeps/ieee754/dbl-64/s_isnan.c b/sysdeps/ieee754/dbl-64/s_isnan.c
index 82723eeb8a..1f1535dea3 100644
--- a/sysdeps/ieee754/dbl-64/s_isnan.c
+++ b/sysdeps/ieee754/dbl-64/s_isnan.c
@@ -10,10 +10,6 @@ 
  * ====================================================
  */
 
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $";
-#endif
-
 /*
  * isnan(x) returns 1 is x is nan, else 0;
  * no branching!
@@ -23,17 +19,16 @@  static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $";
 #include <math_private.h>
 #include <ldbl-classify-compat.h>
 #include <shlib-compat.h>
+#include <stdint.h>
 
-#undef __isnan
 int
 __isnan (double x)
 {
-  int32_t hx, lx;
-  EXTRACT_WORDS (hx, lx, x);
-  hx &= 0x7fffffff;
-  hx |= (uint32_t) (lx | (-lx)) >> 31;
-  hx = 0x7ff00000 - hx;
-  return (int) (((uint32_t) hx) >> 31);
+  int64_t hx;
+  EXTRACT_WORDS64 (hx, x);
+  hx &= UINT64_C (0x7fffffffffffffff);
+  hx = UINT64_C (0x7ff0000000000000) - hx;
+  return (int)(((uint64_t)hx)>>63);
 }
 hidden_def (__isnan)
 weak_alias (__isnan, isnan)
diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c
deleted file mode 100644
index cd805d157b..0000000000
--- a/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c
+++ /dev/null
@@ -1,40 +0,0 @@ 
-/* @(#)s_isnan.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
- * isnan(x) returns 1 is x is nan, else 0;
- * no branching!
- */
-
-#include <math.h>
-#include <math_private.h>
-#include <ldbl-classify-compat.h>
-#include <shlib-compat.h>
-#include <stdint.h>
-
-#undef __isnan
-int __isnan(double x)
-{
-	int64_t hx;
-	EXTRACT_WORDS64(hx,x);
-	hx &= UINT64_C(0x7fffffffffffffff);
-	hx = UINT64_C(0x7ff0000000000000) - hx;
-	return (int)(((uint64_t)hx)>>63);
-}
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-#ifdef NO_LONG_DOUBLE
-# if LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23)
-compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
-# endif
-weak_alias (__isnan, isnanl)
-#endif