about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-28 12:05:31 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-28 12:05:31 +0100
commitc0829b807cc0c2b4aa96d1f6261f7b1add48670e (patch)
treea9330aabbb7cbbcea3d50c7e934ca79ed8bebac2 /src
parent7d3cdb06e383195e897393e27aca8f3c07445501 (diff)
downloadbox64-c0829b807cc0c2b4aa96d1f6261f7b1add48670e.tar.gz
box64-c0829b807cc0c2b4aa96d1f6261f7b1add48670e.zip
[INTERPRETER] Added 66 F3 0F B8 opcode
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run66f30f.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/emu/x64run66f30f.c b/src/emu/x64run66f30f.c
index 4e455d7c..878fc01a 100644
--- a/src/emu/x64run66f30f.c
+++ b/src/emu/x64run66f30f.c
@@ -75,6 +75,23 @@ uintptr_t Run66F30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         GD->q[0] = tmp8u;
         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;
     }