about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-07-23 12:38:05 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-07-23 12:38:05 +0200
commit1d5a88a3198c59c5ad27e5ecdcb2f8ef4f712264 (patch)
tree261982a25ff8b79da54ed98c30cd5ba8e9e419b9 /src
parent392575ba040a4a2f7f2ea947b56b6c73a15baa3f (diff)
downloadbox64-1d5a88a3198c59c5ad27e5ecdcb2f8ef4f712264.tar.gz
box64-1d5a88a3198c59c5ad27e5ecdcb2f8ef4f712264.zip
[32BITS] added D6 undocumented opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_native_pass.c14
-rw-r--r--src/emu/x64run.c9
2 files changed, 21 insertions, 2 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index 8ce3540b..3e947e61 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -183,7 +183,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
                 dyn->forward_size = 0;
                 dyn->forward_ninst = 0;
                 ok = 1; // in case it was 0
-            } else if ((dyn->forward_to < addr) || !ok) {
+            } else if ((dyn->forward_to < addr) || ok<=0) {
                 // something when wrong! rollback
                 if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Could not forward extend block for %d bytes %p -> %p\n", dyn->forward_to-dyn->forward, (void*)dyn->forward, (void*)dyn->forward_to);
                 ok = 0;
@@ -213,7 +213,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
                         }
                     if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Extend block %p, %p -> %p (ninst=%d, jump from %d)\n", dyn, (void*)addr, (void*)next, ninst, reset_n);
                 } else if(next && (next-addr)<box64_dynarec_forward && (getProtection(next)&PROT_READ)/*box64_dynarec_bigblock>=stopblock*/) {
-                    if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next))) {
+                    if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next)) && !dyn->forward) {
                         dyn->forward = addr;
                         dyn->forward_to = next;
                         dyn->forward_size = dyn->size;
@@ -235,6 +235,16 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
                 dyn->insts[ninst].x64.need_after |= X_PEND;
                 ++ninst;
             }
+            if(dyn->forward) {
+                // stopping too soon
+                dyn->size = dyn->forward_size;
+                ninst = dyn->forward_ninst+1;
+                addr = dyn->forward;
+                dyn->forward = 0;
+                dyn->forward_to = 0;
+                dyn->forward_size = 0;
+                dyn->forward_ninst = 0;
+            }
             #endif
         }
         ++ninst;
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 56496f7a..c0e38a8b 100644
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -1472,6 +1472,15 @@ x64emurun:
             }
             break;
 
+        case 0xD6:                      /* SALC */
+            if(rex.is32bits) {
+                CHECK_FLAGS(emu);
+                R_AL = ACCESS_FLAG(F_CF)?0xff:0x00;
+            } else {
+                unimp = 1;
+                goto fini;
+            };
+            break;
         case 0xD7:                      /* XLAT */
             R_AL = *(uint8_t*)(R_RBX + R_AL);
             break;