Aurelien Jarno wrote: > Hi all, > > The current softfloat implementation changes qNaN into sNaN when > converting between formats, for no reason. The attached patch fixes > that.
Did you take into account that MIPS and PA-RISC have the signalling bit inverted to the rest of the world? > It also fixes an off-by-one in the extended double precision > format (aka floatx80), the mantissa is 64-bit long and not 63-bit > long. > > With this patch applied all the glibc 2.7 floating point tests > are successfull on MIPS and MIPSEL. > > Bye, > Aurelien > > Index: fpu/softfloat-specialize.h > =================================================================== > RCS file: /sources/qemu/qemu/fpu/softfloat-specialize.h,v > retrieving revision 1.3 > diff -u -d -p -r1.3 softfloat-specialize.h > --- fpu/softfloat-specialize.h 11 May 2007 17:10:14 -0000 1.3 > +++ fpu/softfloat-specialize.h 3 Nov 2007 17:21:38 -0000 > @@ -121,8 +121,7 @@ static commonNaNT float32ToCommonNaN( fl > static float32 commonNaNToFloat32( commonNaNT a ) > { > > - return ( ( (bits32) a.sign )<<31 ) | 0x7FC00000 | ( a.high>>41 ); > - > + return ( ( (bits32) a.sign )<<31 ) | 0x7F800000 | ( a.high>>41 ); > } > > > /*---------------------------------------------------------------------------- > @@ -233,7 +232,7 @@ static float64 commonNaNToFloat64( commo > > return > ( ( (bits64) a.sign )<<63 ) > - | LIT64( 0x7FF8000000000000 ) > + | LIT64( 0x7FF0000000000000 ) > | ( a.high>>12 ); > > } > @@ -329,7 +328,7 @@ static commonNaNT floatx80ToCommonNaN( f > if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid > STATUS_VAR); > z.sign = a.high>>15; > z.low = 0; > - z.high = a.low<<1; > + z.high = a.low; > return z; > > } > @@ -343,7 +342,7 @@ static floatx80 commonNaNToFloatx80( com > { > floatx80 z; > > - z.low = LIT64( 0xC000000000000000 ) | ( a.high>>1 ); > + z.low = a.high; > z.high = ( ( (bits16) a.sign )<<15 ) | 0x7FFF; > return z; > > @@ -449,7 +448,7 @@ static float128 commonNaNToFloat128( com > float128 z; > > shift128Right( a.high, a.low, 16, &z.high, &z.low ); > - z.high |= ( ( (bits64) a.sign )<<63 ) | LIT64( 0x7FFF800000000000 ); > + z.high |= ( ( (bits64) a.sign )<<63 ) | LIT64( 0x7FFF000000000000 ); > return z; > > } > > -- > .''`. Aurelien Jarno | GPG: 1024D/F1BCDB73 > : :' : Debian developer | Electrical Engineer > `. `' [EMAIL PROTECTED] | [EMAIL PROTECTED] > `- people.debian.org/~aurel32 | www.aurel32.net > > >