diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-25 15:06:48 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-25 15:06:48 +0100 |
| commit | 3c07dd58eb9974e6c2fb70cb1f51b5116451a9d7 (patch) | |
| tree | 553edf79c66a1b62577be19c372d65bd051ee699 /src/emu | |
| parent | fcdd8fc383cace94ce970bd8af2385ab77d24def (diff) | |
| download | box64-3c07dd58eb9974e6c2fb70cb1f51b5116451a9d7.tar.gz box64-3c07dd58eb9974e6c2fb70cb1f51b5116451a9d7.zip | |
Added F3 0F BC opcode ([DYNAREC] too)
Diffstat (limited to 'src/emu')
| -rw-r--r-- | src/emu/x64runf30f.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c index f18aa951..aa3c9d76 100644 --- a/src/emu/x64runf30f.c +++ b/src/emu/x64runf30f.c @@ -28,6 +28,8 @@ int RunF30F(x64emu_t *emu, rex_t rex) uint8_t nextop; int8_t tmp8s; uint8_t tmp8u; + uint32_t tmp32u; + uint64_t tmp64u; reg64_t *oped, *opgd; sse_regs_t *opex, *opgx, eax1; mmx87_regs_t *opem; @@ -236,6 +238,42 @@ int RunF30F(x64emu_t *emu, rex_t rex) memcpy(EX, GX, 16); // unaligned... break; + case 0xBC: /* TZCNT Ed,Gd */ + CHECK_FLAGS(emu); + nextop = F8; + GETED(0); + GETGD; + if(rex.w) { + tmp64u = ED->q[0]; + if(tmp64u) { + CLEAR_FLAG(F_ZF); + tmp8u = 0; + while(!(tmp64u&(1LL<<tmp8u))) ++tmp8u; + GD->q[0] = tmp8u; + CONDITIONAL_SET_FLAG(tmp8u==0, F_ZF); + CLEAR_FLAG(F_CF); + } else { + CLEAR_FLAG(F_ZF); + SET_FLAG(F_CF); + GD->q[0] = 64; + } + } else { + tmp32u = ED->dword[0]; + if(tmp32u) { + CLEAR_FLAG(F_ZF); + tmp8u = 0; + while(!(tmp32u&(1<<tmp8u))) ++tmp8u; + GD->dword[0] = tmp8u; + CONDITIONAL_SET_FLAG(tmp8u==0, F_ZF); + CLEAR_FLAG(F_CF); + } else { + CLEAR_FLAG(F_ZF); + SET_FLAG(F_CF); + GD->dword[0] = 32; + } + } + break; + case 0xC2: /* CMPSS Gx, Ex, Ib */ nextop = F8; GETEX(1); |