about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-01-27 16:53:57 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-01-27 16:53:57 +0100
commit7cee4e2453747777f6f42b52f81d102d79221caf (patch)
tree4ee31871776ff017db5654492adaa52a87064612 /src
parent82f21de83e1e8f09b4d8308a6cc58e4551d2657f (diff)
downloadbox64-7cee4e2453747777f6f42b52f81d102d79221caf.tar.gz
box64-7cee4e2453747777f6f42b52f81d102d79221caf.zip
[TEST_DYNAREC] Improved accuracy of some tests, and avoid a some false-positive
Diffstat (limited to 'src')
-rw-r--r--src/emu/modrm.h1
-rw-r--r--src/emu/x64primop.c8
-rw-r--r--src/emu/x64run.c8
-rw-r--r--src/emu/x64run_private.c28
-rw-r--r--src/emu/x64test.c4
5 files changed, 26 insertions, 23 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index 3d29747f..72c17f0a 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -85,6 +85,7 @@
 #define GETEA32(D)          GetEA32(emu, &addr, rex, nextop, D)

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

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

+#define _GETEB(D)           oped=GetEb(emu, &addr, rex, nextop, D)

 

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

 

diff --git a/src/emu/x64primop.c b/src/emu/x64primop.c
index a914eb05..2e9c555b 100644
--- a/src/emu/x64primop.c
+++ b/src/emu/x64primop.c
@@ -1252,7 +1252,7 @@ void test8(x64emu_t *emu, uint8_t d, uint8_t s)
 	CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
 	CONDITIONAL_SET_FLAG(res == 0, F_ZF);
 	CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
-    /* AF == dont care */
+    CLEAR_FLAG(F_AF);	/* AF == dont care */
 	CLEAR_FLAG(F_CF);
 }
 
@@ -1267,7 +1267,7 @@ void test16(x64emu_t *emu, uint16_t d, uint16_t s)
 	CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
 	CONDITIONAL_SET_FLAG(res == 0, F_ZF);
 	CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
-	/* AF == dont care */
+	CLEAR_FLAG(F_AF);	/* AF == dont care */
 	CLEAR_FLAG(F_CF);
 }
 
@@ -1282,7 +1282,7 @@ void test32(x64emu_t *emu, uint32_t d, uint32_t s)
 	CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
 	CONDITIONAL_SET_FLAG(res == 0, F_ZF);
 	CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
-	/* AF == dont care */
+	CLEAR_FLAG(F_AF);	/* AF == dont care */
 	CLEAR_FLAG(F_CF);
 }
 
@@ -1297,7 +1297,7 @@ void test64(x64emu_t *emu, uint64_t d, uint64_t s)
 	CONDITIONAL_SET_FLAG(res & 0x8000000000000000LL, F_SF);
 	CONDITIONAL_SET_FLAG(res == 0, F_ZF);
 	CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
-	/* AF == dont care */
+	CLEAR_FLAG(F_AF);	/* AF == dont care */
 	CLEAR_FLAG(F_CF);
 }
 
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 82973d33..938f60b2 100644
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -66,7 +66,9 @@ int Run(x64emu_t *emu, int step)
     printf_log(LOG_DEBUG, "Run X86 (%p), RIP=%p, Stack=%p is32bits=%d\n", emu, (void*)addr, (void*)R_RSP, is32bits);
 
 x64emurun:
-#ifndef TEST_INTERPRETER
+#ifdef TEST_INTERPRETER
+    test->memsize = 0;
+#else
     while(1) 
 #endif
     {
@@ -746,13 +748,13 @@ x64emurun:
             break;
         case 0x8A:                      /* MOV Gb,Eb */
             nextop = F8;
-            GETEB(0);
+            _GETEB(0);
             GETGB;
             GB = EB->byte[0];
             break;
         case 0x8B:                      /* MOV Gd,Ed */
             nextop = F8;
-            GETED(0);
+            _GETED(0);
             GETGD;
             if(rex.w)
                 GD->q[0] = ED->q[0];
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index cb798e12..3e0e18da 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1611,7 +1611,7 @@ reg64_t* TestEd(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+        return &test->emu->regs[(m&0x07)+(rex.b<<3)];
     } else {
         reg64_t* ret =  GetECommon(test->emu, addr, rex, m, delta);
         test->memsize = 4<<rex.w;
@@ -1627,7 +1627,7 @@ reg64_t* TestEd4(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+        return &test->emu->regs[(m&0x07)+(rex.b<<3)];
     } else {
         reg64_t* ret =  GetECommon(test->emu, addr, rex, m, delta);
         test->memsize = 4;
@@ -1640,7 +1640,7 @@ reg64_t* TestEd8(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+        return &test->emu->regs[(m&0x07)+(rex.b<<3)];
     } else {
         reg64_t* ret =  GetECommon(test->emu, addr, rex, m, delta);
         test->memsize = 8;
@@ -1653,7 +1653,7 @@ reg64_t* TestEdt(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+        return &test->emu->regs[(m&0x07)+(rex.b<<3)];
     } else {
         reg64_t* ret =  GetECommon(test->emu, addr, rex, m, delta);
         test->memsize = 4;
@@ -1666,7 +1666,7 @@ reg64_t* TestEd8xw(x64test_t *test, int w, uintptr_t* addr, rex_t rex, uint8_t v
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+        return &test->emu->regs[(m&0x07)+(rex.b<<3)];
     } else {
         reg64_t* ret =  GetECommon(test->emu, addr, rex, m, delta);
         test->memsize = 8<<w;
@@ -1706,7 +1706,7 @@ reg64_t* TestEdO(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+        return &test->emu->regs[(m&0x07)+(rex.b<<3)];
     } else {
         reg64_t* ret =  GetECommonO(test->emu, addr, rex, m, delta, offset);
         test->memsize = 4<<rex.w;
@@ -1731,7 +1731,7 @@ reg64_t* TestEd32O(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->regs[(m&0x07)+(rex.b<<3)];
+        return &test->emu->regs[(m&0x07)+(rex.b<<3)];
     } else {
         reg64_t* ret =  GetECommon32O(test->emu, addr, rex, m, delta, offset);
         test->memsize = 4<<rex.w;
@@ -1815,7 +1815,7 @@ reg64_t* TestEw16(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v)
 
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &emu->regs[(m&0x07)];
+        return &emu->regs[(m&0x07)];
     } else {
         uintptr_t base = 0;
         switch(m&7) {
@@ -1877,7 +1877,7 @@ reg64_t* TestEw16off(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uin
 
     uint32_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &emu->regs[(m&0x07)];
+        return &emu->regs[(m&0x07)];
     } else {
         uint32_t base = 0;
         switch(m&7) {
@@ -1915,7 +1915,7 @@ mmx87_regs_t* TestEm(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uin
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->mmx[m&0x07];
+        return &test->emu->mmx[m&0x07];
     } else {
         mmx87_regs_t* ret = (mmx87_regs_t*)GetECommon(test->emu, addr, rex, m, delta);
         test->memsize = 8;
@@ -1938,7 +1938,7 @@ sse_regs_t* TestEx(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
         test->memsize=0;
-         return &test->emu->xmm[(m&0x07)+(rex.b<<3)];
+        return &test->emu->xmm[(m&0x07)+(rex.b<<3)];
     } else {
         sse_regs_t* ret = (sse_regs_t*)GetECommon(test->emu, addr, rex, m, delta);
         test->memsize = 16;
@@ -1961,7 +1961,7 @@ sse_regs_t* TestExO(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->xmm[(m&0x07)+(rex.b<<3)];
+        return &test->emu->xmm[(m&0x07)+(rex.b<<3)];
     } else {
         sse_regs_t* ret = (sse_regs_t*)GetECommonO(test->emu, addr, rex, m, delta, offset);
         test->memsize = 16;
@@ -1984,7 +1984,7 @@ sse_regs_t* TestEx32O(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, ui
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->xmm[(m&0x07)+(rex.b<<3)];
+        return &test->emu->xmm[(m&0x07)+(rex.b<<3)];
     } else {
         sse_regs_t* ret = (sse_regs_t*)GetECommon32O(test->emu, addr, rex, m, delta, offset);
         test->memsize = 16;
@@ -2007,7 +2007,7 @@ mmx87_regs_t* TestEm32O(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v,
 {
     uint8_t m = v&0xC7;    // filter Ed
     if(m>=0xC0) {
-         return &test->emu->mmx[(m&0x07)];
+        return &test->emu->mmx[(m&0x07)];
     } else {
         mmx87_regs_t* ret = (mmx87_regs_t*)GetECommon32O(test->emu, addr, rex, m, delta, offset);
         test->memsize = 8;
diff --git a/src/emu/x64test.c b/src/emu/x64test.c
index 94bdd559..f1294466 100644
--- a/src/emu/x64test.c
+++ b/src/emu/x64test.c
@@ -119,10 +119,10 @@ void x64test_check(x64emu_t* ref, uintptr_t ip)
             BANNER;
             printf_log(LOG_NONE, "MEM: @%p :", (void*)test->memaddr);
             for(int i=0; i<test->memsize; ++i)
-                printf_log(LOG_NONE, " %02x", test->mem[i]);
+                printf_log(LOG_NONE, " %02x", ((uint8_t*)test->memaddr)[i]);
             printf_log(LOG_NONE, " |");
             for(int i=0; i<test->memsize; ++i)
-                printf_log(LOG_NONE, " %02x", ((uint8_t*)test->memaddr)[i]);
+                printf_log(LOG_NONE, " %02x", test->mem[i]);
             printf_log(LOG_NONE, "\n");
         }
     }