about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-10-17 14:52:34 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-10-17 14:52:34 +0200
commit2e283b9d6d217ab1ae67043ca7ad7853ef857ec0 (patch)
tree3d9348ef6a1904902ad38126f2a3ec95d6dab4a4 /src
parent3cf27bb46e78747116ba57c9cf10ceb5b25caf71 (diff)
downloadbox64-2e283b9d6d217ab1ae67043ca7ad7853ef857ec0.tar.gz
box64-2e283b9d6d217ab1ae67043ca7ad7853ef857ec0.zip
[ARM64_DYNAREC] More fixes for Atomic extension n LOCK DEC opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index 0b2dcb5c..08a54f59 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -54,7 +54,6 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             INST_NAME("LOCK ADD Eb, Gb");
             SETFLAGS(X_ALL, SF_SET_PENDING);
             nextop = F8;
-            SMDMB();
             GETGB(x2);
             if((nextop&0xC0)==0xC0) {
                 if(rex.rex) {
@@ -71,9 +70,11 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             } else {
                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
                 if(arm64_atomics) {
-                    LDADDALB(x2, x1, wback);
                     UFLAG_IF {
+                        LDADDALB(x2, x1, wback);
                         emit_add8(dyn, ninst, x1, x2, x4, x5);    
+                    } else {
+                        STADDLB(x2, wback);
                     }
                 } else {
                     MARKLOCK;
@@ -89,16 +90,17 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             SETFLAGS(X_ALL, SF_SET_PENDING);
             nextop = F8;
             GETGD;
-            SMDMB();
             if((nextop&0xC0)==0xC0) {
                 ed = xRAX+(nextop&7)+(rex.b<<3);
                 emit_add32(dyn, ninst, rex, ed, gd, x3, x4);
             } else {
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
                 if(arm64_atomics) {
-                    LDADDALxw(gd, x1, wback);
                     UFLAG_IF {
+                        LDADDALxw(gd, x1, wback);
                         emit_add32(dyn, ninst, rex, x1, gd, x3, x4);    
+                    } else {
+                        STADDLxw(gd, wback);
                     }
                 } else {
                     MARKLOCK;
@@ -1201,8 +1203,8 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         }
                     }
                     break;
-                case 1: //DEC Ed
-                    INST_NAME("LOCK DEC Ed");
+                case 1: //DEC Eb
+                    INST_NAME("LOCK DEC Eb");
                     SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING);
                     SMDMB();
                     if(MODREG) {
@@ -1215,7 +1217,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             MOV32w(x3, -1);
                             UFLAG_IF {
                                 LDADDALB(x3, x1, wback);
-                                emit_inc8(dyn, ninst, x1, x3, x4);
+                                emit_dec8(dyn, ninst, x1, x3, x4);
                             } else {
                                 STADDLB(x3, wback);
                             }
@@ -1287,7 +1289,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         B_MARK(cNE);    // unaligned
                         MARKLOCK;
                         if(arm64_atomics) {
-                            MOV32w(x3, -1);
+                            MOV64xw(x3, -1);
                             UFLAG_IF {
                                 LDADDALxw(x3, x1, wback);
                                 emit_dec32(dyn, ninst, rex, x1, x3, x4);