Commit 85016c983cc25b31b548fd2d146257756b3ac3d9
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 | ... | ... |