diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 12:03:19 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 12:03:19 +0100 |
| commit | afe97d4815329d0b0f0310810cab9be053e0ef52 (patch) | |
| tree | e90ffae0c735c6f206933f58c82364d3f1fe233c /src | |
| parent | dfb5fc6a883e0be4f82d183ef1460f1fde34ff4c (diff) | |
| download | box64-afe97d4815329d0b0f0310810cab9be053e0ef52.tar.gz box64-afe97d4815329d0b0f0310810cab9be053e0ef52.zip | |
Added F0 REX 81/83 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64runf0.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index cb44bf19..72b1fc9e 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -32,6 +32,7 @@ int RunF0(x64emu_t *emu, rex_t rex) uint8_t opcode; uint8_t nextop; uint32_t tmp32u; + int64_t tmp64s; uint64_t tmp64u; reg64_t *oped, *opgd; @@ -140,6 +141,55 @@ int RunF0(x64emu_t *emu, rex_t rex) } break; + case 0x81: /* GRP Ed,Id */ + case 0x83: /* GRP Ed,Ib */ + nextop = F8; + GETED; + if(opcode==0x83) { + tmp64s = F8S; + tmp64u = (uint64_t)tmp64s; + } else + tmp64u = F32S64; +#ifdef DYNAREC + switch((nextop>>3)&7) { + case 0: do { tmp32u2 = arm_lock_read_d(ED);} while(arm_lock_write_d(ED, add32(emu, tmp32u2, tmp32u))); break; + case 1: do { tmp32u2 = arm_lock_read_d(ED);} while(arm_lock_write_d(ED, or32(emu, tmp32u2, tmp32u))); break; + case 2: do { tmp32u2 = arm_lock_read_d(ED);} while(arm_lock_write_d(ED, adc32(emu, tmp32u2, tmp32u))); break; + case 3: do { tmp32u2 = arm_lock_read_d(ED);} while(arm_lock_write_d(ED, sbb32(emu, tmp32u2, tmp32u))); break; + case 4: do { tmp32u2 = arm_lock_read_d(ED);} while(arm_lock_write_d(ED, and32(emu, tmp32u2, tmp32u))); break; + case 5: do { tmp32u2 = arm_lock_read_d(ED);} while(arm_lock_write_d(ED, sub32(emu, tmp32u2, tmp32u))); break; + case 6: do { tmp32u2 = arm_lock_read_d(ED);} while(arm_lock_write_d(ED, xor32(emu, tmp32u2, tmp32u))); break; + case 7: cmp32(emu, ED->dword[0], tmp32u); break; + } +#else + pthread_mutex_lock(&emu->context->mutex_lock); + if(rex.w) { + switch((nextop>>3)&7) { + case 0: ED->q[0] = add64(emu, ED->q[0], tmp64u); break; + case 1: ED->q[0] = or64(emu, ED->q[0], tmp64u); break; + case 2: ED->q[0] = adc64(emu, ED->q[0], tmp64u); break; + case 3: ED->q[0] = sbb64(emu, ED->q[0], tmp64u); break; + case 4: ED->q[0] = and64(emu, ED->q[0], tmp64u); break; + case 5: ED->q[0] = sub64(emu, ED->q[0], tmp64u); break; + case 6: ED->q[0] = xor64(emu, ED->q[0], tmp64u); break; + case 7: cmp64(emu, ED->q[0], tmp64u); break; + } + } else { + switch((nextop>>3)&7) { + case 0: ED->dword[0] = add32(emu, ED->dword[0], tmp64u&0xffffffff); break; + case 1: ED->dword[0] = or32(emu, ED->dword[0], tmp64u&0xffffffff); break; + case 2: ED->dword[0] = adc32(emu, ED->dword[0], tmp64u&0xffffffff); break; + case 3: ED->dword[0] = sbb32(emu, ED->dword[0], tmp64u&0xffffffff); break; + case 4: ED->dword[0] = and32(emu, ED->dword[0], tmp64u&0xffffffff); break; + case 5: ED->dword[0] = sub32(emu, ED->dword[0], tmp64u&0xffffffff); break; + case 6: ED->dword[0] = xor32(emu, ED->dword[0], tmp64u&0xffffffff); break; + case 7: cmp32(emu, ED->dword[0], tmp64u&0xffffffff); break; + } + } + pthread_mutex_unlock(&emu->context->mutex_lock); +#endif + break; + default: return 1; } |