patches/glibc/ports-2.10.1/210-ldbl-nexttowardf.patch
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Mon Feb 25 21:19:31 2013 +0100 (2013-02-25)
changeset 3185 f89f8e6f8766
permissions -rw-r--r--
Makefile: fix parrallel (-j) installs

Currently, we would remove previously installed patches before
installing the new ones. Unfortunately, that does not play well
with heavily parallel installs.

Now, we consider it is the responsibility of the user to first
uninstall any previous version before installing a new one.

Reported-by: Markos Chandras <markos.chandras@gmail.com>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
     1 ripped from Debian
     2 
     3 this change was made to generic __nexttowardf, but not the long double version
     4 
     5 2008-05-05  Aurelien Jarno  <aurelien@aurel32.net>
     6 
     7 	* sysdeps/ieee754/ldbl-128/s_nexttowardf.c: Include float.h.
     8 	(__nexttowardf): Use math_opt_barrier and
     9 	math_force_eval macros.  If FLT_EVAL_METHOD is not 0, force
    10 	x to float using asm.
    11 
    12  sysdeps/ieee754/ldbl-128/s_nexttowardf.c |   26 ++++++++++++++++----------
    13  1 file changed, 16 insertions(+), 10 deletions(-)
    14 
    15 diff -durN glibc-2.10.1.orig/sysdeps/ieee754/ldbl-128/s_nexttowardf.c glibc-2.10.1/sysdeps/ieee754/ldbl-128/s_nexttowardf.c
    16 --- glibc-2.10.1.orig/sysdeps/ieee754/ldbl-128/s_nexttowardf.c	1999-07-14 02:09:42.000000000 +0200
    17 +++ glibc-2.10.1/sysdeps/ieee754/ldbl-128/s_nexttowardf.c	2009-11-13 00:50:06.000000000 +0100
    18 @@ -19,7 +19,8 @@
    19  #endif
    20  
    21  #include "math.h"
    22 -#include "math_private.h"
    23 +#include <math_private.h>
    24 +#include <float.h>
    25  
    26  #ifdef __STDC__
    27  	float __nexttowardf(float x, long double y)
    28 @@ -44,10 +45,12 @@
    29  	   return x+y;
    30  	if((long double) x==y) return y;	/* x=y, return y */
    31  	if(ix==0) {				/* x == 0 */
    32 -	    float x2;
    33 +	    float u;
    34  	    SET_FLOAT_WORD(x,(u_int32_t)((hy>>32)&0x80000000)|1);/* return +-minsub*/
    35 -	    x2 = x*x;
    36 -	    if(x2==x) return x2; else return x;	/* raise underflow flag */
    37 +	    u = math_opt_barrier (x);
    38 +	    u = u * u;
    39 +	    math_force_eval (u);		/* raise underflow flag */
    40 +	    return x;
    41  	}
    42  	if(hx>=0) {				/* x > 0 */
    43  	    if(hy<0||(ix>>23)>(iy>>48)-0x3f80
    44 @@ -67,13 +70,16 @@
    45  	    }
    46  	}
    47  	hy = hx&0x7f800000;
    48 -	if(hy>=0x7f800000) return x+x;	/* overflow  */
    49 +	if(hy>=0x7f800000) {
    50 +	  x = x+x;	/* overflow  */
    51 +	  if (FLT_EVAL_METHOD != 0)
    52 +	    /* Force conversion to float.  */
    53 +	    asm ("" : "+m"(x));
    54 +	  return x;
    55 +	}
    56  	if(hy<0x00800000) {		/* underflow */
    57 -	    float x2 = x*x;
    58 -	    if(x2!=x) {		/* raise underflow flag */
    59 -	        SET_FLOAT_WORD(x2,hx);
    60 -		return x2;
    61 -	    }
    62 +	    float u = x*x;
    63 +	    math_force_eval (u);	/* raise underflow flag */
    64  	}
    65  	SET_FLOAT_WORD(x,hx);
    66  	return x;