diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-07-04 08:07:53 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-07-04 08:07:53 +0200 |
| commit | 0f3884afde958d644cead9d5adea0c145191f8e4 (patch) | |
| tree | ce9524d8c519ac5fe8d8c3186ffa5d4526d565e3 /src | |
| parent | 7b3d4c6359b9ed8356e3765c93b01d58f60042ba (diff) | |
| download | box64-0f3884afde958d644cead9d5adea0c145191f8e4.tar.gz box64-0f3884afde958d644cead9d5adea0c145191f8e4.zip | |
Fixed 64 F2 0F 10 and 64 66 0F 2E opcodes (for #298)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run64.c | 30 | ||||
| -rw-r--r-- | src/emu/x64run6664.c | 20 |
2 files changed, 24 insertions, 26 deletions
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index 3413fc81..ad637ce2 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -49,6 +49,10 @@ int Run64(x64emu_t *emu, rex_t rex, int seg) rep = opcode-0xF1; opcode = F8; } + while(opcode>=0x40 && opcode<=0x4f) { + rex.rex = opcode; + opcode = F8; + } switch(opcode) { #define GO(B, OP) \ @@ -173,32 +177,6 @@ int Run64(x64emu_t *emu, rex_t rex, int seg) } break; - case 0x2E: /* UCOMISD Gx, Ex */ - // no special check... - case 0x2F: /* COMISD Gx, Ex */ - switch(rep) { - case 0: - RESET_FLAGS(emu); - nextop = F8; - GETEX_OFFS(0, tlsdata); - GETGX; - if(isnan(GX->d[0]) || isnan(EX->d[0])) { - SET_FLAG(F_ZF); SET_FLAG(F_PF); SET_FLAG(F_CF); - } else if(isgreater(GX->d[0], EX->d[0])) { - CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF); - } else if(isless(GX->d[0], EX->d[0])) { - CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); SET_FLAG(F_CF); - } else { - SET_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF); - } - CLEAR_FLAG(F_OF); CLEAR_FLAG(F_AF); CLEAR_FLAG(F_SF); - break; - default: - return 1; - } - break; - - case 0x59: switch(rep) { case 2: /* MULSS Gx, Ex */ diff --git a/src/emu/x64run6664.c b/src/emu/x64run6664.c index 14c59677..3b564517 100644 --- a/src/emu/x64run6664.c +++ b/src/emu/x64run6664.c @@ -52,6 +52,26 @@ int Run6664(x64emu_t *emu, rex_t rex) EX->q[1] = 0; break; + case 0x2E: /* UCOMISD Gx, Ex */ + // no special check... + case 0x2F: /* COMISD Gx, Ex */ + RESET_FLAGS(emu); + nextop = F8; + GETEX_OFFS(0, tlsdata); + GETGX; + if(isnan(GX->d[0]) || isnan(EX->d[0])) { + SET_FLAG(F_ZF); SET_FLAG(F_PF); SET_FLAG(F_CF); + } else if(isgreater(GX->d[0], EX->d[0])) { + CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF); + } else if(isless(GX->d[0], EX->d[0])) { + CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_PF); SET_FLAG(F_CF); + } else { + SET_FLAG(F_ZF); CLEAR_FLAG(F_PF); CLEAR_FLAG(F_CF); + } + CLEAR_FLAG(F_OF); CLEAR_FLAG(F_AF); CLEAR_FLAG(F_SF); + break; + break; + default: return 1; } |