diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-01-27 16:53:57 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-01-27 16:53:57 +0100 |
| commit | 7cee4e2453747777f6f42b52f81d102d79221caf (patch) | |
| tree | 4ee31871776ff017db5654492adaa52a87064612 /src | |
| parent | 82f21de83e1e8f09b4d8308a6cc58e4551d2657f (diff) | |
| download | box64-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.h | 1 | ||||
| -rw-r--r-- | src/emu/x64primop.c | 8 | ||||
| -rw-r--r-- | src/emu/x64run.c | 8 | ||||
| -rw-r--r-- | src/emu/x64run_private.c | 28 | ||||
| -rw-r--r-- | src/emu/x64test.c | 4 |
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"); } } |