about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-07 08:53:15 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-07 08:53:15 +0200
commit2ef6011c7aebe44870795e1faaae9dde462cb7af (patch)
tree01f4cb5dc96e50b8055dadb7c30f891ba07a38ca
parent6e0b5358fbe20cd14b2728d3d0a688d1c84fd8a6 (diff)
downloadbox64-2ef6011c7aebe44870795e1faaae9dde462cb7af.tar.gz
box64-2ef6011c7aebe44870795e1faaae9dde462cb7af.zip
[ARM64_DYNAREC] Added 64 88 opcode
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c69
1 files changed, 52 insertions, 17 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index f4ed2483..160bc2db 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -669,6 +669,58 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
             }
             break;
+        case 0x88:
+            INST_NAME("MOV Eb, Gb");
+            nextop = F8;
+            gd = ((nextop&0x38)>>3)+(rex.r<<3);
+            if(rex.rex) {
+                gb2 = 0;
+                gb1 = xRAX + gd;
+            } else {
+                gb2 = ((gd&4)<<1);
+                gb1 = xRAX+(gd&3);
+            }
+            if(gb2) {
+                gd = x4;
+                UBFXw(gd, gb1, gb2, 8);
+            } else {
+                gd = gb1;   // no need to extract
+            }
+            if(MODREG) {
+                ed = (nextop&7) + (rex.b<<3);
+                if(rex.rex) {
+                    eb1 = xRAX+ed;
+                    eb2 = 0;
+                } else {
+                    eb1 = xRAX+(ed&3);  // Ax, Cx, Dx or Bx
+                    eb2 = ((ed&4)>>2);    // L or H
+                }
+                BFIx(eb1, gd, eb2*8, 8);
+            } else {
+                grab_segdata(dyn, addr, ninst, x4, seg);
+                addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
+                if(rex.is32bits)
+                    STRB_REG_SXTW(gd, x4, wback);
+                else
+                    STRB_REG(gd, wback, x4);
+            }
+            break;
+        case 0x89:
+            INST_NAME("MOV Seg:Ed, Gd");
+            grab_segdata(dyn, addr, ninst, x4, seg);
+            nextop=F8;
+            GETGD;
+            if(MODREG) {   // reg <= reg
+                MOVxw_REG(xRAX+(nextop&7)+(rex.b<<3), gd);
+            } else {                    // mem <= reg
+                addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
+                if(rex.is32bits)
+                    STRxw_REG_SXTW(gd, x4, ed);
+                else
+                    STRxw_REG(gd, ed, x4);
+                SMWRITE2();
+            }
+            break;
         case 0x8A:
             INST_NAME("MOV Gb, Eb");
             nextop = F8;
@@ -707,23 +759,6 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             }
             BFIx(gb1, ed, gb2, 8);
             break;
-        case 0x89:
-            INST_NAME("MOV Seg:Ed, Gd");
-            grab_segdata(dyn, addr, ninst, x4, seg);
-            nextop=F8;
-            GETGD;
-            if(MODREG) {   // reg <= reg
-                MOVxw_REG(xRAX+(nextop&7)+(rex.b<<3), gd);
-            } else {                    // mem <= reg
-                addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
-                if(rex.is32bits)
-                    STRxw_REG_SXTW(gd, x4, ed);
-                else
-                    STRxw_REG(gd, ed, x4);
-                SMWRITE2();
-            }
-            break;
-
         case 0x8B:
             INST_NAME("MOV Gd, Seg:Ed");
             grab_segdata(dyn, addr, ninst, x4, seg);