about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-07 14:13:05 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-07 14:13:05 +0100
commit315068b111a6912ea05a45a3c7e07ff591e53c24 (patch)
tree5a87af5ab0b5f2b889bae272786ff01a5fd6d74e /src
parent4047d1ba3c536c66a7baedf474fdc2c17cdefa84 (diff)
downloadbox64-315068b111a6912ea05a45a3c7e07ff591e53c24.tar.gz
box64-315068b111a6912ea05a45a3c7e07ff591e53c24.zip
[ARM64_DYNAREC] Added 0F C7 /1 opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 813ea8be..6b2d3fa5 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -2221,7 +2221,40 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 VMOVQ(v0, d0);

             }

             break;

-

+        case 0xC7:

+            // rep has no impact here

+            nextop = F8;

+            switch((nextop>>3)&7) {

+                case 1:

+                INST_NAME("CMPXCHG8B Gq, Eq");

+                SETFLAGS(X_ZF, SF_SUBSET);

+                SMREAD();

+                addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                LDPxw_S7_offset(x2, x3, wback, 0);

+                CMPSxw_REG(xRAX, x2);

+                CCMPxw(xRDX, x3, 0, cEQ);

+                B_MARK(cNE);    // EAX!=ED[0] || EDX!=Ed[1]

+                STPxw_S7_offset(xRBX, xRCX, wback, 0);

+                UFLAG_IF {

+                    MOV32w(x1, 1);

+                }

+                B_MARK3_nocond;

+                MARK;

+                MOVxw_REG(xRAX, x2);

+                MOVxw_REG(xRDX, x3);

+                UFLAG_IF {

+                    MOV32w(x1, 0);

+                }

+                MARK3;

+                UFLAG_IF {

+                    BFIw(xFlags, x1, F_ZF, 1);

+                }

+                SMWRITE();

+                break;

+            default:

+                DEFAULT;

+            }

+            break;

         case 0xC8:

         case 0xC9:

         case 0xCA: