patches/glibc/2.9/270-ldbl-nexttowardf.patch
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Tue Jul 31 22:27:29 2012 +0200 (2012-07-31)
changeset 3018 7776e8369284
parent 1201 c9967a6e3b25
permissions -rw-r--r--
complibs/cloog: create missing m4 dir

Because we now patch configure.in and configure, the Makefile quicks
in a re-build rule as the source files are now more recent than the
bundled generated files, and that fails because the m4 directory
is missing, although on some systems where aclocal is not installed,
the re-build rule does nothing (except a warning).

Always create tht directory.

Reported-by: Per Arnold Blaasmo <per-arnold.blaasmo@atmel.com>
[Also thanks to Thomas De Schampheleire <patrickdepinguin@gmail.com>
for some digging works on this issue]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.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;