]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* 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 af38b11d1af60f7b9ca77becfdc21b27adfa2923..2355ff383ea8c6f35244ff2437468be7e0a5e388 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 68f2f05a7086dba3b4c22254823f48d4e610ea11..5f4dbe7fa142d69010d3edd099faa3d6e94c53dc 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 806326d95389897177800b445f677012c965005b..a827255790f085d7e63e3f48b4d70bccf9ac7785 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 ac8b1459d965c64475dfaee6459a34423158aaff..d341d008c5b08a31a791a9eb34247ddef941ae5a 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 21f87aa87462daaaad6c84ea7a2a455239ab392e..578967ad3cae3106b736aadbb9129973d8f88577 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 61c9010c994c7ae0bc13f5423048d5b7761196b8..27dd74f21b1040f712de7394fc9fbed4493bc2da 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 eb22d7e98b8ab461de2b3dc8fc59e7f2b35c18f2..6b913992dc76ee49094e5502703cf08759c57d18 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 5ca45f52e2c2c00a14b34596ebcd5ba83cef0d5a..67621f70f22e20bec344f5249d2cd792f7cd92b0 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 3e215de5e19faf55d5944e820ea9afcc9672fb1c..68c4f99668a6652ae2f443b933b83570fd8f762d 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 86e1a6d12169f83f9aadc138940071c2a0aaf752..b40776f5e2f513700edbea12dc1d635e3bc2fd25 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 86c59d440ca98be4eae0c63855acd4c459cb85d4..4f9f239f6fd887c32a9d357fee29077583fe22ee 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 76a7c21fcb193fcabf00a47472aa8b03dd380101..673e379f0c622b20864b659182183c54903920fd 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 9765f7fd4ec9578a3c8dd793751f4cb621d88078..e33abc9afd9c9b81e9eddc1ec1cfd422fe580e5a 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 4fd48805b49bd344c1cb838c7f837ee8a3c6cfc6..b939bd6a999e0c309dd5787aafdcf2be4e6b9688 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 6636fb5ec6b0016197bee3910826a17dfa5ce189..6921cda567d954258f0b9fbf7d1741ebca49c6e5 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 181f112f4fe4f3e6d68349ae25e7c3728b083f6e..79fc4af95b41c47583f3ad3aaa8e519ace286bc1 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)