about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-27 14:15:29 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-27 14:15:29 +0200
commit950371427da5215bcca4c009f39e5c7a1158fef7 (patch)
treeea00a64a43903d5c995dfe4d3c014bf6444f7e04 /src
parentbe63129179f3281802414a44118fd340607a4dd0 (diff)
downloadbox64-950371427da5215bcca4c009f39e5c7a1158fef7.tar.gz
box64-950371427da5215bcca4c009f39e5c7a1158fef7.zip
[INTERP] Added 66 F3 0F BC opcode
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run66f30f.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/emu/x64run66f30f.c b/src/emu/x64run66f30f.c
index 91a772c2..9e56e94d 100644
--- a/src/emu/x64run66f30f.c
+++ b/src/emu/x64run66f30f.c
@@ -55,6 +55,39 @@ uintptr_t Run66F30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
 
     switch(opcode) {
 
+    case 0xBC:  /* TZCNT Ed,Gd */
+        CHECK_FLAGS(emu);
+        nextop = F8;
+        GETEW(0);
+        GETGW;
+        if(rex.w) {
+            tmp64u = ED->q[0];
+            if(tmp64u) {
+                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->word[0];
+            if(tmp32u) {
+                tmp8u = 0;
+                while(!(tmp32u&(1<<tmp8u))) ++tmp8u;
+                GD->word[0] = tmp8u;
+                CONDITIONAL_SET_FLAG(tmp8u==0, F_ZF);
+                CLEAR_FLAG(F_CF);
+            } else {
+                CLEAR_FLAG(F_ZF);
+                SET_FLAG(F_CF);
+                GD->word[0] = 16;
+            }
+        }
+        break;
     case 0xBD:  /* LZCNT Ed,Gd */
         CHECK_FLAGS(emu);
         nextop = F8;