patches/glibc/2.9/270-ldbl-nexttowardf.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 24 19:35:24 2011 +0200 (2011-07-24)
changeset 2900 369e2fbe9010
parent 1201 c9967a6e3b25
permissions -rw-r--r--
cc-gcc: the frontends are responsible for mkdir/chdir

The build dir are created depending on the host (host for that specific
backend, not host for the toolchain). Only the frontends know what host
this is, so only the frontends can create non-ambiguous dirs.

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