From: Toni Wilen Date: Mon, 18 Jun 2018 19:57:47 +0000 (+0300) Subject: Undocumented 68040 FPU behavior: FCMP with negative NaN returns N flag set. 6888x... X-Git-Tag: 4000~4 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=ad809a4b916f86c9504ee0982a9f505d0e2b2078;p=francis%2Fwinuae.git Undocumented 68040 FPU behavior: FCMP with negative NaN returns N flag set. 6888x and 68060 always return N flag unset in this situation. --- diff --git a/fpp_softfloat.cpp b/fpp_softfloat.cpp index 55883a54..aa754c92 100644 --- a/fpp_softfloat.cpp +++ b/fpp_softfloat.cpp @@ -736,6 +736,10 @@ static void fp_from_pack(fpdata *fp, uae_u32 *wrd, int kfactor) void fp_init_softfloat(void) { float_status fsx = { 0 }; + + fsx.fpu_model = currprefs.fpu_model; + fs.fpu_model = currprefs.fpu_model; + set_floatx80_rounding_precision(80, &fsx); set_float_rounding_mode(float_round_to_zero, &fsx); diff --git a/softfloat/softfloat.cpp b/softfloat/softfloat.cpp index a460dd21..2b47d0e7 100644 --- a/softfloat/softfloat.cpp +++ b/softfloat/softfloat.cpp @@ -3362,8 +3362,12 @@ floatx80 floatx80_cmp( floatx80 a, floatx80 b, float_status *status ) if ( ( aExp == 0x7FFF && (uint64_t) ( aSig<<1 ) ) || ( bExp == 0x7FFF && (uint64_t) ( bSig<<1 ) ) ) { - return propagateFloatx80NaN( packFloatx80( 0, aExp, aSig ), - packFloatx80( 0, bExp, bSig ), status ); + // 68040 FCMP -NaN return N flag set + if (status->fpu_model == 68040) + return propagateFloatx80NaN( packFloatx80( aSign, aExp, aSig ), + packFloatx80( bSign, bExp, bSig ), status ); + return propagateFloatx80NaN(packFloatx80(0, aExp, aSig), + packFloatx80(0, bExp, bSig), status); } if ( bExp < aExp ) return packFloatx80( aSign, 0x3FFF, LIT64( 0x8000000000000000 ) ); diff --git a/softfloat/softfloat.h b/softfloat/softfloat.h index ee89d11c..061eca5d 100644 --- a/softfloat/softfloat.h +++ b/softfloat/softfloat.h @@ -221,6 +221,7 @@ typedef struct float_status { flag flush_inputs_to_zero; flag default_nan_mode; flag snan_bit_is_one; + uint32_t fpu_model; } float_status; /*----------------------------------------------------------------------------