]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Undocumented 68040 FPU behavior: FCMP with negative NaN returns N flag set. 6888x...
authorToni Wilen <twilen@winuae.net>
Mon, 18 Jun 2018 19:57:47 +0000 (22:57 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 18 Jun 2018 19:57:47 +0000 (22:57 +0300)
fpp_softfloat.cpp
softfloat/softfloat.cpp
softfloat/softfloat.h

index 55883a548cd4ab6abbf2fd84cdb0b308c99bc42a..aa754c92a4fc91d5bc95f40239891ff1bbdb2aa9 100644 (file)
@@ -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);
 
index a460dd2150eecc59407a55ff86f56d19bd517974..2b47d0e7f3894766498dd693ddb5e5436a7998f8 100644 (file)
@@ -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 ) );
index ee89d11c7eb019902fd848585035c6c242b9c86d..061eca5d2d91048395832127fb784e9cd4d773a5 100644 (file)
@@ -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;
 
 /*----------------------------------------------------------------------------