about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-08-15 13:19:43 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-08-15 13:19:43 +0200
commitd6216707351353bb74a6d323da27e7351151243c (patch)
tree931e4249ee1e3ddf5f9b89fecaaff909c3a4f52a /src
parent6653cce46451278bf65dfb121c670694c07356e6 (diff)
downloadbox64-d6216707351353bb74a6d323da27e7351151243c.tar.gz
box64-d6216707351353bb74a6d323da27e7351151243c.zip
[ARM64_DYNAREC] Added 0F C0/C1 ocpodes (helps #927)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 789fe27e..e4aa3657 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -30,8 +30,8 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     uint8_t opcode = F8;

     uint8_t nextop, u8;

     uint8_t gd, ed;

-    uint8_t wback, wb2;

-    uint8_t eb1, eb2;

+    uint8_t wback, wb1, wb2;

+    uint8_t eb1, eb2, gb1, gb2;

     int32_t i32, i32_;

     int cacheupd = 0;

     int v0, v1;

@@ -42,9 +42,12 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     int64_t j64;

     int64_t fixedaddress;

     int unscaled;

+    MAYUSE(wb1);

     MAYUSE(wb2);

     MAYUSE(eb1);

     MAYUSE(eb2);

+    MAYUSE(gb1);

+    MAYUSE(gb2);

     MAYUSE(q0);

     MAYUSE(q1);

     MAYUSE(d0);

@@ -1579,7 +1582,29 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 LDSHxw(gd, ed, fixedaddress);

             }

             break;

-

+        case 0xC0:

+            INST_NAME("XADD Gb, Eb");

+            SETFLAGS(X_ALL, SF_SET_PENDING);

+            nextop = F8;

+            GETGB(x1);

+            GETEB(x2, 0);

+            gd = x2; ed = x1;    // swap gd/ed

+            emit_add8(dyn, ninst, x1, x2, x4, x5);

+            GBBACK; // gb gets x2 (old ed)

+            EBBACK; // eb gets x1 (sum)

+            break;

+        case 0xC1:

+            INST_NAME("XADD Gd, Ed");

+            SETFLAGS(X_ALL, SF_SET_PENDING);

+            nextop = F8;

+            GETGD;

+            GETED(0);

+            MOVxw_REG(x3, ed);

+            MOVxw_REG(ed, gd);

+            MOVxw_REG(gd, x3);

+            emit_add32(dyn, ninst, rex, ed, gd, x4, x5);

+            WBACK;

+            break;

         case 0xC2:

             INST_NAME("CMPPS Gx, Ex, Ib");

             nextop = F8;