diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-02 01:30:45 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-01 19:30:45 +0200 |
| commit | 4c30838448b74ea34e51dd684c5753fb388f212f (patch) | |
| tree | d83a7c9211a3383a4df120d1b28f91531dadd3e0 | |
| parent | ded60bbabd75ae453ffb608134f0d4180148a959 (diff) | |
| download | box64-4c30838448b74ea34e51dd684c5753fb388f212f.tar.gz box64-4c30838448b74ea34e51dd684c5753fb388f212f.zip | |
[INTERP] Fixed 16bit version POPCNT (#2877)
| -rw-r--r-- | src/emu/x64run66f30f.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/src/emu/x64run66f30f.c b/src/emu/x64run66f30f.c index 00cd6cca..f8dc5de9 100644 --- a/src/emu/x64run66f30f.c +++ b/src/emu/x64run66f30f.c @@ -55,7 +55,24 @@ uintptr_t Run66F30F(x64emu_t *emu, rex_t rex, uintptr_t addr) switch(opcode) { - case 0xBC: /* TZCNT Ed,Gd */ + case 0xB8: /* POPCNT Gw,Ew */ + nextop = F8; + GETEW(0); + GETGW; + if(rex.w) + GD->q[0] = __builtin_popcountl(ED->q[0]); + else + GD->word[0] = __builtin_popcount(ED->word[0]); + RESET_FLAGS(emu); + CLEAR_FLAG(F_OF); + CLEAR_FLAG(F_SF); + CLEAR_FLAG(F_AF); + CLEAR_FLAG(F_CF); + CLEAR_FLAG(F_PF); + CONDITIONAL_SET_FLAG(GD->word[0]==0, F_ZF); + break; + + case 0xBC: /* TZCNT Ew,Gw */ CHECK_FLAGS(emu); nextop = F8; GETEW(0); @@ -93,7 +110,7 @@ uintptr_t Run66F30F(x64emu_t *emu, rex_t rex, uintptr_t addr) if(!BOX64ENV(cputype)) CLEAR_FLAG(F_OF); break; - case 0xBD: /* LZCNT Ed,Gd */ + case 0xBD: /* LZCNT Ew,Gw */ CHECK_FLAGS(emu); nextop = F8; GETEW(0); @@ -118,23 +135,6 @@ uintptr_t Run66F30F(x64emu_t *emu, rex_t rex, uintptr_t addr) CLEAR_FLAG(F_OF); break; - case 0xB8: /* POPCNT Gd,Ed */ - nextop = F8; - GETEW(0); - GETGW; - if(rex.w) - GD->q[0] = __builtin_popcountl(ED->q[0]); - else - GD->q[0] = __builtin_popcount(ED->word[0]); - RESET_FLAGS(emu); - CLEAR_FLAG(F_OF); - CLEAR_FLAG(F_SF); - CLEAR_FLAG(F_AF); - CLEAR_FLAG(F_CF); - CLEAR_FLAG(F_PF); - CONDITIONAL_SET_FLAG(GD->q[0]==0, F_ZF); - break; - default: return 0; } |