diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-01-06 21:46:53 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-01-06 21:46:53 +0100 |
| commit | e249a33d3e038f0e3c17f2f6c3eb5b8d7a21a2c3 (patch) | |
| tree | 28af59c430d5ab734c62d13fbb7f6a0b412e7065 /src | |
| parent | 5f03d1b90507e52020b00a2833c6074a7dbf9c9f (diff) | |
| download | box64-e249a33d3e038f0e3c17f2f6c3eb5b8d7a21a2c3.tar.gz box64-e249a33d3e038f0e3c17f2f6c3eb5b8d7a21a2c3.zip | |
Fixed (F0) 0F C7 opcode, only /1 is CMPXCHG(8/16)B
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run0f.c | 54 | ||||
| -rw-r--r-- | src/emu/x64runf0.c | 114 |
2 files changed, 90 insertions, 78 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index 977e6c73..e934c6c2 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -1221,30 +1221,36 @@ int Run0F(x64emu_t *emu, rex_t rex) CHECK_FLAGS(emu); nextop = F8; GETED(0); - if(rex.w) { - tmp64u = ED->q[0]; - tmp64u2= ED->q[1]; - if(R_RAX == tmp64u && R_RDX == tmp64u2) { - SET_FLAG(F_ZF); - ED->q[0] = R_EBX; - ED->q[1] = R_ECX; - } else { - CLEAR_FLAG(F_ZF); - R_RAX = tmp64u; - R_RDX = tmp64u2; - } - } else { - tmp32u = ED->dword[0]; - tmp32u2= ED->dword[1]; - if(R_EAX == tmp32u && R_EDX == tmp32u2) { - SET_FLAG(F_ZF); - ED->dword[0] = R_EBX; - ED->dword[1] = R_ECX; - } else { - CLEAR_FLAG(F_ZF); - R_RAX = tmp32u; - R_RDX = tmp32u2; - } + switch((nextop>>3)&7) { + case 1: + if(rex.w) { + tmp64u = ED->q[0]; + tmp64u2= ED->q[1]; + if(R_RAX == tmp64u && R_RDX == tmp64u2) { + SET_FLAG(F_ZF); + ED->q[0] = R_EBX; + ED->q[1] = R_ECX; + } else { + CLEAR_FLAG(F_ZF); + R_RAX = tmp64u; + R_RDX = tmp64u2; + } + } else { + tmp32u = ED->dword[0]; + tmp32u2= ED->dword[1]; + if(R_EAX == tmp32u && R_EDX == tmp32u2) { + SET_FLAG(F_ZF); + ED->dword[0] = R_EBX; + ED->dword[1] = R_ECX; + } else { + CLEAR_FLAG(F_ZF); + R_RAX = tmp32u; + R_RDX = tmp32u2; + } + } + break; + default: + return 1; } break; case 0xC8: diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index f3c0fb10..041c147a 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -634,66 +634,72 @@ int RunF0(x64emu_t *emu, rex_t rex) break; case 0xC7: /* CMPXCHG8B Gq */ - CHECK_FLAGS(emu); nextop = F8; GETED(0); - GETGD; + switch((nextop>>3)&7) { + case 1: + CHECK_FLAGS(emu); + GETGD; #ifdef DYNAREC - if(rex.w) - do { - arm64_lock_read_dq(&tmp64u, &tmp64u2, ED); - if(R_RAX == tmp64u && R_RDX == tmp64u2) { - SET_FLAG(F_ZF); - tmp32s = arm64_lock_write_dq(R_RBX, R_RCX, ED); - } else { - CLEAR_FLAG(F_ZF); - R_RAX = tmp64u; - R_RDX = tmp64u2; - tmp32s = 0; - } - } while(tmp32s); - else - do { - tmp64u = arm64_lock_read_dd(ED); - if((R_EAX == (tmp64u&0xffffffff)) && (R_EDX == ((tmp64u>>32)&0xffffffff))) { - SET_FLAG(F_ZF); - tmp32s = arm64_lock_write_dd(ED, R_EBX|(((uint64_t)R_ECX)<<32)); + if(rex.w) + do { + arm64_lock_read_dq(&tmp64u, &tmp64u2, ED); + if(R_RAX == tmp64u && R_RDX == tmp64u2) { + SET_FLAG(F_ZF); + tmp32s = arm64_lock_write_dq(R_RBX, R_RCX, ED); + } else { + CLEAR_FLAG(F_ZF); + R_RAX = tmp64u; + R_RDX = tmp64u2; + tmp32s = 0; + } + } while(tmp32s); + else + do { + tmp64u = arm64_lock_read_dd(ED); + if((R_EAX == (tmp64u&0xffffffff)) && (R_EDX == ((tmp64u>>32)&0xffffffff))) { + SET_FLAG(F_ZF); + tmp32s = arm64_lock_write_dd(ED, R_EBX|(((uint64_t)R_ECX)<<32)); + } else { + CLEAR_FLAG(F_ZF); + R_RAX = tmp64u&0xffffffff; + R_RDX = (tmp64u>>32)&0xffffffff; + tmp32s = 0; + } + } while(tmp32s); +#else + pthread_mutex_lock(&emu->context->mutex_lock); + if(rex.w) { + tmp64u = ED->q[0]; + tmp64u2= ED->q[1]; + if(R_RAX == tmp64u && R_RDX == tmp64u2) { + SET_FLAG(F_ZF); + ED->q[0] = R_RBX; + ED->q[1] = R_RCX; + } else { + CLEAR_FLAG(F_ZF); + R_RAX = tmp64u; + R_RDX = tmp64u2; + } } else { - CLEAR_FLAG(F_ZF); - R_RAX = tmp64u&0xffffffff; - R_RDX = (tmp64u>>32)&0xffffffff; - tmp32s = 0; + tmp32u = ED->dword[0]; + tmp32u2= ED->dword[1]; + if(R_EAX == tmp32u && R_EDX == tmp32u2) { + SET_FLAG(F_ZF); + ED->dword[0] = R_EBX; + ED->dword[1] = R_ECX; + } else { + CLEAR_FLAG(F_ZF); + R_RAX = tmp32u; + R_RDX = tmp32u2; + } } - } while(tmp32s); -#else - pthread_mutex_lock(&emu->context->mutex_lock); - if(rex.w) { - tmp64u = ED->q[0]; - tmp64u2= ED->q[1]; - if(R_RAX == tmp64u && R_RDX == tmp64u2) { - SET_FLAG(F_ZF); - ED->q[0] = R_RBX; - ED->q[1] = R_RCX; - } else { - CLEAR_FLAG(F_ZF); - R_RAX = tmp64u; - R_RDX = tmp64u2; - } - } else { - tmp32u = ED->dword[0]; - tmp32u2= ED->dword[1]; - if(R_EAX == tmp32u && R_EDX == tmp32u2) { - SET_FLAG(F_ZF); - ED->dword[0] = R_EBX; - ED->dword[1] = R_ECX; - } else { - CLEAR_FLAG(F_ZF); - R_RAX = tmp32u; - R_RDX = tmp32u2; - } - } - pthread_mutex_unlock(&emu->context->mutex_lock); + pthread_mutex_unlock(&emu->context->mutex_lock); #endif + break; + default: + return 1; + } break; default: |