about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-03-07 20:13:41 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-03-07 20:13:41 +0100
commitc2d02977f8565b0ba19149a7c283af5680c065e7 (patch)
tree5dbcf62c1ec35cf9279188624dc0076a66527187 /src
parent946c999e2593f902fe46005b39314f6659d0d7d5 (diff)
downloadbox64-c2d02977f8565b0ba19149a7c283af5680c065e7.tar.gz
box64-c2d02977f8565b0ba19149a7c283af5680c065e7.zip
Added F0 F7 /2 opcode ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c28
-rw-r--r--src/emu/x64runf0.c36
2 files changed, 64 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index ab13c0f0..d65bc551 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -1714,6 +1714,34 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     DEFAULT;
             }
             break;
+        case 0xF7:
+            nextop = F8;
+            switch((nextop>>3)&7) {
+                case 2:
+                    INST_NAME("LOCK NOT Ed");
+                    if(MODREG) {
+                        GETED(x1);
+                        MVNw_REG(x1, x1);
+                        EBBACK;
+                    } else {
+                        addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
+                        if(arm64_atomics) {
+                            MOV64x(x1, ~0LL);
+                            STEORLxw(x1, wback);
+                        } else {
+                            MARKLOCK;
+                            LDAXRxw(x1, wback);
+                            MVNw_REG(x1, x1);
+                            STLXRxw(x3, x1, wback);
+                            CBNZx_MARKLOCK(x3);
+                        }
+                        SMDMB();
+                    }
+                    break;
+                default:
+                    DEFAULT;
+            }
+            break;
 
         case 0xFE:
             nextop = F8;
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index 8a1c5d0a..22f19566 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -1167,6 +1167,42 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                     return 0;

             }

             break;

+            case 0xF7:                      /* GRP3 Ed(,Id) */

+            nextop = F8;

+            tmp8u = (nextop>>3)&7;

+            GETED((tmp8u<2)?4:0);

+            switch(tmp8u) {

+                case 2:                 /* NOT Eb */

+#if defined(DYNAREC) && !defined(TEST_INTERPRETER)

+                    if(rex.w)

+                        do {

+                            tmp64u = native_lock_read_dd(ED); 

+                            tmp64u = not64(emu, tmp64u);

+                        } while(native_lock_write_dd(ED, tmp64u));

+                    else {

+                        do {

+                            tmp32u = native_lock_read_d(ED); 

+                            tmp32u = not32(emu, tmp32u);

+                        } while(native_lock_write_d(ED, tmp32u));

+                        if(MODREG) ED->dword[1] = 0;

+                    }

+#else

+                    if(rex.w) {

+                        pthread_mutex_lock(&my_context->mutex_lock);

+                        ED->q[0] = not64(emu, ED->q[0]);

+                        pthread_mutex_unlock(&my_context->mutex_lock);

+                    } else {

+                        pthread_mutex_lock(&my_context->mutex_lock);

+                        ED->dword[0] = not32(emu, ED->dword[0]);

+                        pthread_mutex_unlock(&my_context->mutex_lock);

+                        if(MODREG) ED->dword[1] = 0;

+                    }

+#endif

+                    break;

+                default:

+                    return 0;

+            }

+            break;

 

         case 0xFE:              /* GRP 5 Eb */

             nextop = F8;