This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix ilogb exception and errno (bug 6794)


On Wednesday, April 18, 2012 10:49:33 David Miller wrote:
> From: Andreas Jaeger <aj@suse.com>
> Date: Wed, 18 Apr 2012 09:51:29 +0200
> 
> > On Wednesday, April 18, 2012 08:20:41 David Miller wrote:
> >> From: "Carlos O'Donell" <carlos@systemhalted.org>
> >> Date: Wed, 18 Apr 2012 00:45:13 -0400
> >> 
> >> > IMO, please feel free to revert this commit until someone fixes the
> >> > issue.
> >> 
> >> I'll give the guilty party one day to rectify this.
> > 
> > Dave, could you test the appended patch, please? It follows the
> > initial patch for the remaining files.
> > 
> > If this does not work, let's revert the patch,
> 
> You didn't update the files that include the older file names from
> sysdeps/ldbl-64-128/

Updated patch attached,

Andreas
-- 
 Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
  SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
   GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
    GPG fingerprint = 93A3 365E CE47 B889 DF7F  FED1 389A 563C C272 A126
From 5c27928fd660a8669cd30db06038769738ea9cb7 Mon Sep 17 00:00:00 2001
From: Andreas Jaeger <aj@suse.de>
Date: Wed, 18 Apr 2012 09:46:20 +0200
Subject: [PATCH] Finish ilogb changes

	[BZ# 6794]
	* sysdeps/ieee754/ldbl-96/s_ilogbl.c: Moved to ...
	* sysdeps/ieee754/ldbl-96/e_ilogbl.c: ... here.
	Rename __ilogbl to __ieee754_ilogbl and remove weak_alias.

	* sysdeps/ieee754/ldbl-128/s_ilogbl.c: Moved to ...
	* sysdeps/ieee754/ldbl-128/e_ilogbl.c: ... here.
	Rename __ilogbl to __ieee754_ilogbl and remove weak_alias.

	* sysdeps/ieee754/ldbl-64-128/s_ilogbl.c: Moved to ...
	* sysdeps/ieee754/ldbl-64-128/e_ilogbl.c: ... here.

	* sysdeps/sparc/sparc64/soft-fp/s_ilogbl.c: Moved to ...
	* sysdeps/sparc/sparc64/soft-fp/e_ilogbl.c: ... here.
	Rename __ilogbl to __ieee754_ilogbl and remove weak_alias.
---
 sysdeps/ieee754/ldbl-128/e_ilogbl.c      |   56 ++++++++++++++++++++
 sysdeps/ieee754/ldbl-128/s_ilogbl.c      |   57 ---------------------
 sysdeps/ieee754/ldbl-64-128/e_ilogbl.c   |    2 +
 sysdeps/ieee754/ldbl-64-128/s_ilogbl.c   |    5 --
 sysdeps/ieee754/ldbl-96/e_ilogbl.c       |   60 ++++++++++++++++++++++
 sysdeps/ieee754/ldbl-96/s_ilogbl.c       |   60 ----------------------
 sysdeps/sparc/sparc64/soft-fp/e_ilogbl.c |   79 +++++++++++++++++++++++++++++
 sysdeps/sparc/sparc64/soft-fp/s_ilogbl.c |   81 ------------------------------
 8 files changed, 197 insertions(+), 203 deletions(-)
 create mode 100644 sysdeps/ieee754/ldbl-128/e_ilogbl.c
 delete mode 100644 sysdeps/ieee754/ldbl-128/s_ilogbl.c
 create mode 100644 sysdeps/ieee754/ldbl-64-128/e_ilogbl.c
 delete mode 100644 sysdeps/ieee754/ldbl-64-128/s_ilogbl.c
 create mode 100644 sysdeps/ieee754/ldbl-96/e_ilogbl.c
 delete mode 100644 sysdeps/ieee754/ldbl-96/s_ilogbl.c
 create mode 100644 sysdeps/sparc/sparc64/soft-fp/e_ilogbl.c
 delete mode 100644 sysdeps/sparc/sparc64/soft-fp/s_ilogbl.c

diff --git a/sysdeps/ieee754/ldbl-128/e_ilogbl.c b/sysdeps/ieee754/ldbl-128/e_ilogbl.c
new file mode 100644
index 0000000..0a47649
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128/e_ilogbl.c
@@ -0,0 +1,56 @@
+/* s_ilogbl.c -- long double version of s_ilogb.c.
+ * Conversion to IEEE quad long double by Jakub Jelinek, jj@ultra.linux.cz.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: $";
+#endif
+
+/* ilogbl(long double x)
+ * return the binary exponent of non-zero x
+ * ilogbl(0) = FP_ILOGB0
+ * ilogbl(NaN) = FP_ILOGBNAN (no signal is raised)
+ * ilogbl(+-Inf) = INT_MAX (no signal is raised)
+ */
+
+#include <limits.h>
+#include <math.h>
+#include <math_private.h>
+
+int __ieee754_ilogbl (long double x)
+{
+	int64_t hx,lx;
+	int ix;
+
+	GET_LDOUBLE_WORDS64(hx,lx,x);
+	hx &= 0x7fffffffffffffffLL;
+	if(hx <= 0x0001000000000000LL) {
+	    if((hx|lx)==0)
+		return FP_ILOGB0;	/* ilogbl(0) = FP_ILOGB0 */
+	    else			/* subnormal x */
+		if(hx==0) {
+		    for (ix = -16431; lx>0; lx<<=1) ix -=1;
+		} else {
+		    for (ix = -16382, hx<<=15; hx>0; hx<<=1) ix -=1;
+		}
+	    return ix;
+	}
+	else if (hx<0x7fff000000000000LL) return (hx>>48)-0x3fff;
+	else if (FP_ILOGBNAN != INT_MAX) {
+	    /* ISO C99 requires ilogbl(+-Inf) == INT_MAX.  */
+	    if (((hx^0x7fff000000000000LL)|lx) == 0)
+		return INT_MAX;
+	}
+	return FP_ILOGBNAN;
+}
diff --git a/sysdeps/ieee754/ldbl-128/s_ilogbl.c b/sysdeps/ieee754/ldbl-128/s_ilogbl.c
deleted file mode 100644
index d52eb05..0000000
--- a/sysdeps/ieee754/ldbl-128/s_ilogbl.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* s_ilogbl.c -- long double version of s_ilogb.c.
- * Conversion to IEEE quad long double by Jakub Jelinek, jj@ultra.linux.cz.
- */
-
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: $";
-#endif
-
-/* ilogbl(long double x)
- * return the binary exponent of non-zero x
- * ilogbl(0) = FP_ILOGB0
- * ilogbl(NaN) = FP_ILOGBNAN (no signal is raised)
- * ilogbl(+-Inf) = INT_MAX (no signal is raised)
- */
-
-#include <limits.h>
-#include <math.h>
-#include <math_private.h>
-
-int __ilogbl(long double x)
-{
-	int64_t hx,lx;
-	int ix;
-
-	GET_LDOUBLE_WORDS64(hx,lx,x);
-	hx &= 0x7fffffffffffffffLL;
-	if(hx <= 0x0001000000000000LL) {
-	    if((hx|lx)==0)
-		return FP_ILOGB0;	/* ilogbl(0) = FP_ILOGB0 */
-	    else			/* subnormal x */
-		if(hx==0) {
-		    for (ix = -16431; lx>0; lx<<=1) ix -=1;
-		} else {
-		    for (ix = -16382, hx<<=15; hx>0; hx<<=1) ix -=1;
-		}
-	    return ix;
-	}
-	else if (hx<0x7fff000000000000LL) return (hx>>48)-0x3fff;
-	else if (FP_ILOGBNAN != INT_MAX) {
-	    /* ISO C99 requires ilogbl(+-Inf) == INT_MAX.  */
-	    if (((hx^0x7fff000000000000LL)|lx) == 0)
-		return INT_MAX;
-	}
-	return FP_ILOGBNAN;
-}
-weak_alias (__ilogbl, ilogbl)
diff --git a/sysdeps/ieee754/ldbl-64-128/e_ilogbl.c b/sysdeps/ieee754/ldbl-64-128/e_ilogbl.c
new file mode 100644
index 0000000..75a38e1
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-64-128/e_ilogbl.c
@@ -0,0 +1,2 @@
+#include <math_ldbl_opt.h>
+#include <sysdeps/ieee754/ldbl-128/e_ilogbl.c>
diff --git a/sysdeps/ieee754/ldbl-64-128/s_ilogbl.c b/sysdeps/ieee754/ldbl-64-128/s_ilogbl.c
deleted file mode 100644
index bb88082..0000000
--- a/sysdeps/ieee754/ldbl-64-128/s_ilogbl.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <math_ldbl_opt.h>
-#undef weak_alias
-#define weak_alias(n,a)
-#include <sysdeps/ieee754/ldbl-128/s_ilogbl.c>
-long_double_symbol (libm, __ilogbl, ilogbl);
diff --git a/sysdeps/ieee754/ldbl-96/e_ilogbl.c b/sysdeps/ieee754/ldbl-96/e_ilogbl.c
new file mode 100644
index 0000000..d5236fd
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/e_ilogbl.c
@@ -0,0 +1,60 @@
+/* s_ilogbl.c -- long double version of s_ilogb.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: $";
+#endif
+
+/* ilogbl(long double x)
+ * return the binary exponent of non-zero x
+ * ilogbl(0) = FP_ILOGB0
+ * ilogbl(NaN) = FP_ILOGBNAN (no signal is raised)
+ * ilogbl(+-Inf) = INT_MAX (no signal is raised)
+ */
+
+#include <limits.h>
+#include <math.h>
+#include <math_private.h>
+
+int __ieee754_ilogbl (long double x)
+{
+	int32_t es,hx,lx,ix;
+
+	GET_LDOUBLE_EXP(es,x);
+	es &= 0x7fff;
+	if(es==0) {
+	    GET_LDOUBLE_WORDS(es,hx,lx,x);
+	    if((hx|lx)==0)
+		return FP_ILOGB0;	/* ilogbl(0) = FP_ILOGB0 */
+	    else			/* subnormal x */
+		if(hx==0) {
+		    for (ix = -16415; lx>0; lx<<=1) ix -=1;
+		} else {
+		    for (ix = -16383; hx>0; hx<<=1) ix -=1;
+		}
+	    return ix;
+	}
+	else if (es<0x7fff) return es-0x3fff;
+	else if (FP_ILOGBNAN != INT_MAX)
+	{
+	    GET_LDOUBLE_WORDS(es,hx,lx,x);
+	    if (((hx & 0x7fffffff)|lx) == 0)
+	      /* ISO C99 requires ilogbl(+-Inf) == INT_MAX.  */
+	      return INT_MAX;
+	}
+	return FP_ILOGBNAN;
+}
+
diff --git a/sysdeps/ieee754/ldbl-96/s_ilogbl.c b/sysdeps/ieee754/ldbl-96/s_ilogbl.c
deleted file mode 100644
index 7534599..0000000
--- a/sysdeps/ieee754/ldbl-96/s_ilogbl.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* s_ilogbl.c -- long double version of s_ilogb.c.
- * Conversion to long double by Ulrich Drepper,
- * Cygnus Support, drepper@cygnus.com.
- */
-
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: $";
-#endif
-
-/* ilogbl(long double x)
- * return the binary exponent of non-zero x
- * ilogbl(0) = FP_ILOGB0
- * ilogbl(NaN) = FP_ILOGBNAN (no signal is raised)
- * ilogbl(+-Inf) = INT_MAX (no signal is raised)
- */
-
-#include <limits.h>
-#include <math.h>
-#include <math_private.h>
-
-int __ilogbl(long double x)
-{
-	int32_t es,hx,lx,ix;
-
-	GET_LDOUBLE_EXP(es,x);
-	es &= 0x7fff;
-	if(es==0) {
-	    GET_LDOUBLE_WORDS(es,hx,lx,x);
-	    if((hx|lx)==0)
-		return FP_ILOGB0;	/* ilogbl(0) = FP_ILOGB0 */
-	    else			/* subnormal x */
-		if(hx==0) {
-		    for (ix = -16415; lx>0; lx<<=1) ix -=1;
-		} else {
-		    for (ix = -16383; hx>0; hx<<=1) ix -=1;
-		}
-	    return ix;
-	}
-	else if (es<0x7fff) return es-0x3fff;
-	else if (FP_ILOGBNAN != INT_MAX)
-	{
-	    GET_LDOUBLE_WORDS(es,hx,lx,x);
-	    if (((hx & 0x7fffffff)|lx) == 0)
-	      /* ISO C99 requires ilogbl(+-Inf) == INT_MAX.  */
-	      return INT_MAX;
-	}
-	return FP_ILOGBNAN;
-}
-weak_alias (__ilogbl, ilogbl)
diff --git a/sysdeps/sparc/sparc64/soft-fp/e_ilogbl.c b/sysdeps/sparc/sparc64/soft-fp/e_ilogbl.c
new file mode 100644
index 0000000..e24eee2
--- /dev/null
+++ b/sysdeps/sparc/sparc64/soft-fp/e_ilogbl.c
@@ -0,0 +1,79 @@
+/* Software floating-point emulation.
+   ilogbl(x, exp)
+   Copyright (C) 1999, 2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek (jj@ultra.linux.cz).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* ilogbl(long double x)
+ * return the binary exponent of non-zero x
+ * ilogbl(0) = 0x80000001
+ * ilogbl(inf/NaN) = 0x7fffffff (no signal is raised)
+ */
+
+#include "soft-fp.h"
+#include "quad.h"
+#include <math.h>
+
+int __ieee754_ilogbl (long double x)
+{
+  FP_DECL_EX;
+  FP_DECL_Q(X);
+
+/*
+  FP_UNPACK_Q(X, x);
+  switch (X_c)
+    {
+    case FP_CLS_ZERO:
+      return FP_ILOGB0;
+    case FP_CLS_NAN:
+    case FP_CLS_INF:
+      return FP_ILOGBNAN;
+    default:
+      return X_e;
+    }
+ */
+  FP_UNPACK_RAW_Q(X, x);
+  switch (X_e)
+    {
+    default:
+      return X_e - _FP_EXPBIAS_Q;
+    case 0:
+#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
+      if (_FP_FRAC_ZEROP_4(X))
+	return FP_ILOGB0;
+      else
+	{
+	  _FP_I_TYPE shift;
+	  _FP_FRAC_CLZ_4(shift, X);
+	  shift -= _FP_FRACXBITS_Q;
+	  return X_e - _FP_EXPBIAS_Q - 1 + shift;
+	}
+#else
+      if (_FP_FRAC_ZEROP_2(X))
+	return FP_ILOGB0;
+      else
+	{
+	  _FP_I_TYPE shift;
+	  _FP_FRAC_CLZ_2(shift, X);
+	  shift -= _FP_FRACXBITS_Q;
+	  return X_e - _FP_EXPBIAS_Q - 1 + shift;
+	}
+#endif
+    case _FP_EXPBIAS_Q:
+      return FP_ILOGBNAN;
+    }
+}
diff --git a/sysdeps/sparc/sparc64/soft-fp/s_ilogbl.c b/sysdeps/sparc/sparc64/soft-fp/s_ilogbl.c
deleted file mode 100644
index 6d8bd00..0000000
--- a/sysdeps/sparc/sparc64/soft-fp/s_ilogbl.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Software floating-point emulation.
-   ilogbl(x, exp)
-   Copyright (C) 1999 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek (jj@ultra.linux.cz).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* ilogbl(long double x)
- * return the binary exponent of non-zero x
- * ilogbl(0) = 0x80000001
- * ilogbl(inf/NaN) = 0x7fffffff (no signal is raised)
- */
-
-#include "soft-fp.h"
-#include "quad.h"
-#include <math.h>
-
-int __ilogbl(long double x)
-{
-  FP_DECL_EX;
-  FP_DECL_Q(X);
-
-/*
-  FP_UNPACK_Q(X, x);
-  switch (X_c)
-    {
-    case FP_CLS_ZERO:
-      return FP_ILOGB0;
-    case FP_CLS_NAN:
-    case FP_CLS_INF:
-      return FP_ILOGBNAN;
-    default:
-      return X_e;
-    }
- */
-  FP_UNPACK_RAW_Q(X, x);
-  switch (X_e)
-    {
-    default:
-      return X_e - _FP_EXPBIAS_Q;
-    case 0:
-#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-      if (_FP_FRAC_ZEROP_4(X))
-	return FP_ILOGB0;
-      else
-	{
-	  _FP_I_TYPE shift;
-	  _FP_FRAC_CLZ_4(shift, X);
-	  shift -= _FP_FRACXBITS_Q;
-	  return X_e - _FP_EXPBIAS_Q - 1 + shift;
-	}
-#else
-      if (_FP_FRAC_ZEROP_2(X))
-	return FP_ILOGB0;
-      else
-	{
-	  _FP_I_TYPE shift;
-	  _FP_FRAC_CLZ_2(shift, X);
-	  shift -= _FP_FRACXBITS_Q;
-	  return X_e - _FP_EXPBIAS_Q - 1 + shift;
-	}
-#endif
-    case _FP_EXPBIAS_Q:
-      return FP_ILOGBNAN;
-    }
-}
-
-weak_alias (__ilogbl, ilogbl)
-- 
1.7.7


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]