about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
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;