about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-09-25 21:25:16 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-09-25 21:25:16 +0200
commit4f18bd62931f92f14ebdaa25cae5f487619e8a52 (patch)
tree82839428671837d520c075aabf6b8b7ce0cc76d7 /src
parent702e92d4f4ae835cb7658684282dacb69a2ed362 (diff)
downloadbox64-4f18bd62931f92f14ebdaa25cae5f487619e8a52.tar.gz
box64-4f18bd62931f92f14ebdaa25cae5f487619e8a52.zip
[DYNAREC] Improved BOX64_NODYNAREC effect, and Interpretor->Dynarec on conditional jump
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_native_pass.c2
-rw-r--r--src/emu/modrm.h20
-rwxr-xr-xsrc/emu/x64run.c10
-rw-r--r--src/emu/x64run0f.c6
-rw-r--r--src/emu/x64run660f.c2
-rwxr-xr-xsrc/emu/x64run_private.h4
-rw-r--r--src/emu/x64runf20f.c4
7 files changed, 35 insertions, 13 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index 02b55774..d0211197 100755
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -213,7 +213,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr)
         if(ok<0)  {ok = 0; need_epilog=1;}
         ++ninst;
         #if STEP == 0
-        if(ok && !isJumpTableDefault64((void*)addr) && (box64_dynarec_bigblock<2))
+        if(ok && ((!isJumpTableDefault64((void*)addr) && (box64_dynarec_bigblock<2)) || (addr>=box64_nodynarec_start && addr<box64_nodynarec_end)))
         #else
         if(ok && (ninst==dyn->size))
         #endif
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index 01f83e1f..d3ccd18c 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -11,9 +11,11 @@
 #ifdef DYNAREC

 #define STEP if(step) return 0;

 #define STEP2 if(step) {R_RIP = addr; return 0;}

+#define STEP3 if(*step) *(step)++;

 #else

 #define STEP

 #define STEP2

+#define STEP3

 #endif

 

 #define GETED(D)            oped=GetEd(emu, &addr, rex, nextop, D)

@@ -48,7 +50,7 @@
 

 #define MODREG  ((nextop&0xC0)==0xC0)

 

-#define GOCOND(BASE, PREFIX, COND, NOTCOND)     \

+#define GOCOND(BASE, PREFIX, COND, NOTCOND, POST)\

     case BASE+0x0:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_OF)) {                 \

@@ -56,6 +58,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x1:                              \

         PREFIX                                  \

@@ -64,6 +67,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x2:                              \

         PREFIX                                  \

@@ -72,6 +76,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x3:                              \

         PREFIX                                  \

@@ -80,6 +85,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x4:                              \

         PREFIX                                  \

@@ -88,6 +94,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x5:                              \

         PREFIX                                  \

@@ -96,6 +103,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x6:                              \

         PREFIX                                  \

@@ -104,6 +112,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x7:                              \

         PREFIX                                  \

@@ -112,6 +121,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x8:                              \

         PREFIX                                  \

@@ -120,6 +130,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0x9:                              \

         PREFIX                                  \

@@ -128,6 +139,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0xA:                              \

         PREFIX                                  \

@@ -136,6 +148,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0xB:                              \

         PREFIX                                  \

@@ -144,6 +157,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0xC:                              \

         PREFIX                                  \

@@ -152,6 +166,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0xD:                              \

         PREFIX                                  \

@@ -160,6 +175,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0xE:                              \

         PREFIX                                  \

@@ -168,6 +184,7 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;                                  \

     case BASE+0xF:                              \

         PREFIX                                  \

@@ -176,4 +193,5 @@
         } else {                                \

             NOTCOND                             \

         }                                       \

+        POST                                    \

         break;

diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 944d790c..de48070a 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -135,10 +135,11 @@ x64emurun:
         case 0x0F:                      /* More instructions */
             switch(rep) {
                 case 1:
-                    if(!(addr = RunF20F(emu, rex, addr))) {
+                    if(!(addr = RunF20F(emu, rex, addr, &step))) {
                         unimp = 1;
                         goto fini;
                     }
+                    if(step==2) STEP2;
                     break;
                 case 2:
                     if(!(addr = RunF30F(emu, rex, addr))) {
@@ -147,10 +148,11 @@ x64emurun:
                     }
                     break;
                 default:
-                    if(!(addr = Run0F(emu, rex, addr))) {
+                    if(!(addr = Run0F(emu, rex, addr, &step))) {
                         unimp = 1;
                         goto fini;
                     }
+                    if(step==2) STEP2;
                     break;
             }
             if(emu->quit) {
@@ -330,7 +332,7 @@ x64emurun:
         GOCOND(0x70
             ,   tmp8s = F8S; CHECK_FLAGS(emu);
             ,   addr += tmp8s;
-            ,
+            ,,STEP2
             )                           /* Jxx Ib */
         
         case 0x80:                      /* GRP Eb,Ib */
@@ -1270,7 +1272,7 @@ x64emurun:
                 addr += tmp8s;
             STEP2
             break;
-        case 0xE3:                      /* JECXZ */
+        case 0xE3:                      /* JRCXZ */
             tmp8s = F8S;
             if(!R_RCX)
                 addr += tmp8s;
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index a07c2030..a75ffc26 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -28,7 +28,7 @@
 

 #include "modrm.h"

 

-uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr)

+uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)

 {

     uint8_t opcode;

     uint8_t nextop;

@@ -343,6 +343,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr)
             CHECK_FLAGS(emu);

             , if(rex.w) {GD->q[0] = ED->q[0]; } else {GD->q[0] = ED->dword[0];}

             , if(!rex.w) GD->dword[1] = 0;

+            ,

         )                               /* 0x40 -> 0x4F CMOVxx Gd,Ed */ // conditional move, no sign

         

         case 0x50:                      /* MOVMSKPS Gd, Ex */

@@ -749,13 +750,14 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         GOCOND(0x80

             , tmp32s = F32S; CHECK_FLAGS(emu);

             , addr += tmp32s;

-            ,

+            ,,STEP3

         )                               /* 0x80 -> 0x8F Jxx */

         GOCOND(0x90

             , nextop = F8; CHECK_FLAGS(emu);

             GETEB(0);

             , EB->byte[0]=1;

             , EB->byte[0]=0;

+            ,

         )                               /* 0x90 -> 0x9F SETxx Eb */

 

         case 0xA2:                      /* CPUID */

diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index a82be1d8..f182e34f 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -829,7 +829,7 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         GETEW(0);

         GETGW;

         , if(rex.w) GW->q[0] = EW->q[0]; else GW->word[0] = EW->word[0];

-        ,

+        ,,

     )                               /* 0x40 -> 0x4F CMOVxx Gw,Ew */ // conditional move, no sign

 

     case 0x50:                      /* MOVMSKPD Gd, Ex */

diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index b3aea763..9288593b 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -64,7 +64,7 @@ void UpdateFlags(x64emu_t *emu);
 #define CHECK_FLAGS(emu) if(emu->df) UpdateFlags(emu)
 #define RESET_FLAGS(emu) emu->df = d_none
 
-uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr);
+uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step);
 uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr);
 uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr);
 uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr);
@@ -85,7 +85,7 @@ uintptr_t RunDD(x64emu_t *emu, rex_t rex, uintptr_t addr);
 uintptr_t RunDE(x64emu_t *emu, rex_t rex, uintptr_t addr);
 uintptr_t RunDF(x64emu_t *emu, rex_t rex, uintptr_t addr);
 uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr);
-uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr);
+uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step);
 uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr);
 
 void x64Syscall(x64emu_t *emu);
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index db2500cd..18eea952 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -22,7 +22,7 @@
 

 #include "modrm.h"

 

-uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr)

+uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)

 {

     uint8_t opcode;

     uint8_t nextop;

@@ -257,7 +257,7 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr)
     GOCOND(0x80

         , tmp32s = F32S; CHECK_FLAGS(emu);

         , addr += tmp32s;

-        ,

+        ,,STEP3

     )                               /* 0x80 -> 0x8F Jxx */

         

     case 0xC2:  /* CMPSD Gx, Ex, Ib */