about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-04 10:32:42 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-04 10:32:42 +0100
commit81386b7a5600e864427df86ec59a762da23efd12 (patch)
tree38c0520175d8af486e31840738331b07fd8def17
parent5bf2a7d51b6080f33892fd9769574ba53cae6842 (diff)
downloadbox64-81386b7a5600e864427df86ec59a762da23efd12.tar.gz
box64-81386b7a5600e864427df86ec59a762da23efd12.zip
[INTERPRETER] Small D8..DF opcodes refactor
-rw-r--r--src/emu/x64rund8.c4
-rw-r--r--src/emu/x64rund9.c15
-rw-r--r--src/emu/x64runda.c15
-rw-r--r--src/emu/x64rundb.c11
-rw-r--r--src/emu/x64rundc.c3
-rw-r--r--src/emu/x64rundd.c136
-rw-r--r--src/emu/x64runde.c185
-rw-r--r--src/emu/x64rundf.c121
8 files changed, 202 insertions, 288 deletions
diff --git a/src/emu/x64rund8.c b/src/emu/x64rund8.c
index c44ca5be..fcd0b0ee 100644
--- a/src/emu/x64rund8.c
+++ b/src/emu/x64rund8.c
@@ -36,6 +36,7 @@ uintptr_t RunD8(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif

 

     nextop = F8;

+    if(MODREG)

     switch (nextop) {

 

         case 0xC0:

@@ -120,6 +121,8 @@ uintptr_t RunD8(x64emu_t *emu, rex_t rex, uintptr_t addr)
             ST0.d = ST(nextop&7).d / ST0.d;

             break;

         default:

+            return 0;

+    } else

         switch((nextop>>3)&7) {

             case 0:         /* FADD ST0, float */

                 GETE4(0);

@@ -157,6 +160,5 @@ uintptr_t RunD8(x64emu_t *emu, rex_t rex, uintptr_t addr)
             default:

                 return 0;

         }

-    }

    return addr;

 }
\ No newline at end of file
diff --git a/src/emu/x64rund9.c b/src/emu/x64rund9.c
index 1b097f9a..2cc8cdce 100644
--- a/src/emu/x64rund9.c
+++ b/src/emu/x64rund9.c
@@ -38,6 +38,7 @@ uintptr_t RunD9(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif

 

     nextop = F8;

+    if(MODREG)

     switch (nextop) {

         case 0xC0:

         case 0xC1:

@@ -223,18 +224,9 @@ uintptr_t RunD9(x64emu_t *emu, rex_t rex, uintptr_t addr)
             break;

 

 

-        case 0xD1:

-        case 0xD4:

-        case 0xD5:

-        case 0xD6:

-        case 0xD7:

-        case 0xE2:

-        case 0xE3:

-        case 0xE6:

-        case 0xE7:

-        case 0xEF:

-            return 0;

         default:

+            return 0;

+    } else

         switch((nextop>>3)&7) {

             case 0:     /* FLD ST0, Ed float */

                 GETE4(0);

@@ -277,6 +269,5 @@ uintptr_t RunD9(x64emu_t *emu, rex_t rex, uintptr_t addr)
             default:

                 return 0;

         }

-    }

    return addr;

 }
\ No newline at end of file
diff --git a/src/emu/x64runda.c b/src/emu/x64runda.c
index bb678a8c..aed775f9 100644
--- a/src/emu/x64runda.c
+++ b/src/emu/x64runda.c
@@ -35,6 +35,7 @@ uintptr_t RunDA(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif

 

     nextop = F8;

+    if(MODREG)

     switch (nextop) {

     case 0xC0:      /* FCMOVB ST(0), ST(i) */

     case 0xC1:

@@ -91,18 +92,9 @@ uintptr_t RunDA(x64emu_t *emu, rex_t rex, uintptr_t addr)
         fpu_do_pop(emu);

         break;

 

-    case 0xE4:

-    case 0xF0:

-    case 0xF1:

-    case 0xF4:

-    case 0xF5:

-    case 0xF6:

-    case 0xF7:

-    case 0xF8:

-    case 0xF9:

-    case 0xFD:

-        return 0;

     default:

+        return 0;

+    } else

         switch((nextop>>3)&7) {

             case 0:     /* FIADD ST0, Ed int */

                 GETE4(0);

@@ -138,6 +130,5 @@ uintptr_t RunDA(x64emu_t *emu, rex_t rex, uintptr_t addr)
                 ST0.d = (double)ED->sdword[0] / ST0.d;

                 break;

         }

-   }

    return addr;

 }
\ No newline at end of file
diff --git a/src/emu/x64rundb.c b/src/emu/x64rundb.c
index ad5952bb..9fdae847 100644
--- a/src/emu/x64rundb.c
+++ b/src/emu/x64rundb.c
@@ -36,6 +36,7 @@ uintptr_t RunDB(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif

 

     nextop = F8;

+    if(MODREG)

     switch(nextop) {

     case 0xC0:      /* FCMOVNB ST(0), ST(i) */

     case 0xC1:

@@ -125,13 +126,10 @@ uintptr_t RunDB(x64emu_t *emu, rex_t rex, uintptr_t addr)
     case 0xF7:

         fpu_fcomi(emu, ST(nextop&7).d);

         break;

-    case 0xE0:

-    case 0xE4:

-    case 0xE5:

-    case 0xE6:

-    case 0xE7:

-        return 0;

+

     default:

+        return 0;

+    } else

         switch((nextop>>3)&7) {

             case 0: /* FILD ST0, Ed */

                 GETE4(0);

@@ -183,6 +181,5 @@ uintptr_t RunDB(x64emu_t *emu, rex_t rex, uintptr_t addr)
             default:

                 return 0;

         }

-    }

   return addr;

 }

diff --git a/src/emu/x64rundc.c b/src/emu/x64rundc.c
index 08931135..6d9ff07b 100644
--- a/src/emu/x64rundc.c
+++ b/src/emu/x64rundc.c
@@ -35,6 +35,7 @@ uintptr_t RunDC(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif
 
     nextop = F8;
+    if(MODREG)
     switch(nextop) {
         case 0xC0:
         case 0xC1:
@@ -118,6 +119,8 @@ uintptr_t RunDC(x64emu_t *emu, rex_t rex, uintptr_t addr)
             ST(nextop&7).d /=  ST0.d;
             break;
         default:
+            return 0;
+    } else {
             GETE8(0);
             switch((nextop>>3)&7) {
             case 0:         /* FADD ST0, double */
diff --git a/src/emu/x64rundd.c b/src/emu/x64rundd.c
index fc65f01d..35b439fe 100644
--- a/src/emu/x64rundd.c
+++ b/src/emu/x64rundd.c
@@ -35,88 +35,65 @@ uintptr_t RunDD(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif

 

     nextop = F8;

+    if(MODREG)

     switch (nextop) {

-    case 0xC0:  /* FFREE STx */

-    case 0xC1:

-    case 0xC2:

-    case 0xC3:

-    case 0xC4:

-    case 0xC5:

-    case 0xC6:

-    case 0xC7:

-        fpu_do_free(emu, nextop-0xC0);

-        break;

+        case 0xC0:  /* FFREE STx */

+        case 0xC1:

+        case 0xC2:

+        case 0xC3:

+        case 0xC4:

+        case 0xC5:

+        case 0xC6:

+        case 0xC7:

+            fpu_do_free(emu, nextop-0xC0);

+            break;

 

-    case 0xD0:  /* FST ST0, STx */

-    case 0xD1:

-    case 0xD2:

-    case 0xD3:

-    case 0xD4:

-    case 0xD5:

-    case 0xD6:

-    case 0xD7:

-        ST(nextop&7).q = ST0.q;

-        break;

-    case 0xD8:  /* FSTP ST0, STx */

-    case 0xD9:

-    case 0xDA:

-    case 0xDB:

-    case 0xDC:

-    case 0xDD:

-    case 0xDE:

-    case 0xDF:

-        ST(nextop&7).q = ST0.q;

-        fpu_do_pop(emu);

-        break;

-    case 0xE0:  /* FUCOM ST0, STx */

-    case 0xE1:

-    case 0xE2:

-    case 0xE3:

-    case 0xE4:

-    case 0xE5:

-    case 0xE6:

-    case 0xE7:

-        fpu_fcom(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

-        break;

-    case 0xE8:  /* FUCOMP ST0, STx */

-    case 0xE9:

-    case 0xEA:

-    case 0xEB:

-    case 0xEC:

-    case 0xED:

-    case 0xEE:

-    case 0xEF:

-        fpu_fcom(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

-        fpu_do_pop(emu);

-        break;

+        case 0xD0:  /* FST ST0, STx */

+        case 0xD1:

+        case 0xD2:

+        case 0xD3:

+        case 0xD4:

+        case 0xD5:

+        case 0xD6:

+        case 0xD7:

+            ST(nextop&7).q = ST0.q;

+            break;

+        case 0xD8:  /* FSTP ST0, STx */

+        case 0xD9:

+        case 0xDA:

+        case 0xDB:

+        case 0xDC:

+        case 0xDD:

+        case 0xDE:

+        case 0xDF:

+            ST(nextop&7).q = ST0.q;

+            fpu_do_pop(emu);

+            break;

+        case 0xE0:  /* FUCOM ST0, STx */

+        case 0xE1:

+        case 0xE2:

+        case 0xE3:

+        case 0xE4:

+        case 0xE5:

+        case 0xE6:

+        case 0xE7:

+            fpu_fcom(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

+            break;

+        case 0xE8:  /* FUCOMP ST0, STx */

+        case 0xE9:

+        case 0xEA:

+        case 0xEB:

+        case 0xEC:

+        case 0xED:

+        case 0xEE:

+        case 0xEF:

+            fpu_fcom(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

+            fpu_do_pop(emu);

+            break;

 

-    case 0xC8:

-    case 0xC9:

-    case 0xCA:

-    case 0xCB:

-    case 0xCC:

-    case 0xCD:

-    case 0xCE:

-    case 0xCF:

-    case 0xF0:

-    case 0xF1:

-    case 0xF2:

-    case 0xF3:

-    case 0xF4:

-    case 0xF5:

-    case 0xF6:

-    case 0xF7:

-    case 0xF8:

-    case 0xF9:

-    case 0xFA:

-    case 0xFB:

-    case 0xFC:

-    case 0xFD:

-    case 0xFE:

-    case 0xFF:

-        return 0;

-

-    default:

+        default:

+            return 0;

+    } else

         switch((nextop>>3)&7) {

             case 0: /* FLD double */

                 GETE8(0);

@@ -183,6 +160,5 @@ uintptr_t RunDD(x64emu_t *emu, rex_t rex, uintptr_t addr)
             default:

                 return 0;

         }

-    }

    return addr;

 }
\ No newline at end of file
diff --git a/src/emu/x64runde.c b/src/emu/x64runde.c
index 4ec5828a..4cb5e4a2 100644
--- a/src/emu/x64runde.c
+++ b/src/emu/x64runde.c
@@ -35,105 +35,99 @@ uintptr_t RunDE(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif
 
     nextop = F8;
+    if(MODREG)
     switch(nextop) {
-    case 0xC0:  /* FADDP STx, ST0 */
-    case 0xC1:  /* FADDP ST1, ST0 */
-    case 0xC2:
-    case 0xC3:
-    case 0xC4:
-    case 0xC5:
-    case 0xC6:
-    case 0xC7:
-        ST(nextop&7).d += ST0.d;
-        fpu_do_pop(emu);
-        break;
-    case 0xC8:  /* FMULP STx, ST0 */
-    case 0xC9:  /* FMULP ST1, ST0 */
-    case 0xCA:
-    case 0xCB:
-    case 0xCC:
-    case 0xCD:
-    case 0xCE:
-    case 0xCF:
-        ST(nextop&7).d *= ST0.d;
-        fpu_do_pop(emu);
-        break;
-    case 0xD0:
-    case 0xD1:
-    case 0xD2:
-    case 0xD3:
-    case 0xD4:
-    case 0xD5:
-    case 0xD6:
-    case 0xD7:  /* FCOMP */
-        fpu_fcom(emu, ST(nextop&7).d);
-        fpu_do_pop(emu);
-        break;
+        case 0xC0:  /* FADDP STx, ST0 */
+        case 0xC1:  /* FADDP ST1, ST0 */
+        case 0xC2:
+        case 0xC3:
+        case 0xC4:
+        case 0xC5:
+        case 0xC6:
+        case 0xC7:
+            ST(nextop&7).d += ST0.d;
+            fpu_do_pop(emu);
+            break;
+        case 0xC8:  /* FMULP STx, ST0 */
+        case 0xC9:  /* FMULP ST1, ST0 */
+        case 0xCA:
+        case 0xCB:
+        case 0xCC:
+        case 0xCD:
+        case 0xCE:
+        case 0xCF:
+            ST(nextop&7).d *= ST0.d;
+            fpu_do_pop(emu);
+            break;
+        case 0xD0:
+        case 0xD1:
+        case 0xD2:
+        case 0xD3:
+        case 0xD4:
+        case 0xD5:
+        case 0xD6:
+        case 0xD7:  /* FCOMP */
+            fpu_fcom(emu, ST(nextop&7).d);
+            fpu_do_pop(emu);
+            break;
 
-    case 0xD9:  /* FCOMPP */
-        fpu_fcom(emu, ST1.d);
-        fpu_do_pop(emu);
-        fpu_do_pop(emu);
-        break;
+        case 0xD9:  /* FCOMPP */
+            fpu_fcom(emu, ST1.d);
+            fpu_do_pop(emu);
+            fpu_do_pop(emu);
+            break;
 
-        /*ST(1).d = ST0.d - ST(1).d;
-        fpu_do_pop(emu);
-        break;*/
-    case 0xE0:  /* FSUBRP STx, ST0 */
-    case 0xE1:  /* FSUBRP ST1, ST0 */
-    case 0xE2:
-    case 0xE3:
-    case 0xE4:
-    case 0xE5:
-    case 0xE6:
-    case 0xE7:
-        ST(nextop&7).d = ST0.d - ST(nextop&7).d;
-        fpu_do_pop(emu);
-        break;
-    case 0xE8:  /* FSUBP STx, ST0 */
-    case 0xE9:  /* FSUBP ST1, ST0 */
-    case 0xEA:
-    case 0xEB:
-    case 0xEC:
-    case 0xED:
-    case 0xEE:
-    case 0xEF:
-        ST(nextop&7).d -= ST0.d;
-        fpu_do_pop(emu);
-        break;
-    case 0xF0:  /* FDIVRP STx, ST0 */
-    case 0xF1:  /* FDIVRP ST1, ST0 */
-    case 0xF2:
-    case 0xF3:
-    case 0xF4:
-    case 0xF5:
-    case 0xF6:
-    case 0xF7:
-        ST(nextop&7).d = ST0.d / ST(nextop&7).d;
-        fpu_do_pop(emu);
-        break;
-    case 0xF8:  /* FDIVP STx, ST0 */
-    case 0xF9:  /* FDIVP ST1, ST0 */
-    case 0xFA:
-    case 0xFB:
-    case 0xFC:
-    case 0xFD:
-    case 0xFE:
-    case 0xFF:
-        ST(nextop&7).d /= ST0.d;
-        fpu_do_pop(emu);
-        break;
+            /*ST(1).d = ST0.d - ST(1).d;
+            fpu_do_pop(emu);
+            break;*/
+        case 0xE0:  /* FSUBRP STx, ST0 */
+        case 0xE1:  /* FSUBRP ST1, ST0 */
+        case 0xE2:
+        case 0xE3:
+        case 0xE4:
+        case 0xE5:
+        case 0xE6:
+        case 0xE7:
+            ST(nextop&7).d = ST0.d - ST(nextop&7).d;
+            fpu_do_pop(emu);
+            break;
+        case 0xE8:  /* FSUBP STx, ST0 */
+        case 0xE9:  /* FSUBP ST1, ST0 */
+        case 0xEA:
+        case 0xEB:
+        case 0xEC:
+        case 0xED:
+        case 0xEE:
+        case 0xEF:
+            ST(nextop&7).d -= ST0.d;
+            fpu_do_pop(emu);
+            break;
+        case 0xF0:  /* FDIVRP STx, ST0 */
+        case 0xF1:  /* FDIVRP ST1, ST0 */
+        case 0xF2:
+        case 0xF3:
+        case 0xF4:
+        case 0xF5:
+        case 0xF6:
+        case 0xF7:
+            ST(nextop&7).d = ST0.d / ST(nextop&7).d;
+            fpu_do_pop(emu);
+            break;
+        case 0xF8:  /* FDIVP STx, ST0 */
+        case 0xF9:  /* FDIVP ST1, ST0 */
+        case 0xFA:
+        case 0xFB:
+        case 0xFC:
+        case 0xFD:
+        case 0xFE:
+        case 0xFF:
+            ST(nextop&7).d /= ST0.d;
+            fpu_do_pop(emu);
+            break;
 
-    case 0xD8:  
-    case 0xDA:
-    case 0xDB:
-    case 0xDC:
-    case 0xDD:
-    case 0xDE:
-    case 0xDF:
-        return 0;
-    
-    default:
+        default:
+            return 0;
+    } else
         switch((nextop>>3)&7) {
             case 0:     /* FIADD ST0, Ew int */
                 GETEW(0);
@@ -162,6 +156,5 @@ uintptr_t RunDE(x64emu_t *emu, rex_t rex, uintptr_t addr)
            default:
                 return 0;
         }
-    }
   return addr;
 }
\ No newline at end of file
diff --git a/src/emu/x64rundf.c b/src/emu/x64rundf.c
index d707863c..755c5865 100644
--- a/src/emu/x64rundf.c
+++ b/src/emu/x64rundf.c
@@ -37,90 +37,52 @@ uintptr_t RunDF(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif

 

     nextop = F8;

+    if(MODREG)

     switch(nextop) {

-    case 0xC0:  /* FFREEP STx */

-    case 0xC1:

-    case 0xC2:

-    case 0xC3:

-    case 0xC4:

-    case 0xC5:

-    case 0xC6:

-    case 0xC7:

-        fpu_do_free(emu, nextop-0xC0);

-        fpu_do_pop(emu);

-        break;

-

-    case 0xE0:  /* FNSTSW AX */

-        emu->sw.f.F87_TOP = emu->top&7;

-        R_AX = emu->sw.x16;

-        break;

+        case 0xC0:  /* FFREEP STx */

+        case 0xC1:

+        case 0xC2:

+        case 0xC3:

+        case 0xC4:

+        case 0xC5:

+        case 0xC6:

+        case 0xC7:

+            fpu_do_free(emu, nextop-0xC0);

+            fpu_do_pop(emu);

+            break;

 

-    case 0xE8:  /* FUCOMIP ST0, STx */

-    case 0xE9:

-    case 0xEA:

-    case 0xEB:

-    case 0xEC:

-    case 0xED:

-    case 0xEE:

-    case 0xEF:

-        fpu_fcomi(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

-        fpu_do_pop(emu);

-        break;

+        case 0xE0:  /* FNSTSW AX */

+            emu->sw.f.F87_TOP = emu->top&7;

+            R_AX = emu->sw.x16;

+            break;

 

-    case 0xF0:  /* FCOMIP ST0, STx */

-    case 0xF1:

-    case 0xF2:

-    case 0xF3:

-    case 0xF4:

-    case 0xF5:

-    case 0xF6:

-    case 0xF7:

-        fpu_fcomi(emu, ST(nextop&7).d);

-        fpu_do_pop(emu);

-        break;

+        case 0xE8:  /* FUCOMIP ST0, STx */

+        case 0xE9:

+        case 0xEA:

+        case 0xEB:

+        case 0xEC:

+        case 0xED:

+        case 0xEE:

+        case 0xEF:

+            fpu_fcomi(emu, ST(nextop&7).d);   // bad, should handle QNaN and IA interrupt

+            fpu_do_pop(emu);

+            break;

 

-    case 0xC8:

-    case 0xC9:

-    case 0xCA:

-    case 0xCB:

-    case 0xCC:

-    case 0xCD:

-    case 0xCE:

-    case 0xCF:

-    case 0xD0:

-    case 0xD1:

-    case 0xD2:

-    case 0xD3:

-    case 0xD4:

-    case 0xD5:

-    case 0xD6:

-    case 0xD7:

-    case 0xD8:

-    case 0xD9:

-    case 0xDA:

-    case 0xDB:

-    case 0xDC:

-    case 0xDD:

-    case 0xDE:

-    case 0xDF:

-    case 0xE1:

-    case 0xE2:

-    case 0xE3:

-    case 0xE4:

-    case 0xE5:

-    case 0xE6:

-    case 0xE7:

-    case 0xF8:

-    case 0xF9:

-    case 0xFA:

-    case 0xFB:

-    case 0xFC:

-    case 0xFD:

-    case 0xFE:

-    case 0xFF:

-        return 0;

+        case 0xF0:  /* FCOMIP ST0, STx */

+        case 0xF1:

+        case 0xF2:

+        case 0xF3:

+        case 0xF4:

+        case 0xF5:

+        case 0xF6:

+        case 0xF7:

+            fpu_fcomi(emu, ST(nextop&7).d);

+            fpu_do_pop(emu);

+            break;

 

-    default:

+        default:

+            return 0;

+    } else

         switch((nextop>>3)&7) {

         case 0: /* FILD ST0, Gw */

             GETEW(0);

@@ -185,6 +147,5 @@ uintptr_t RunDF(x64emu_t *emu, rex_t rex, uintptr_t addr)
         default:

             return 0;

         }

-    }

     return addr;

 }