Fix csin, csinh, ccos, ccosh missing underflows (bug 15405).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 26 Apr 2013 19:25:19 +0000 (19:25 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 26 Apr 2013 19:25:19 +0000 (19:25 +0000)
12 files changed:
ChangeLog
NEWS
math/libm-test.inc
math/s_ccosh.c
math/s_ccoshf.c
math/s_ccoshl.c
math/s_csin.c
math/s_csinf.c
math/s_csinh.c
math/s_csinhf.c
math/s_csinhl.c
math/s_csinl.c

index 2900e14..1996e6c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2013-04-26  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #15405]
+       * math/s_ccosh.c (__ccosh): Ensure underflow exception occurs for
+       underflowed result.
+       * math/s_ccoshf.c (__ccoshf): Likewise.
+       * math/s_ccoshl.c (__ccoshl): Likewise.
+       * math/s_csin.c (__csin): Likewise.
+       * math/s_csinf.c (__csinf): Likewise.
+       * math/s_csinh.c (__csinh): Likewise.
+       * math/s_csinhf.c (__csinhf): Likewise.
+       * math/s_csinhl.c (__csinhl): Likewise.
+       * math/s_csinl.c (__csinl): Likewise.
+       * math/libm-test.inc (ccos_test): Add more tests.
+       (ccosh_test): Likewise.
+       (csin_test): Likewise.
+       (csinh_test): Likewise.
+
 2013-04-26  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
 
        * sysdeps/powerpc/power5/fpu/s_modf.c: Moved to ...
diff --git a/NEWS b/NEWS
index c5b57a8..f986862 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,7 @@ Version 2.18
   14812, 14888, 14920, 14964, 14981, 14982, 14985, 14994, 14996, 15003,
   15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078, 15160, 15214,
   15232, 15234, 15283, 15285, 15287, 15304, 15305, 15307, 15309, 15327,
-  15330, 15335, 15336, 15337, 15342, 15346, 15361, 15366, 15394.
+  15330, 15335, 15336, 15337, 15342, 15346, 15361, 15366, 15394, 15405.
 
 * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
   #15078).
index eb9fa71..a3d7731 100644 (file)
@@ -4570,6 +4570,9 @@ ccos_test (void)
   TEST_c_c (ccos, 0x1p-16434L, 22730, plus_infty, -1.217853148905605987081057582351152052687e4924L, OVERFLOW_EXCEPTION);
 #endif
 
+  TEST_c_c (ccos, min_subnorm_value * 0x1p120, 0x1p-120, 1.0, -min_subnorm_value, UNDERFLOW_EXCEPTION);
+  TEST_c_c (ccos, 0x1p-120, min_subnorm_value * 0x1p120, 1.0, -min_subnorm_value, UNDERFLOW_EXCEPTION);
+
   END (ccos, complex);
 }
 
@@ -4670,6 +4673,9 @@ ccosh_test (void)
   TEST_c_c (ccosh, 22730, 0x1p-16434L, plus_infty, 1.217853148905605987081057582351152052687e4924L, OVERFLOW_EXCEPTION);
 #endif
 
+  TEST_c_c (ccosh, min_subnorm_value * 0x1p120, 0x1p-120, 1.0, min_subnorm_value, UNDERFLOW_EXCEPTION);
+  TEST_c_c (ccosh, 0x1p-120, min_subnorm_value * 0x1p120, 1.0, min_subnorm_value, UNDERFLOW_EXCEPTION);
+
   END (ccosh, complex);
 }
 
@@ -5898,6 +5904,9 @@ csin_test (void)
   TEST_c_c (csin, 0x1p-16434L, 22730, 1.217853148905605987081057582351152052687e4924L, plus_infty, OVERFLOW_EXCEPTION);
 #endif
 
+  TEST_c_c (csin, min_subnorm_value, min_value, min_subnorm_value, min_value, UNDERFLOW_EXCEPTION);
+  TEST_c_c (csin, min_value, min_subnorm_value, min_value, min_subnorm_value, UNDERFLOW_EXCEPTION);
+
   END (csin, complex);
 }
 
@@ -5997,6 +6006,9 @@ csinh_test (void)
   TEST_c_c (csinh, 22730, 0x1p-16434L, plus_infty, 1.217853148905605987081057582351152052687e4924L, OVERFLOW_EXCEPTION);
 #endif
 
+  TEST_c_c (csinh, min_subnorm_value, min_value, min_subnorm_value, min_value, UNDERFLOW_EXCEPTION);
+  TEST_c_c (csinh, min_value, min_subnorm_value, min_value, min_subnorm_value, UNDERFLOW_EXCEPTION);
+
   END (csinh, complex);
 }
 
index 2c05b63..05b146e 100644 (file)
@@ -82,6 +82,19 @@ __ccosh (__complex__ double x)
              __real__ retval = __ieee754_cosh (__real__ x) * cosix;
              __imag__ retval = __ieee754_sinh (__real__ x) * sinix;
            }
+
+         if (fabs (__real__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabs (__imag__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index de7e7d3..62bf83c 100644 (file)
@@ -82,6 +82,19 @@ __ccoshf (__complex__ float x)
              __real__ retval = __ieee754_coshf (__real__ x) * cosix;
              __imag__ retval = __ieee754_sinhf (__real__ x) * sinix;
            }
+
+         if (fabsf (__real__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsf (__imag__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 4bbd311..18d3df0 100644 (file)
@@ -82,6 +82,19 @@ __ccoshl (__complex__ long double x)
              __real__ retval = __ieee754_coshl (__real__ x) * cosix;
              __imag__ retval = __ieee754_sinhl (__real__ x) * sinix;
            }
+
+         if (fabsl (__real__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsl (__imag__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index cc1c9cd..6d28e4c 100644 (file)
@@ -88,6 +88,19 @@ __csin (__complex__ double x)
 
          if (negate)
            __real__ retval = -__real__ retval;
+
+         if (fabs (__real__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabs (__imag__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 92b858a..a3dcf9d 100644 (file)
@@ -88,6 +88,19 @@ __csinf (__complex__ float x)
 
          if (negate)
            __real__ retval = -__real__ retval;
+
+         if (fabsf (__real__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsf (__imag__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index be3c6bb..5a98f67 100644 (file)
@@ -88,6 +88,19 @@ __csinh (__complex__ double x)
 
          if (negate)
            __real__ retval = -__real__ retval;
+
+         if (fabs (__real__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabs (__imag__ retval) < DBL_MIN)
+           {
+             volatile double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 6c58c1d..3658805 100644 (file)
@@ -88,6 +88,19 @@ __csinhf (__complex__ float x)
 
          if (negate)
            __real__ retval = -__real__ retval;
+
+         if (fabsf (__real__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsf (__imag__ retval) < FLT_MIN)
+           {
+             volatile float force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 8acf6de..54a13fd 100644 (file)
@@ -88,6 +88,19 @@ __csinhl (__complex__ long double x)
 
          if (negate)
            __real__ retval = -__real__ retval;
+
+         if (fabsl (__real__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsl (__imag__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {
index 6b3c1ea..4d6ce3d 100644 (file)
@@ -88,6 +88,19 @@ __csinl (__complex__ long double x)
 
          if (negate)
            __real__ retval = -__real__ retval;
+
+         if (fabsl (__real__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __real__ retval * __real__ retval;
+             (void) force_underflow;
+           }
+         if (fabsl (__imag__ retval) < LDBL_MIN)
+           {
+             volatile long double force_underflow
+               = __imag__ retval * __imag__ retval;
+             (void) force_underflow;
+           }
        }
       else
        {