about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-31 21:00:15 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-03-31 21:00:15 +0200
commitb24f2f14f0ce716d1341b521978737cf8a327179 (patch)
tree90ed59608a78fc11571bbaed4cccd5dcc613563a /src/emu
parent40a1fab5e06011f3299676a1d61e7fb98819a6a0 (diff)
downloadbox64-b24f2f14f0ce716d1341b521978737cf8a327179.tar.gz
box64-b24f2f14f0ce716d1341b521978737cf8a327179.zip
[DYNAREC] More improvement to TEST_DYNAREC
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/modrm.h2
-rwxr-xr-xsrc/emu/x64emu_private.h1
-rw-r--r--src/emu/x64run0f.c2
-rwxr-xr-xsrc/emu/x64run_private.c15
-rwxr-xr-xsrc/emu/x64run_private.h1
-rw-r--r--src/emu/x64runf0.c2
-rw-r--r--src/emu/x64test.c28
7 files changed, 41 insertions, 10 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index 3a4b47ac..21ba6d3c 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -23,6 +23,7 @@
 #define GETE4(D)            oped=TestEd4(test, &addr, rex, nextop, D)

 #define GETE8(D)            oped=TestEd8(test, &addr, rex, nextop, D)

 #define GETET(D)            oped=TestEdt(test, &addr, rex, nextop, D)

+#define GETE8xw(D)          oped=TestEd8xw(test, rex.w, &addr, rex, nextop, D)

 #define GETED32(D)          oped=TestEd32O(test, &addr, rex, nextop, D, 0)

 #define GETED_OFFS(D, O)    oped=TestEdO(test, &addr, rex, nextop, D, O)

 #define GETGD               opgd=GetGd(test->emu, &addr, rex, nextop)

@@ -46,6 +47,7 @@
 #define GETE4(D)            GETED(D)

 #define GETE8(D)            GETED(D)

 #define GETET(D)            GETED(D)

+#define GETE8xw(D)          GETED(D)

 #define GETED32(D)          oped=GetEd32O(emu, &addr, rex, nextop, D, 0)

 #define GETED_OFFS(D, O)    oped=GetEdO(emu, &addr, rex, nextop, D, O)

 #define GETGD               opgd=GetGd(emu, &addr, rex, nextop)

diff --git a/src/emu/x64emu_private.h b/src/emu/x64emu_private.h
index 3fb43df3..a398d34e 100755
--- a/src/emu/x64emu_private.h
+++ b/src/emu/x64emu_private.h
@@ -32,6 +32,7 @@ typedef struct x64test_s {
     uintptr_t   memaddr;
     int         memsize;
     int         test;
+    int         clean;
     uint8_t     mem[16];
 } x64test_t;
 
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 745f57f4..57402351 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -150,7 +150,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
             break;

         case 0x18:                       /* PREFETCHh Ed */

             nextop = F8;

-            GETED(0);

+            _GETED(0);

             if(MODREG) {

             } else

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

diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 664fb3c5..9f8457c2 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1342,6 +1342,21 @@ reg64_t* TestEdt(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
         return (reg64_t*)test->mem;
     }
 }
+reg64_t* TestEd8xw(x64test_t *test, int w, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta)
+{
+    uint8_t m = v&0xC7;    // filter Ed
+    if(m>=0xC0) {
+         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+    } else {
+        reg64_t* ret =  GetECommon(test->emu, addr, rex, m, delta);
+        test->memsize = 8<<w;
+        test->memaddr = (uintptr_t)ret;
+        *(uint64_t*)test->mem = ret->q[0];
+        if(w)
+            ((uint64_t*)test->mem)[1] = ret->q[1];
+        return (reg64_t*)test->mem;
+    }
+}
 
 uintptr_t GetEA(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta)
 {
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index b31a522d..d43ea331 100755
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -50,6 +50,7 @@ reg64_t* GetEd(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t del
 reg64_t* TestEd(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 reg64_t* TestEd4(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 reg64_t* TestEd8(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
+reg64_t* TestEd8xw(x64test_t *test, int w, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 reg64_t* TestEdt(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 uintptr_t GetEA(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 reg64_t* GetEdO(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset);
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index 03f5125e..6d58670a 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -683,7 +683,7 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
 

                 case 0xC7:                      /* CMPXCHG8B Gq */

                     nextop = F8;

-                    GETED(0);

+                    GETE8xw(0);

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

                         case 1:

                             CHECK_FLAGS(emu);

diff --git a/src/emu/x64test.c b/src/emu/x64test.c
index 4b48a9ad..525b96c9 100644
--- a/src/emu/x64test.c
+++ b/src/emu/x64test.c
@@ -24,7 +24,12 @@
 
 void print_banner(x64emu_t* ref)
 {
-    printf_log(LOG_NONE, "Warning, difference between Interpreter and Dynarec in %p\n=======================================\n", (void*)ref->old_ip);
+    printf_log(LOG_NONE, "Warning, difference between Interpreter and Dynarec in %p (%02x %02x %02x %02x %02x %02x %02x %02x)\n"\
+        "=======================================\n", 
+        (void*)ref->old_ip, 
+        ((uint8_t*)ref->old_ip)[0], ((uint8_t*)ref->old_ip)[1], ((uint8_t*)ref->old_ip)[2], ((uint8_t*)ref->old_ip)[3],
+        ((uint8_t*)ref->old_ip)[4], ((uint8_t*)ref->old_ip)[5], ((uint8_t*)ref->old_ip)[6], ((uint8_t*)ref->old_ip)[7]
+    );
     printf_log(LOG_NONE, "DIFF: Dynarec |  Interpreter\n----------------------\n");
 }
 #define BANNER if(!banner) {banner=1; print_banner(ref);}
@@ -129,20 +134,27 @@ void x64test_check(x64emu_t* ref, uintptr_t ip)
 void x64test_init(x64emu_t* ref, uintptr_t ip)
 {
     x64test_t* test = &ref->test;
+    if(!test->test) {
+        test->clean = 0;
+        return;
+    }
     // check if test as a valid emu struct
     if(!test->emu) {
         test->emu = NewX64Emu(my_context, ip, (uintptr_t)ref->init_stack, ref->size_stack, 0);
         CopyEmu(test->emu, ref);
-    } else if(test->test) {
-        x64test_check(ref, ip);
-    }
-    // check if IP is same, else, sync
-    if(ip != test->emu->ip.q[0] || !test->test) {
-        CopyEmu(test->emu, ref);
+    } else {
+        // check if IP is same, else, sync
+        uintptr_t prev_ip = test->emu->ip.q[0];
+        if(test->clean)
+            x64test_check(ref, ip);
+        if(ip != prev_ip || !test->test) {
+            CopyEmu(test->emu, ref);
+        }
     }
     // Do a Dry single Step
     test->memsize = 0;
-    test->test = 1;
+    test->clean = 1;
     ref->old_ip = ip;
     RunTest(test);
+    // this will be anakyzed next step
 }