diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-10-13 03:02:42 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-12 21:02:42 +0200 |
| commit | 256632ea4c21bbadc2131cfb65aaebfde4af3215 (patch) | |
| tree | d4377a62860c01a12d85b7fe23933964c9d18f84 /src | |
| parent | f5eff13acc27b11bf9a7078cce6372a051a39689 (diff) | |
| download | box64-256632ea4c21bbadc2131cfb65aaebfde4af3215.tar.gz box64-256632ea4c21bbadc2131cfb65aaebfde4af3215.zip | |
[INTERP] Improved cosim handling on 16bit BT/BTS/BTR/BTC opcodes (#3063)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run660f.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index 8b801b92..24838805 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -1799,7 +1799,15 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) tmp32s >>= (rex.w?6:4); if(!MODREG) { + #ifdef TEST_INTERPRETER + test->memaddr=((test->memaddr)+(tmp32s<<(rex.w?3:1))); + if(rex.w) + *(uint64_t*)test->mem = *(uint64_t*)test->memaddr; + else + *(uint16_t*)test->mem = *(uint16_t*)test->memaddr; + #else EW=(reg64_t*)(((uintptr_t)(EW))+(tmp32s<<(rex.w?3:1))); + #endif } if(rex.w) { if(EW->q[0] & (1LL<<tmp8u)) @@ -1838,7 +1846,15 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) tmp32s >>= (rex.w?6:4); if(!MODREG) { + #ifdef TEST_INTERPRETER + test->memaddr=((test->memaddr)+(tmp32s<<(rex.w?3:1))); + if(rex.w) + *(uint64_t*)test->mem = *(uint64_t*)test->memaddr; + else + *(uint16_t*)test->mem = *(uint16_t*)test->memaddr; + #else EW=(reg64_t*)(((uintptr_t)(EW))+(tmp32s<<(rex.w?3:1))); + #endif } if(rex.w) { if(EW->q[0] & (1LL<<tmp8u)) @@ -2080,12 +2096,20 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) nextop = F8; GETEW(0); GETGW; - tmp64s = rex.w?GW->sq[0]:GW->sword[0]; - tmp8u=tmp64s&(rex.w?63:15); - tmp64s >>= (rex.w?6:4); + tmp32s = rex.w?GW->sdword[0]:GW->sword[0]; + tmp8u=tmp32s&(rex.w?63:15); + tmp32s >>= (rex.w?6:4); if(!MODREG) { - EW=(reg64_t*)(((uintptr_t)(EW))+(tmp64s<<(rex.w?3:1))); + #ifdef TEST_INTERPRETER + test->memaddr=((test->memaddr)+(tmp32s<<(rex.w?3:1))); + if(rex.w) + *(uint64_t*)test->mem = *(uint64_t*)test->memaddr; + else + *(uint16_t*)test->mem = *(uint16_t*)test->memaddr; + #else + EW=(reg64_t*)(((uintptr_t)(EW))+(tmp32s<<(rex.w?3:1))); + #endif } if(rex.w) { if(EW->q[0] & (1LL<<tmp8u)) |