From b24f2f14f0ce716d1341b521978737cf8a327179 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 31 Mar 2023 21:00:15 +0200 Subject: [DYNAREC] More improvement to TEST_DYNAREC --- src/emu/modrm.h | 2 ++ src/emu/x64emu_private.h | 1 + src/emu/x64run0f.c | 2 +- src/emu/x64run_private.c | 15 +++++++++++++++ src/emu/x64run_private.h | 1 + src/emu/x64runf0.c | 2 +- src/emu/x64test.c | 28 ++++++++++++++++++++-------- 7 files changed, 41 insertions(+), 10 deletions(-) (limited to 'src/emu') 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<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 } -- cgit 1.4.1