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 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,

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 1ce396f260a782922a67c8f15137ec5f4c008f01 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..ba5f74a
--- /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/s_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]