about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-04-27 05:31:37 +0000
committerUlrich Drepper <drepper@redhat.com>2009-04-27 05:31:37 +0000
commitf0e3c47fd6879b96d9ce712284e8a349092262dd (patch)
treef26027586e7a72165b1939cb07df890892b367cd
parent49768bb93e4960a814563ee30213eaf36e6dcb48 (diff)
downloadglibc-f0e3c47fd6879b96d9ce712284e8a349092262dd.tar.gz
glibc-f0e3c47fd6879b96d9ce712284e8a349092262dd.tar.xz
glibc-f0e3c47fd6879b96d9ce712284e8a349092262dd.zip
* sysdeps/ieee754/dbl-64/s_expm1.c: Set errno for overflow.
	* sysdeps/ieee754/flt-32/s_expm1f.c: Likewise.
	* sysdeps/x86_64/fpu/s_expm1l.S: Likewise.
-rw-r--r--ChangeLog4
-rw-r--r--sysdeps/ieee754/dbl-64/s_expm1.c6
-rw-r--r--sysdeps/ieee754/flt-32/s_expm1f.c6
-rw-r--r--sysdeps/x86_64/fpu/s_expm1l.S6
4 files changed, 17 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 10a28daef3..62614807ba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2009-04-26  Ulrich Drepper  <drepper@redhat.com>
 
+	* sysdeps/ieee754/dbl-64/s_expm1.c: Set errno for overflow.
+	* sysdeps/ieee754/flt-32/s_expm1f.c: Likewise.
+	* sysdeps/x86_64/fpu/s_expm1l.S: Likewise.
+
 	* sysdeps/ieee754/k_standard.c (__kernel_standard): Pole errors in
 	atanh should set ERANGE.
 
diff --git a/sysdeps/ieee754/dbl-64/s_expm1.c b/sysdeps/ieee754/dbl-64/s_expm1.c
index bfd15b2e31..324354336e 100644
--- a/sysdeps/ieee754/dbl-64/s_expm1.c
+++ b/sysdeps/ieee754/dbl-64/s_expm1.c
@@ -112,6 +112,7 @@ static char rcsid[] = "$NetBSD: s_expm1.c,v 1.8 1995/05/10 20:47:09 jtc Exp $";
  * to produce the hexadecimal values shown.
  */
 
+#include <errno.h>
 #include "math.h"
 #include "math_private.h"
 #define one Q[0]
@@ -159,7 +160,10 @@ Q[]  =  {1.0, -3.33333333333331316428e-02, /* BFA11111 111110F4 */
 		         return x+x; 	 /* NaN */
 		    else return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
 	        }
-	        if(x > o_threshold) return huge*huge; /* overflow */
+	        if(x > o_threshold) {
+		  __set_errno (ERANGE);
+		  return huge*huge; /* overflow */
+		}
 	    }
 	    if(xsb!=0) { /* x < -56*ln2, return -1.0 with inexact */
 		if(x+tiny<0.0)		/* raise inexact */
diff --git a/sysdeps/ieee754/flt-32/s_expm1f.c b/sysdeps/ieee754/flt-32/s_expm1f.c
index 1f032be25f..3f4536b906 100644
--- a/sysdeps/ieee754/flt-32/s_expm1f.c
+++ b/sysdeps/ieee754/flt-32/s_expm1f.c
@@ -17,6 +17,7 @@
 static char rcsid[] = "$NetBSD: s_expm1f.c,v 1.5 1995/05/10 20:47:11 jtc Exp $";
 #endif
 
+#include <errno.h>
 #include "math.h"
 #include "math_private.h"
 
@@ -63,7 +64,10 @@ Q5  =  -2.0109921195e-07; /* 0xb457edbb */
 		    return x+x; 	 /* NaN */
 		if(hx==0x7f800000)
 		    return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
-	        if(x > o_threshold) return huge*huge; /* overflow */
+	        if(x > o_threshold) {
+		  __set_errno (ERANGE);
+		  return huge*huge; /* overflow */
+		}
 	    }
 	    if(xsb!=0) { /* x < -27*ln2, return -1.0 with inexact */
 		if(x+tiny<(float)0.0)	/* raise inexact */
diff --git a/sysdeps/x86_64/fpu/s_expm1l.S b/sysdeps/x86_64/fpu/s_expm1l.S
index 05a1bfcce1..c0b93e94a9 100644
--- a/sysdeps/x86_64/fpu/s_expm1l.S
+++ b/sysdeps/x86_64/fpu/s_expm1l.S
@@ -1,5 +1,5 @@
 /* ix87 specific implementation of exp(x)-1.
-   Copyright (C) 1996, 1997, 2001, 2002, 2008 Free Software Foundation, Inc.
+   Copyright (C) 1996,1997,2001,2002,2008,2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
    Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>.
@@ -51,7 +51,7 @@ ENTRY(__expm1l)
 	movzwl	8+8(%rsp), %eax	// load sign bit and 15-bit exponent
 	xorb	$0x80, %ah	// invert sign bit (now 1 is "positive")
 	cmpl	$0xc006, %eax	// is num positive and exp >= 6 (number is >= 128.0)?
-	jae     __ieee754_expl	// (if num is denormal, it is at least >= 64.0)
+	jae     __expl		// (if num is denormal, it is at least >= 64.0)
 
 	fldt	8(%rsp)		// x
 	fxam			// Is NaN or +-Inf?
@@ -76,7 +76,7 @@ ENTRY(__expm1l)
 	fscale			// 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
 	fsubrl	MO(one)		// 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
 	fstp	%st(1)		// 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
-	fsubrp	%st, %st(1)	// 2^(log2(e)*x)
+	fsubrp	%st, %st(1)	// 2^(log2(e)*x)-1
 	ret
 
 2:	testl	$0x200, %eax	// Test sign.