[PATCHv4] ldbl-128: Use L(x) macro for long double constants

Message ID 997588c1-5bcf-6339-4c7f-1339d91e45cf@linux.vnet.ibm.com
State Superseded
Delegated to: Joseph Myers
Headers

Commit Message

Paul E. Murphy Sept. 2, 2016, 4:23 p.m. UTC
  Sorry for the delay, I had some pressing issues to
deal with the last day or so.

My hope is that this will apply correctly for patch
users (Previous patches assumed 'git am -c' to
properly strip the commentary), and my email
client doesn't foobar a big patch.

The conversion script is attached as well as the small
patch to revert some minor blips which aren't easily
worked around within the script.

---8<---
This runs the attached sed script against these files using
a regex which aggressively matches long double literals
when not obviously part of a comment.

Likewise, 5 digit or less integral constants are replaced
with integral constants.

Likewise, -L(x) is transformed into L(-x).

Naturally, the script has a few minor hiccups which are
more clearly remedied via the attached fixup patch.  Such
hiccups include, context-sensitive promotion to a real
type, and munging constants inside a multi-line comment.

A followup patch applies subjective cleanup to tables which
have been malformatted by the above.

	* sysdeps/ieee754/ldbl-128/e_acoshl.c: Wrap long double literals
	with L() and remove explicit suffix, convert real literals
	which can be equivalentally substituted with integers, and
	transform -L(x) to L(-x).

	* sysdeps/ieee754/ldbl-128/e_acosl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_asinl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_atan2l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_atanhl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_coshl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_exp10l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_expl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_gammal_r.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_hypotl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_j0l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_j1l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_jnl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_lgammal_r.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_log10l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_log2l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_logl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_powl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_rem_pio2l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_remainderl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/e_sinhl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/k_cosl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/k_sincosl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/k_sinl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/k_tanl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/lgamma_negl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_asinhl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_atanl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_cbrtl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_cosl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_erfl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_expm1l.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_fmal.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_frexpl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_llrintl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_llroundl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_log1pl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_lrintl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_lroundl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_nearbyintl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_nextafterl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_remquol.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_scalblnl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_scalbnl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_sincosl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_sinl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_tanhl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/s_tanl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/t_expl.h: Likewise.
	* sysdeps/ieee754/ldbl-128/t_sincosl.c: Likewise.
	* sysdeps/ieee754/ldbl-128/x2y2m1l.c: Likewise.
---
 sysdeps/ieee754/ldbl-128/e_acoshl.c     |    8 +-
 sysdeps/ieee754/ldbl-128/e_acosl.c      |  140 +--
 sysdeps/ieee754/ldbl-128/e_asinl.c      |   92 +-
 sysdeps/ieee754/ldbl-128/e_atan2l.c     |   20 +-
 sysdeps/ieee754/ldbl-128/e_atanhl.c     |    4 +-
 sysdeps/ieee754/ldbl-128/e_coshl.c      |    4 +-
 sysdeps/ieee754/ldbl-128/e_exp10l.c     |    8 +-
 sysdeps/ieee754/ldbl-128/e_expl.c       |   38 +-
 sysdeps/ieee754/ldbl-128/e_gammal_r.c   |   64 +-
 sysdeps/ieee754/ldbl-128/e_hypotl.c     |    2 +-
 sysdeps/ieee754/ldbl-128/e_j0l.c        |  764 ++++++-------
 sysdeps/ieee754/ldbl-128/e_j1l.c        |  762 ++++++-------
 sysdeps/ieee754/ldbl-128/e_jnl.c        |   26 +-
 sysdeps/ieee754/ldbl-128/e_lgammal_r.c  |  834 +++++++-------
 sysdeps/ieee754/ldbl-128/e_log10l.c     |  104 +-
 sysdeps/ieee754/ldbl-128/e_log2l.c      |   98 +-
 sysdeps/ieee754/ldbl-128/e_logl.c       |  228 ++--
 sysdeps/ieee754/ldbl-128/e_powl.c       |   76 +-
 sysdeps/ieee754/ldbl-128/e_rem_pio2l.c  |    4 +-
 sysdeps/ieee754/ldbl-128/e_remainderl.c |    4 +-
 sysdeps/ieee754/ldbl-128/e_sinhl.c      |    4 +-
 sysdeps/ieee754/ldbl-128/k_cosl.c       |   38 +-
 sysdeps/ieee754/ldbl-128/k_sincosl.c    |   54 +-
 sysdeps/ieee754/ldbl-128/k_sinl.c       |   38 +-
 sysdeps/ieee754/ldbl-128/k_tanl.c       |   28 +-
 sysdeps/ieee754/ldbl-128/lgamma_negl.c  |  684 ++++++------
 sysdeps/ieee754/ldbl-128/s_asinhl.c     |    6 +-
 sysdeps/ieee754/ldbl-128/s_atanl.c      |  192 ++--
 sysdeps/ieee754/ldbl-128/s_cbrtl.c      |   24 +-
 sysdeps/ieee754/ldbl-128/s_cosl.c       |    2 +-
 sysdeps/ieee754/ldbl-128/s_erfl.c       |  738 ++++++------
 sysdeps/ieee754/ldbl-128/s_expm1l.c     |   46 +-
 sysdeps/ieee754/ldbl-128/s_fmal.c       |   28 +-
 sysdeps/ieee754/ldbl-128/s_frexpl.c     |    2 +-
 sysdeps/ieee754/ldbl-128/s_llrintl.c    |    6 +-
 sysdeps/ieee754/ldbl-128/s_llroundl.c   |    4 +-
 sysdeps/ieee754/ldbl-128/s_log1pl.c     |  108 +-
 sysdeps/ieee754/ldbl-128/s_lrintl.c     |    6 +-
 sysdeps/ieee754/ldbl-128/s_lroundl.c    |    4 +-
 sysdeps/ieee754/ldbl-128/s_nearbyintl.c |    4 +-
 sysdeps/ieee754/ldbl-128/s_remquol.c    |    6 +-
 sysdeps/ieee754/ldbl-128/s_scalblnl.c   |    8 +-
 sysdeps/ieee754/ldbl-128/s_scalbnl.c    |    8 +-
 sysdeps/ieee754/ldbl-128/s_sincosl.c    |    2 +-
 sysdeps/ieee754/ldbl-128/s_sinl.c       |    2 +-
 sysdeps/ieee754/ldbl-128/s_tanhl.c      |    2 +-
 sysdeps/ieee754/ldbl-128/s_tanl.c       |    2 +-
 sysdeps/ieee754/ldbl-128/t_expl.h       | 1860 +++++++++++++++----------------
 sysdeps/ieee754/ldbl-128/t_sincosl.c    |  664 +++++------
 sysdeps/ieee754/ldbl-128/x2y2m1l.c      |    2 +-
 50 files changed, 3926 insertions(+), 3926 deletions(-)
  

Comments

Joseph Myers Sept. 8, 2016, 10:56 p.m. UTC | #1
On Fri, 2 Sep 2016, Paul E. Murphy wrote:

> @@ -65,7 +65,7 @@ __ieee754_atan2l(_Float128 y, _Float128 x)
>  	if(((ix|((lx|-lx)>>63))>0x7fff000000000000LL)||
>  	   ((iy|((ly|-ly)>>63))>0x7fff000000000000LL))	/* x or y is NaN */
>  	   return x+y;
> -	if(((hx-0x3fff000000000000LL)|lx)==0) return __atanl(y);   /* x=1.0L */
> +	if(((hx-0x3fff000000000000LL)|lx)==0) return __atanl(y);   /* x=1 */

Is this change of a comment deliberate?  I thought you were avoiding 
changing comments.

> + L(0.0000000000000000000000000000000000000000E0),

Is it deliberate that this (in e_logl.c) is not becoming integer 0 (it may 
well make sense to avoid converting to integers in such generated tables, 
but you didn't call it out in the patch description as a deliberate 
fixup)?  Likewise in s_atanl.c.
  
Paul E. Murphy Sept. 9, 2016, 12:46 a.m. UTC | #2
On 09/08/2016 05:56 PM, Joseph Myers wrote:
> On Fri, 2 Sep 2016, Paul E. Murphy wrote:
> 
>> @@ -65,7 +65,7 @@ __ieee754_atan2l(_Float128 y, _Float128 x)
>>  	if(((ix|((lx|-lx)>>63))>0x7fff000000000000LL)||
>>  	   ((iy|((ly|-ly)>>63))>0x7fff000000000000LL))	/* x or y is NaN */
>>  	   return x+y;
>> -	if(((hx-0x3fff000000000000LL)|lx)==0) return __atanl(y);   /* x=1.0L */
>> +	if(((hx-0x3fff000000000000LL)|lx)==0) return __atanl(y);   /* x=1 */
> 
> Is this change of a comment deliberate?  I thought you were avoiding 
> changing comments.

This is a limitation of the conversion script.  It only skips lines
which start with a /* comment.  This can be reverted via the fixup,
patch or I can note the limitation in the commit message.

> 
>> + L(0.0000000000000000000000000000000000000000E0),
> 
> Is it deliberate that this (in e_logl.c) is not becoming integer 0 (it may 
> well make sense to avoid converting to integers in such generated tables, 
> but you didn't call it out in the patch description as a deliberate 
> fixup)?  Likewise in s_atanl.c.

The transformation is not applied to integral values written with an
exponent-part 'E'.  A trivial change to the transformation could
catch those two cases, but it looks a little neater without. I can
note this behavior in the commit message too.
  
Joseph Myers Sept. 9, 2016, 2:14 p.m. UTC | #3
On Thu, 8 Sep 2016, Paul E. Murphy wrote:

> On 09/08/2016 05:56 PM, Joseph Myers wrote:
> > On Fri, 2 Sep 2016, Paul E. Murphy wrote:
> > 
> >> @@ -65,7 +65,7 @@ __ieee754_atan2l(_Float128 y, _Float128 x)
> >>  	if(((ix|((lx|-lx)>>63))>0x7fff000000000000LL)||
> >>  	   ((iy|((ly|-ly)>>63))>0x7fff000000000000LL))	/* x or y is NaN */
> >>  	   return x+y;
> >> -	if(((hx-0x3fff000000000000LL)|lx)==0) return __atanl(y);   /* x=1.0L */
> >> +	if(((hx-0x3fff000000000000LL)|lx)==0) return __atanl(y);   /* x=1 */
> > 
> > Is this change of a comment deliberate?  I thought you were avoiding 
> > changing comments.
> 
> This is a limitation of the conversion script.  It only skips lines
> which start with a /* comment.  This can be reverted via the fixup,
> patch or I can note the limitation in the commit message.

The patch is OK with the comment change reverted.
  

Patch

diff --git a/sysdeps/ieee754/ldbl-128/e_exp10l.c b/sysdeps/ieee754/ldbl-128/e_exp10l.c
index 9a2c8b8..9432b18 100644
--- a/sysdeps/ieee754/ldbl-128/e_exp10l.c
+++ b/sysdeps/ieee754/ldbl-128/e_exp10l.c
@@ -39,7 +39,7 @@  __ieee754_exp10l (_Float128 arg)
     return 1;
 
   u.value = arg;
-  u.parts64sw &= 0xfe00000000000000LL;
+  u.parts64.lsw &= 0xfe00000000000000LL;
   arg_high = u.value;
   arg_low = arg - arg_high;
   exp_high = arg_high * log10_high;
diff --git a/sysdeps/ieee754/ldbl-128/e_jnl.c b/sysdeps/ieee754/ldbl-128/e_jnl.c
index 1f80b00..470631e 100644
--- a/sysdeps/ieee754/ldbl-128/e_jnl.c
+++ b/sysdeps/ieee754/ldbl-128/e_jnl.c
@@ -328,7 +328,7 @@  __ieee754_ynl (int n, _Float128 x)
   if (x <= 0)
     {
       if (x == 0)
-	return ((n < 0 && (n & 1) != 0) ? 1 : -1) / 0;
+	return ((n < 0 && (n & 1) != 0) ? 1 : -1) / L(0.0);
       if (se & 0x80000000)
	return zero / (zero * x);
     }
diff --git a/sysdeps/ieee754/ldbl-128/lgamma_negl.c b/sysdeps/ieee754/ldbl-128/lgamma_negl.c
index 83542d3..e33eaff 100644
--- a/sysdeps/ieee754/ldbl-128/lgamma_negl.c
+++ b/sysdeps/ieee754/ldbl-128/lgamma_negl.c
@@ -450,7 +450,7 @@  __lgamma_negl (_Float128 x, int *signgamp)
      integers and determine the sign of the result.  */
   int i = __floorl (-2 * x);
   if ((i & 1) == 0 && i == -2 * x)
-    return 1 / 0;
+    return L(1.0) / L(0.0);
   _Float128 xn = ((i & 1) == 0 ? -i / 2 : (-i - 1) / 2);
   i -= 4;
   *signgamp = ((i & 2) == 0 ? -1 : 1);
diff --git a/sysdeps/ieee754/ldbl-128/s_fmal.c b/sysdeps/ieee754/ldbl-128/s_fmal.c
index c7f90d9..efafa8b 100644
--- a/sysdeps/ieee754/ldbl-128/s_fmal.c
+++ b/sysdeps/ieee754/ldbl-128/s_fmal.c
@@ -261,10 +261,10 @@  __fmal (_Float128 x, _Float128 y, _Float128 z)
       if (v.ieee.exponent > 228)
	return (a1 + u.d) * L(0x1p-228);
       /* If v.d * 0x1p-228L with round to zero is a subnormal above
-	 or equal to LDBL_MIN / 2, then v.d * L(0x1p-228) shifts mantissa
+	 or equal to LDBL_MIN / 2, then v.d * 0x1p-228L shifts mantissa
	 down just by 1 bit, which means v.ieee.mantissa3 |= j would
	 change the round bit, not sticky or guard bit.
-	 v.d * L(0x1p-228) never normalizes by shifting up,
+	 v.d * 0x1p-228L never normalizes by shifting up,
	 so round bit plus sticky bit should be already enough
	 for proper rounding.  */
       if (v.ieee.exponent == 228)