another fix for printf(float) on m68k platform
bug caused by this instruction: fmove.l fp0,d0 problem was caused by a conflict between the fpu emulator (softfloat) and the compiler. the emulator implemented this as a purely arithmetic move & conversion, but the compiler assumed that the result could be interpreted as a logical (ie unsigned) conversion. rightly or wrongly. for example, if fp0 contained the value 2576980377.0 which is unsigned integer -1717987328 the emulator would treat this as an integer overflow and move 0x7fffffff (INT_MAX) into d0. The complier on the other hand would assume that d0 contained 2576980377 (the unsigned value). I don't know which is correct, but this is my fix for the time being.
This commit is contained in:
parent
04fe0aa53e
commit
6fe335b9e9
|
@ -95,7 +95,7 @@ static int32 roundAndPackInt32( flag zSign, bits64 absZ )
|
||||||
if ( zSign ) z = - z;
|
if ( zSign ) z = - z;
|
||||||
if ( ( absZ>>32 ) || ( z && ( ( z < 0 ) ^ zSign ) ) ) {
|
if ( ( absZ>>32 ) || ( z && ( ( z < 0 ) ^ zSign ) ) ) {
|
||||||
float_raise( float_flag_invalid );
|
float_raise( float_flag_invalid );
|
||||||
return zSign ? (sbits32) 0x80000000 : 0x7FFFFFFF;
|
return z /* zSign ? (sbits32) 0x80000000 : 0x7FFFFFFF*/;
|
||||||
}
|
}
|
||||||
if ( roundBits ) float_exception_flags |= float_flag_inexact;
|
if ( roundBits ) float_exception_flags |= float_flag_inexact;
|
||||||
return z;
|
return z;
|
||||||
|
@ -146,9 +146,9 @@ static int64 roundAndPackInt64( flag zSign, bits64 absZ0, bits64 absZ1 )
|
||||||
if ( z && ( ( z < 0 ) ^ zSign ) ) {
|
if ( z && ( ( z < 0 ) ^ zSign ) ) {
|
||||||
overflow:
|
overflow:
|
||||||
float_raise( float_flag_invalid );
|
float_raise( float_flag_invalid );
|
||||||
return
|
return z
|
||||||
zSign ? (sbits64) LIT64( 0x8000000000000000 )
|
/* zSign ? (sbits64) LIT64( 0x8000000000000000 )
|
||||||
: (sbits64)( 0x7FFFFFFFFFFFFFFF );
|
: (sbits64)( 0x7FFFFFFFFFFFFFFF )*/;
|
||||||
}
|
}
|
||||||
if ( absZ1 ) float_exception_flags |= float_flag_inexact;
|
if ( absZ1 ) float_exception_flags |= float_flag_inexact;
|
||||||
return z;
|
return z;
|
||||||
|
|
Loading…
Reference in a new issue