Commit 85016c983cc25b31b548fd2d146257756b3ac3d9

Authored by ths
1 parent e9c71dd1

Assortment of soft-float fixes, by Aurelien Jarno.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3860 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 35 additions and 11 deletions
fpu/softfloat-specialize.h
... ... @@ -65,7 +65,13 @@ typedef struct {
65 65 /*----------------------------------------------------------------------------
66 66 | The pattern for a default generated single-precision NaN.
67 67 *----------------------------------------------------------------------------*/
68   -#if SNAN_BIT_IS_ONE
  68 +#if defined(TARGET_SPARC)
  69 +#define float32_default_nan make_float32(0x7FFFFFFF)
  70 +#elif defined(TARGET_POWERPC)
  71 +#define float32_default_nan make_float32(0x7FC00000)
  72 +#elif defined(TARGET_HPPA)
  73 +#define float32_default_nan make_float32(0x7FA00000)
  74 +#elif SNAN_BIT_IS_ONE
69 75 #define float32_default_nan make_float32(0x7FBFFFFF)
70 76 #else
71 77 #define float32_default_nan make_float32(0xFFC00000)
... ... @@ -125,8 +131,12 @@ static commonNaNT float32ToCommonNaN( float32 a STATUS_PARAM )
125 131  
126 132 static float32 commonNaNToFloat32( commonNaNT a )
127 133 {
128   - return make_float32(
129   - ( ( (bits32) a.sign )<<31 ) | 0x7FC00000 | ( a.high>>41 ) );
  134 + bits32 mantissa = a.high>>41;
  135 + if ( mantissa )
  136 + return make_float32(
  137 + ( ( (bits32) a.sign )<<31 ) | 0x7F800000 | ( a.high>>41 ) );
  138 + else
  139 + return float32_default_nan;
130 140 }
131 141  
132 142 /*----------------------------------------------------------------------------
... ... @@ -180,7 +190,13 @@ static float32 propagateFloat32NaN( float32 a, float32 b STATUS_PARAM)
180 190 /*----------------------------------------------------------------------------
181 191 | The pattern for a default generated double-precision NaN.
182 192 *----------------------------------------------------------------------------*/
183   -#if SNAN_BIT_IS_ONE
  193 +#if defined(TARGET_SPARC)
  194 +#define float64_default_nan make_float64(LIT64( 0x7FFFFFFFFFFFFFFF ))
  195 +#elif defined(TARGET_POWERPC)
  196 +#define float64_default_nan make_float64(LIT64( 0x7FF8000000000000 ))
  197 +#elif defined(TARGET_HPPA)
  198 +#define float64_default_nan make_float64(LIT64( 0x7FF4000000000000 ))
  199 +#elif SNAN_BIT_IS_ONE
184 200 #define float64_default_nan make_float64(LIT64( 0x7FF7FFFFFFFFFFFF ))
185 201 #else
186 202 #define float64_default_nan make_float64(LIT64( 0xFFF8000000000000 ))
... ... @@ -244,10 +260,15 @@ static commonNaNT float64ToCommonNaN( float64 a STATUS_PARAM)
244 260  
245 261 static float64 commonNaNToFloat64( commonNaNT a )
246 262 {
247   - return make_float64(
248   - ( ( (bits64) a.sign )<<63 )
249   - | LIT64( 0x7FF8000000000000 )
250   - | ( a.high>>12 ));
  263 + bits64 mantissa = a.high>>12;
  264 +
  265 + if ( mantissa )
  266 + return make_float64(
  267 + ( ( (bits64) a.sign )<<63 )
  268 + | LIT64( 0x7FF0000000000000 )
  269 + | ( a.high>>12 ));
  270 + else
  271 + return float64_default_nan;
251 272 }
252 273  
253 274 /*----------------------------------------------------------------------------
... ... @@ -366,7 +387,7 @@ static commonNaNT floatx80ToCommonNaN( floatx80 a STATUS_PARAM)
366 387 if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
367 388 z.sign = a.high>>15;
368 389 z.low = 0;
369   - z.high = a.low<<1;
  390 + z.high = a.low;
370 391 return z;
371 392 }
372 393  
... ... @@ -379,7 +400,10 @@ static floatx80 commonNaNToFloatx80( commonNaNT a )
379 400 {
380 401 floatx80 z;
381 402  
382   - z.low = LIT64( 0xC000000000000000 ) | ( a.high>>1 );
  403 + if (a.high)
  404 + z.low = a.high;
  405 + else
  406 + z.low = floatx80_default_nan_low;
383 407 z.high = ( ( (bits16) a.sign )<<15 ) | 0x7FFF;
384 408 return z;
385 409 }
... ... @@ -500,7 +524,7 @@ static float128 commonNaNToFloat128( commonNaNT a )
500 524 float128 z;
501 525  
502 526 shift128Right( a.high, a.low, 16, &z.high, &z.low );
503   - z.high |= ( ( (bits64) a.sign )<<63 ) | LIT64( 0x7FFF800000000000 );
  527 + z.high |= ( ( (bits64) a.sign )<<63 ) | LIT64( 0x7FFF000000000000 );
504 528 return z;
505 529 }
506 530  
... ...