Author: kargl
Date: Wed Sep 17 19:01:22 2014
New Revision: 271719
URL: http://svnweb.freebsd.org/changeset/base/271719

Log:
  For targets that have a signed zero, lgamma_r(-0, &signgamp) should
  set signgamp = -1.
  
  Submitted by: enh at google dot com (e_lgamma[f]_r.c)

Modified:
  head/lib/msun/ld128/e_lgammal_r.c
  head/lib/msun/ld80/e_lgammal_r.c
  head/lib/msun/src/e_lgamma_r.c
  head/lib/msun/src/e_lgammaf_r.c

Modified: head/lib/msun/ld128/e_lgammal_r.c
==============================================================================
--- head/lib/msun/ld128/e_lgammal_r.c   Wed Sep 17 18:59:25 2014        
(r271718)
+++ head/lib/msun/ld128/e_lgammal_r.c   Wed Sep 17 19:01:22 2014        
(r271719)
@@ -241,7 +241,11 @@ lgammal_r(long double x, int *signgamp)
        *signgamp = 1;
        if((hx & 0x7fff) == 0x7fff)     /* x is +-Inf or NaN */
                return x*x;
-       if((hx==0||hx==0x8000)&&lx==0) return one/vzero;
+       if((hx==0||hx==0x8000)&&lx==0) {
+           if (hx&0x8000)
+               *signgamp = -1;
+           return one/vzero;
+       }
 
    /* purge off tiny and negative arguments */
        if(fabsl(x)<0x1p-119L) {

Modified: head/lib/msun/ld80/e_lgammal_r.c
==============================================================================
--- head/lib/msun/ld80/e_lgammal_r.c    Wed Sep 17 18:59:25 2014        
(r271718)
+++ head/lib/msun/ld80/e_lgammal_r.c    Wed Sep 17 19:01:22 2014        
(r271719)
@@ -261,7 +261,11 @@ lgammal_r(long double x, int *signgamp)
        *signgamp = 1;
        if((hx & 0x7fff) == 0x7fff)     /* x is +-Inf or NaN */
                return x*x;
-       if((hx==0||hx==0x8000)&&lx==0) return one/vzero;
+       if((hx==0||hx==0x8000)&&lx==0) {
+           if (hx&0x8000)
+               *signgamp = -1;
+           return one/vzero;
+       }
 
        ENTERI();
 

Modified: head/lib/msun/src/e_lgamma_r.c
==============================================================================
--- head/lib/msun/src/e_lgamma_r.c      Wed Sep 17 18:59:25 2014        
(r271718)
+++ head/lib/msun/src/e_lgamma_r.c      Wed Sep 17 19:01:22 2014        
(r271719)
@@ -214,7 +214,11 @@ __ieee754_lgamma_r(double x, int *signga
        *signgamp = 1;
        ix = hx&0x7fffffff;
        if(ix>=0x7ff00000) return x*x;
-       if((ix|lx)==0) return one/vzero;
+       if((ix|lx)==0) {
+          if(hx<0)
+               *signgamp = -1;
+           return one/vzero;
+       }
        if(ix<0x3b900000) {     /* |x|<2**-70, return -log(|x|) */
            if(hx<0) {
                *signgamp = -1;

Modified: head/lib/msun/src/e_lgammaf_r.c
==============================================================================
--- head/lib/msun/src/e_lgammaf_r.c     Wed Sep 17 18:59:25 2014        
(r271718)
+++ head/lib/msun/src/e_lgammaf_r.c     Wed Sep 17 19:01:22 2014        
(r271719)
@@ -132,7 +132,11 @@ __ieee754_lgammaf_r(float x, int *signga
        *signgamp = 1;
        ix = hx&0x7fffffff;
        if(ix>=0x7f800000) return x*x;
-       if(ix==0) return one/vzero;
+       if(ix==0) {
+           if(hx<0)
+               *signgamp = -1;
+           return one/vzero;
+       }
        if(ix<0x35000000) {     /* |x|<2**-21, return -log(|x|) */
            if(hx<0) {
                *signgamp = -1;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to