* sysdeps/i386/fpu/s_cos.S: Set errno for ±Inf.
authorUlrich Drepper <drepper@redhat.com>
Sun, 26 Apr 2009 01:04:54 +0000 (01:04 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 26 Apr 2009 01:04:54 +0000 (01:04 +0000)
* 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.

16 files changed:
ChangeLog
math/libm-test.inc
stdio-common/stdio_lim.h.in
sysdeps/i386/fpu/s_cos.S
sysdeps/i386/fpu/s_cosf.S
sysdeps/i386/fpu/s_cosl.S
sysdeps/i386/fpu/s_sin.S
sysdeps/i386/fpu/s_sinf.S
sysdeps/i386/fpu/s_sinl.S
sysdeps/ieee754/dbl-64/s_sin.c
sysdeps/ieee754/flt-32/s_cosf.c
sysdeps/ieee754/flt-32/s_sinf.c
sysdeps/ieee754/ldbl-96/s_cosl.c
sysdeps/ieee754/ldbl-96/s_sinl.c
sysdeps/x86_64/fpu/s_cosl.S
sysdeps/x86_64/fpu/s_sinl.S

index af38b11..2355ff3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 68f2f05..5f4dbe7 100644 (file)
@@ -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);
index 806326d..a827255 100644 (file)
@@ -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
index ac8b145..d341d00 100644 (file)
@@ -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)
index 21f87aa..578967a 100644 (file)
@@ -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)
index 61c9010..27dd74f 100644 (file)
@@ -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)
index eb22d7e..6b91399 100644 (file)
@@ -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)
index 5ca45f5..67621f7 100644 (file)
@@ -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)
index 3e215de..68c4f99 100644 (file)
@@ -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)
index 86e1a6d..b40776f 100644 (file)
@@ -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;
 
 }
index 86c59d4..4f9f239 100644 (file)
@@ -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 {
index 76a7c21..673e379 100644 (file)
@@ -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 {
index 9765f7f..e33abc9 100644 (file)
@@ -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 {
index 4fd4880..b939bd6 100644 (file)
@@ -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 {
index 6636fb5..6921cda 100644 (file)
@@ -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)
index 181f112..79fc4af 100644 (file)
@@ -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)