This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Clean up some complex functions raising FE_INVALID [committed]


Some of the complex arithmetic functions have the following pattern:
in some piece of code, one part of the input (real or imaginary,
depending on the function) is either infinite or NaN.  Part of the
result is to be set to NaN in either case, and FE_INVALID raised only
if the relevant part of the input was infinite.

In such a case, there is no actual need for the conditional on the
type of the input, since subtracting the relevant part of the input
from itself will produce a NaN, with FE_INVALID only if the relevant
part of the input was infinite.  This simplifies the code, and as a
quality-of-implementation matter also improves things by propagating
NaN payloads.  (Right now these functions always raise FE_INVALID for
signaling NaN arguments because of the call to fpclassify - at least
unless glibc is built with -Os - but if fpclassify moves to using
integer arithmetic in future, doing arithmetic on the NaN argument
also ensures an exception for sNaNs.)

Tested for x86_64 and x86.  Committed.

2016-10-13  Joseph Myers  <joseph@codesourcery.com>

	* math/s_ccosh_template.c (M_DECL_FUNC (__ccosh)): Instead of
	raising FE_INVALID with feraisexcept in case where part of
	argument is infinite, subtract that part of argument from itself.
	* math/s_cexp_template.c (M_DECL_FUNC (__cexp)): Likewise.
	* math/s_csin_template.c (M_DECL_FUNC (__csin)): Likewise.
	* math/s_csinh_template.c (M_DECL_FUNC (__csinh)): Likewise.

diff --git a/math/s_ccosh_template.c b/math/s_ccosh_template.c
index 7fea5c9..5240724 100644
--- a/math/s_ccosh_template.c
+++ b/math/s_ccosh_template.c
@@ -88,10 +88,7 @@ M_DECL_FUNC (__ccosh) (CFLOAT x)
       else
 	{
 	  __imag__ retval = __real__ x == 0 ? 0 : M_NAN;
-	  __real__ retval = M_NAN;
-
-	  if (icls == FP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	  __real__ retval = __imag__ x - __imag__ x;
 	}
     }
   else if (rcls == FP_INFINITE)
@@ -125,10 +122,7 @@ M_DECL_FUNC (__ccosh) (CFLOAT x)
       else
 	{
 	  __real__ retval = M_HUGE_VAL;
-	  __imag__ retval = M_NAN;
-
-	  if (icls == FP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	  __imag__ retval = __imag__ x - __imag__ x;
 	}
     }
   else
diff --git a/math/s_cexp_template.c b/math/s_cexp_template.c
index a60afe0..dd46d96 100644
--- a/math/s_cexp_template.c
+++ b/math/s_cexp_template.c
@@ -121,10 +121,7 @@ M_DECL_FUNC (__cexp) (CFLOAT x)
       else if (signbit (__real__ x) == 0)
 	{
 	  __real__ retval = M_HUGE_VAL;
-	  __imag__ retval = M_NAN;
-
-	  if (icls == FP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	  __imag__ retval = __imag__ x - __imag__ x;
 	}
       else
 	{
diff --git a/math/s_csin_template.c b/math/s_csin_template.c
index 59d8876..2fe0b15 100644
--- a/math/s_csin_template.c
+++ b/math/s_csin_template.c
@@ -96,11 +96,8 @@ M_DECL_FUNC (__csin) (CFLOAT x)
 	  if (icls == FP_ZERO)
 	    {
 	      /* Imaginary part is 0.0.  */
-	      __real__ retval = M_NAN;
+	      __real__ retval = __real__ x - __real__ x;
 	      __imag__ retval = __imag__ x;
-
-	      if (rcls == FP_INFINITE)
-		feraiseexcept (FE_INVALID);
 	    }
 	  else
 	    {
@@ -145,12 +142,8 @@ M_DECL_FUNC (__csin) (CFLOAT x)
 	}
       else
 	{
-	  /* The addition raises the invalid exception.  */
-	  __real__ retval = M_NAN;
+	  __real__ retval = __real__ x - __real__ x;
 	  __imag__ retval = M_HUGE_VAL;
-
-	  if (rcls == FP_INFINITE)
-	    feraiseexcept (FE_INVALID);
 	}
     }
   else
diff --git a/math/s_csinh_template.c b/math/s_csinh_template.c
index 45fbb36..e5fd4d5 100644
--- a/math/s_csinh_template.c
+++ b/math/s_csinh_template.c
@@ -97,10 +97,7 @@ M_DECL_FUNC (__csinh) (CFLOAT x)
 	    {
 	      /* Real part is 0.0.  */
 	      __real__ retval = M_COPYSIGN (0, negate ? -1 : 1);
-	      __imag__ retval = M_NAN;
-
-	      if (icls == FP_INFINITE)
-		feraiseexcept (FE_INVALID);
+	      __imag__ retval = __imag__ x - __imag__ x;
 	    }
 	  else
 	    {
@@ -144,10 +141,7 @@ M_DECL_FUNC (__csinh) (CFLOAT x)
       else
 	{
 	  __real__ retval = M_HUGE_VAL;
-	  __imag__ retval = M_NAN;
-
-	  if (icls == FP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	  __imag__ retval = __imag__ x - __imag__ x;
 	}
     }
   else

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]