diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-04-26 01:04:54 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-04-26 01:04:54 +0000 |
commit | 0c59a1963e948c546e0d3e34de974c7e71de1134 (patch) | |
tree | d2d20501ed445fc7e36e3cb4b0491a744c982976 | |
parent | 4bbf8999f4d93c5da77737ccf06a1aa67225d3f4 (diff) | |
download | glibc-0c59a1963e948c546e0d3e34de974c7e71de1134.zip glibc-0c59a1963e948c546e0d3e34de974c7e71de1134.tar.gz glibc-0c59a1963e948c546e0d3e34de974c7e71de1134.tar.bz2 |
* sysdeps/i386/fpu/s_cos.S: Set errno for ±Inf.
* sysdeps/i386/fpu/s_cosf.S: Likewise.
* sysdeps/i386/fpu/s_cosl.S: Likewise.
* sysdeps/i386/fpu/s_sin.S: Likewise.
* sysdeps/i386/fpu/s_sinf.S: Likewise.
* sysdeps/i386/fpu/s_sinl.S: Likewise.
* sysdeps/ieee754/dbl-64/s_sin.c: Likewise.
* sysdeps/ieee754/flt-32/s_cosf.c: Likewise.
* sysdeps/ieee754/flt-32/s_sinf.c: Likewise.
* sysdeps/ieee754/ldbl-96/s_cosl.c: Likewise.
* sysdeps/ieee754/ldbl-96/s_sinl.c: Likewise.
* sysdeps/x86_64/fpu/s_cosl.S: Likewise.
* sysdeps/x86_64/fpu/s_sinl.S: Likewise.
* math/libm-test.inc: Add tests for errno after sin/cos calls with
±Inf.
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | math/libm-test.inc | 14 | ||||
-rw-r--r-- | stdio-common/stdio_lim.h.in | 2 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_cos.S | 27 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_cosf.S | 27 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_cosl.S | 29 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_sin.S | 27 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_sinf.S | 27 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_sinl.S | 29 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_sin.c | 15 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_cosf.c | 9 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_sinf.c | 9 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_cosl.c | 7 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_sinl.c | 7 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/s_cosl.S | 16 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/s_sinl.S | 14 |
16 files changed, 250 insertions, 25 deletions
@@ -1,5 +1,21 @@ 2009-04-25 Ulrich Drepper <drepper@redhat.com> + * sysdeps/i386/fpu/s_cos.S: Set errno for ±Inf. + * sysdeps/i386/fpu/s_cosf.S: Likewise. + * sysdeps/i386/fpu/s_cosl.S: Likewise. + * sysdeps/i386/fpu/s_sin.S: Likewise. + * sysdeps/i386/fpu/s_sinf.S: Likewise. + * sysdeps/i386/fpu/s_sinl.S: Likewise. + * sysdeps/ieee754/dbl-64/s_sin.c: Likewise. + * sysdeps/ieee754/flt-32/s_cosf.c: Likewise. + * sysdeps/ieee754/flt-32/s_sinf.c: Likewise. + * sysdeps/ieee754/ldbl-96/s_cosl.c: Likewise. + * sysdeps/ieee754/ldbl-96/s_sinl.c: Likewise. + * sysdeps/x86_64/fpu/s_cosl.S: Likewise. + * sysdeps/x86_64/fpu/s_sinl.S: Likewise. + * math/libm-test.inc: Add tests for errno after sin/cos calls with + ±Inf. + * stdlib/strtod_l.c (round_and_return): We have to set errno to ERANGE for underflows. * stdlib/tst-strtod.c (tests): Two tests should set errno to ERANGE. diff --git a/math/libm-test.inc b/math/libm-test.inc index 68f2f05..5f4dbe7 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1997-2006, 2007, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@suse.de>, 1997. @@ -1993,9 +1993,15 @@ cos_test (void) TEST_f_f (cos, 0, 1); TEST_f_f (cos, minus_zero, 1); + errno = 0; TEST_f_f (cos, plus_infty, nan_value, INVALID_EXCEPTION); + check_int ("errno for cos(+inf) == EDOM", errno, EDOM, 0, 0, 0); + errno = 0; TEST_f_f (cos, minus_infty, nan_value, INVALID_EXCEPTION); + check_int ("errno for cos(-inf) == EDOM", errno, EDOM, 0, 0, 0); + errno = 0; TEST_f_f (cos, nan_value, nan_value); + check_int ("errno for cos(NaN) unchanged", errno, 0, 0, 0, 0); TEST_f_f (cos, M_PI_6l * 2.0, 0.5); TEST_f_f (cos, M_PI_6l * 4.0, -0.5); @@ -5497,9 +5503,15 @@ sin_test (void) TEST_f_f (sin, 0, 0); TEST_f_f (sin, minus_zero, minus_zero); + errno = 0; TEST_f_f (sin, plus_infty, nan_value, INVALID_EXCEPTION); + check_int ("errno for sin(+inf) == EDOM", errno, EDOM, 0, 0, 0); + errno = 0; TEST_f_f (sin, minus_infty, nan_value, INVALID_EXCEPTION); + check_int ("errno for sin(-inf) == EDOM", errno, EDOM, 0, 0, 0); + errno = 0; TEST_f_f (sin, nan_value, nan_value); + check_int ("errno for sin(NaN) unchanged", errno, 0, 0, 0, 0); TEST_f_f (sin, M_PI_6l, 0.5); TEST_f_f (sin, -M_PI_6l, -0.5); diff --git a/stdio-common/stdio_lim.h.in b/stdio-common/stdio_lim.h.in index 806326d..a827255 100644 --- a/stdio-common/stdio_lim.h.in +++ b/stdio-common/stdio_lim.h.in @@ -27,7 +27,7 @@ # ifdef __USE_POSIX # define L_ctermid @L_ctermid@ -# ifndef __USE_XOPEN2K +# if !defined __USE_XOPEN2K || defined __USE_GNU # define L_cuserid @L_cuserid@ # endif # endif diff --git a/sysdeps/i386/fpu/s_cos.S b/sysdeps/i386/fpu/s_cos.S index ac8b145..d341d00 100644 --- a/sysdeps/i386/fpu/s_cos.S +++ b/sysdeps/i386/fpu/s_cos.S @@ -1,15 +1,24 @@ /* * Written by J.T. Conklin <jtc@netbsd.org>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. * Public domain. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> RCSID("$NetBSD: s_cos.S,v 1.5 1995/05/08 23:54:00 jtc Exp $") ENTRY(__cos) fldl 4(%esp) - fcos + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fcos fnstsw %ax testl $0x400,%eax jnz 1f @@ -25,5 +34,21 @@ ENTRY(__cos) fstp %st(1) fcos ret +3: +#ifdef PIC + pushl %ebx + cfi_adjust_cfa_offset (4) + cfi_rel_offset (ebx, 0) + LOAD_PIC_REG (bx) + call __errno_location@PLT + movl $EDOM, (%eax) + popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) +#else + call __errno_location@PLT + movl $EDOM, (%eax) +#endif + jmp 4b END (__cos) weak_alias (__cos, cos) diff --git a/sysdeps/i386/fpu/s_cosf.S b/sysdeps/i386/fpu/s_cosf.S index 21f87aa..578967a 100644 --- a/sysdeps/i386/fpu/s_cosf.S +++ b/sysdeps/i386/fpu/s_cosf.S @@ -1,15 +1,24 @@ /* * Written by J.T. Conklin <jtc@netbsd.org>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. * Public domain. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> RCSID("$NetBSD: s_cosf.S,v 1.3 1995/05/08 23:55:16 jtc Exp $") ENTRY(__cosf) flds 4(%esp) - fcos + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fcos fnstsw %ax testl $0x400,%eax jnz 1f @@ -25,5 +34,21 @@ ENTRY(__cosf) fstp %st(1) fcos ret +3: +#ifdef PIC + pushl %ebx + cfi_adjust_cfa_offset (4) + cfi_rel_offset (ebx, 0) + LOAD_PIC_REG (bx) + call __errno_location@PLT + movl $EDOM, (%eax) + popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) +#else + call __errno_location@PLT + movl $EDOM, (%eax) +#endif + jmp 4b END (__cosf) weak_alias (__cosf, cosf) diff --git a/sysdeps/i386/fpu/s_cosl.S b/sysdeps/i386/fpu/s_cosl.S index 61c9010..27dd74f 100644 --- a/sysdeps/i386/fpu/s_cosl.S +++ b/sysdeps/i386/fpu/s_cosl.S @@ -3,15 +3,22 @@ * Public domain. * * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> -RCSID("$NetBSD: $") - ENTRY(__cosl) fldt 4(%esp) - fcos + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fcos fnstsw %ax testl $0x400,%eax jnz 1f @@ -27,5 +34,21 @@ ENTRY(__cosl) fstp %st(1) fcos ret +3: +#ifdef PIC + pushl %ebx + cfi_adjust_cfa_offset (4) + cfi_rel_offset (ebx, 0) + LOAD_PIC_REG (bx) + call __errno_location@PLT + movl $EDOM, (%eax) + popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) +#else + call __errno_location@PLT + movl $EDOM, (%eax) +#endif + jmp 4b END (__cosl) weak_alias (__cosl, cosl) diff --git a/sysdeps/i386/fpu/s_sin.S b/sysdeps/i386/fpu/s_sin.S index eb22d7e9..6b91399 100644 --- a/sysdeps/i386/fpu/s_sin.S +++ b/sysdeps/i386/fpu/s_sin.S @@ -1,15 +1,24 @@ /* * Written by J.T. Conklin <jtc@netbsd.org>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. * Public domain. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> RCSID("$NetBSD: s_sin.S,v 1.5 1995/05/09 00:25:54 jtc Exp $") ENTRY(__sin) fldl 4(%esp) - fsin + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fsin fnstsw %ax testl $0x400,%eax jnz 1f @@ -25,5 +34,21 @@ ENTRY(__sin) fstp %st(1) fsin ret +3: +#ifdef PIC + pushl %ebx + cfi_adjust_cfa_offset (4) + cfi_rel_offset (ebx, 0) + LOAD_PIC_REG (bx) + call __errno_location@PLT + movl $EDOM, (%eax) + popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) +#else + call __errno_location@PLT + movl $EDOM, (%eax) +#endif + jmp 4b END (__sin) weak_alias (__sin, sin) diff --git a/sysdeps/i386/fpu/s_sinf.S b/sysdeps/i386/fpu/s_sinf.S index 5ca45f5..67621f7 100644 --- a/sysdeps/i386/fpu/s_sinf.S +++ b/sysdeps/i386/fpu/s_sinf.S @@ -1,15 +1,24 @@ /* * Written by J.T. Conklin <jtc@netbsd.org>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. * Public domain. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> RCSID("$NetBSD: s_sinf.S,v 1.3 1995/05/09 00:27:53 jtc Exp $") ENTRY(__sinf) flds 4(%esp) - fsin + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fsin fnstsw %ax testl $0x400,%eax jnz 1f @@ -25,5 +34,21 @@ ENTRY(__sinf) fstp %st(1) fsin ret +3: +#ifdef PIC + pushl %ebx + cfi_adjust_cfa_offset (4) + cfi_rel_offset (ebx, 0) + LOAD_PIC_REG (bx) + call __errno_location@PLT + movl $EDOM, (%eax) + popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) +#else + call __errno_location@PLT + movl $EDOM, (%eax) +#endif + jmp 4b END (__sinf) weak_alias (__sinf, sinf) diff --git a/sysdeps/i386/fpu/s_sinl.S b/sysdeps/i386/fpu/s_sinl.S index 3e215de..68c4f99 100644 --- a/sysdeps/i386/fpu/s_sinl.S +++ b/sysdeps/i386/fpu/s_sinl.S @@ -3,15 +3,22 @@ * Public domain. * * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> -RCSID("$NetBSD: $") - ENTRY(__sinl) fldt 4(%esp) - fsin + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fsin fnstsw %ax testl $0x400,%eax jnz 1f @@ -27,5 +34,21 @@ ENTRY(__sinl) fstp %st(1) fsin ret +3: +#ifdef PIC + pushl %ebx + cfi_adjust_cfa_offset (4) + cfi_rel_offset (ebx, 0) + LOAD_PIC_REG (bx) + call __errno_location@PLT + movl $EDOM, (%eax) + popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) +#else + call __errno_location@PLT + movl $EDOM, (%eax) +#endif + jmp 4b END (__sinl) weak_alias (__sinl, sinl) diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c index 86e1a6d..b40776f 100644 --- a/sysdeps/ieee754/dbl-64/s_sin.c +++ b/sysdeps/ieee754/dbl-64/s_sin.c @@ -1,7 +1,7 @@ /* * IBM Accurate Mathematical Library * written by International Business Machines Corp. - * Copyright (C) 2001 Free Software Foundation + * Copyright (C) 2001, 2009 Free Software Foundation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -48,6 +48,7 @@ /****************************************************************************/ +#include <errno.h> #include "endian.h" #include "mydefs.h" #include "usncs.h" @@ -329,7 +330,11 @@ double __sin(double x){ } /* else if (k < 0x7ff00000 ) */ /*--------------------- |x| > 2^1024 ----------------------------------*/ - else return x / x; + else { + if (k == 0x7ff00000 && u.i[LOW_HALF] == 0) + __set_errno (EDOM); + return x / x; + } return 0; /* unreachable */ } @@ -572,7 +577,11 @@ double __cos(double x) - else return x / x; /* |x| > 2^1024 */ + else { + if (k == 0x7ff00000 && u.i[LOW_HALF] == 0) + __set_errno (EDOM); + return x / x; /* |x| > 2^1024 */ + } return 0; } diff --git a/sysdeps/ieee754/flt-32/s_cosf.c b/sysdeps/ieee754/flt-32/s_cosf.c index 86c59d4..4f9f239 100644 --- a/sysdeps/ieee754/flt-32/s_cosf.c +++ b/sysdeps/ieee754/flt-32/s_cosf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -17,6 +17,7 @@ static char rcsid[] = "$NetBSD: s_cosf.c,v 1.4 1995/05/10 20:47:03 jtc Exp $"; #endif +#include <errno.h> #include "math.h" #include "math_private.h" @@ -43,7 +44,11 @@ static float one=1.0; if(ix <= 0x3f490fd8) return __kernel_cosf(x,z); /* cos(Inf or NaN) is NaN */ - else if (ix>=0x7f800000) return x-x; + else if (ix>=0x7f800000) { + if (ix == 0x7f800000) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { diff --git a/sysdeps/ieee754/flt-32/s_sinf.c b/sysdeps/ieee754/flt-32/s_sinf.c index 76a7c21..673e379 100644 --- a/sysdeps/ieee754/flt-32/s_sinf.c +++ b/sysdeps/ieee754/flt-32/s_sinf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -17,6 +17,7 @@ static char rcsid[] = "$NetBSD: s_sinf.c,v 1.4 1995/05/10 20:48:16 jtc Exp $"; #endif +#include <errno.h> #include "math.h" #include "math_private.h" @@ -37,7 +38,11 @@ static char rcsid[] = "$NetBSD: s_sinf.c,v 1.4 1995/05/10 20:48:16 jtc Exp $"; if(ix <= 0x3f490fd8) return __kernel_sinf(x,z,0); /* sin(Inf or NaN) is NaN */ - else if (ix>=0x7f800000) return x-x; + else if (ix>=0x7f800000) { + if (ix == 0x7f800000) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { diff --git a/sysdeps/ieee754/ldbl-96/s_cosl.c b/sysdeps/ieee754/ldbl-96/s_cosl.c index 9765f7f..e33abc9 100644 --- a/sysdeps/ieee754/ldbl-96/s_cosl.c +++ b/sysdeps/ieee754/ldbl-96/s_cosl.c @@ -49,6 +49,7 @@ static char rcsid[] = "$NetBSD: $"; * TRIG(x) returns trig(x) nearly rounded */ +#include <errno.h> #include "math.h" #include "math_private.h" @@ -71,7 +72,11 @@ static char rcsid[] = "$NetBSD: $"; return __kernel_cosl(x,z); /* cos(Inf or NaN) is NaN */ - else if (se==0x7fff) return x-x; + else if (se==0x7fff) { + if ((i0 | i1) == 0) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { diff --git a/sysdeps/ieee754/ldbl-96/s_sinl.c b/sysdeps/ieee754/ldbl-96/s_sinl.c index 4fd4880..b939bd6 100644 --- a/sysdeps/ieee754/ldbl-96/s_sinl.c +++ b/sysdeps/ieee754/ldbl-96/s_sinl.c @@ -49,6 +49,7 @@ static char rcsid[] = "$NetBSD: $"; * TRIG(x) returns trig(x) nearly rounded */ +#include <errno.h> #include "math.h" #include "math_private.h" @@ -71,7 +72,11 @@ static char rcsid[] = "$NetBSD: $"; return __kernel_sinl(x,z,0); /* sin(Inf or NaN) is NaN */ - else if (se==0x7fff) return x-x; + else if (se==0x7fff) { + if ((i0 | i1) == 0) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { diff --git a/sysdeps/x86_64/fpu/s_cosl.S b/sysdeps/x86_64/fpu/s_cosl.S index 6636fb5..6921cda 100644 --- a/sysdeps/x86_64/fpu/s_cosl.S +++ b/sysdeps/x86_64/fpu/s_cosl.S @@ -4,15 +4,22 @@ * * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>. * Adapted for x86-64 by Andreas Jaeger <aj@suse.de>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> -RCSID("$NetBSD: $") - ENTRY(__cosl) fldt 8(%rsp) - fcos + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fcos fnstsw %ax testl $0x400,%eax jnz 1f @@ -28,5 +35,8 @@ ENTRY(__cosl) fstp %st(1) fcos ret +3: call __errno_location@PLT + movl $EDOM, (%rax) + jmp 4b END (__cosl) weak_alias (__cosl, cosl) diff --git a/sysdeps/x86_64/fpu/s_sinl.S b/sysdeps/x86_64/fpu/s_sinl.S index 181f112..79fc4af 100644 --- a/sysdeps/x86_64/fpu/s_sinl.S +++ b/sysdeps/x86_64/fpu/s_sinl.S @@ -4,13 +4,22 @@ * * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>. * Adapted for x86-64 by Andreas Jaeger <aj@suse.de>. + * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>. */ +#define __need_Emath +#include <bits/errno.h> #include <machine/asm.h> ENTRY(__sinl) fldt 8(%rsp) - fsin + fxam + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 3f +4: fsin fnstsw %ax testl $0x400,%eax jnz 1f @@ -26,5 +35,8 @@ ENTRY(__sinl) fstp %st(1) fsin ret +3: call __errno_location@PLT + movl $EDOM, (%rax) + jmp 4b END (__sinl) weak_alias (__sinl, sinl) |