about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-11-22 07:51:22 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-11-22 07:51:22 +0100
commit284345d5334df4d52fadca42c2eb0faa3d9b5761 (patch)
tree7127b715427d0c4500258549c23f60350c4de3dd /src
parent07767d42ccd1a09fb78ccae6571d2a99a1d3b925 (diff)
downloadbox64-284345d5334df4d52fadca42c2eb0faa3d9b5761.tar.gz
box64-284345d5334df4d52fadca42c2eb0faa3d9b5761.zip
Added 64 8A opcode ([DYNAREC] too) (for #171)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_arm64_64.c39
-rw-r--r--src/emu/x64run64.c7
2 files changed, 43 insertions, 3 deletions
diff --git a/src/dynarec/dynarec_arm64_64.c b/src/dynarec/dynarec_arm64_64.c
index 207a7245..ba283920 100644
--- a/src/dynarec/dynarec_arm64_64.c
+++ b/src/dynarec/dynarec_arm64_64.c
@@ -31,7 +31,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     uint8_t opcode = F8;
     uint8_t nextop;
     uint8_t u8;
-    uint8_t gd, ed, eb1, eb2;
+    uint8_t gd, ed, eb1, eb2, gb1, gb2;
     uint8_t wback, wb1, wb2, wb;
     int64_t i64, j64;
     int v0;
@@ -42,6 +42,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     MAYUSE(eb2);
     MAYUSE(wb1);
     MAYUSE(wb2);
+    MAYUSE(gb1);
+    MAYUSE(gb2);
     MAYUSE(j64);
     MAYUSE(d0);
     MAYUSE(q0);
@@ -369,7 +371,40 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
             }
             break;
-            
+        case 0x8A:
+            INST_NAME("MOV Gb, Eb");
+            nextop = F8;
+            if(rex.rex) {
+                gb1 = gd = xRAX+((nextop&0x38)>>3)+(rex.r<<3);
+                gb2=0;
+            } else {
+                gd = (nextop&0x38)>>3;
+                gb1 = xRAX+(gd&3);
+                gb2 = ((gd&4)>>2);
+            }
+            if(MODREG) {
+                if(rex.rex) {
+                    wback = xRAX+(nextop&7)+(rex.b<<3);
+                    wb2 = 0;
+                } else {
+                    wback = (nextop&7);
+                    wb2 = (wback>>2);
+                    wback = xRAX+(wback&3);
+                }
+                if(wb2) {
+                    UBFXw(x4, wback, wb2*8, 8);
+                    ed = x4;
+                } else {
+                    ed = wback;
+                }
+            } else {
+                grab_segdata(dyn, addr, ninst, x4, seg);
+                addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, 0);
+                LDRB_REG(x4, wback, x4);
+                ed = x4;
+            }
+            BFIx(gb1, ed, gb2*8, 8);
+            break;
         case 0x89:
             INST_NAME("MOV Seg:Ed, Gd");
             grab_segdata(dyn, addr, ninst, x4, seg);
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index 9897efdd..8717d46a 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -316,7 +316,12 @@ int Run64(x64emu_t *emu, rex_t rex, int seg)
                     ED->dword[0] = GD->dword[0];

             }

             break;

-

+        case 0x8A:                      /* MOV Gb,Eb */

+            nextop = F8;

+            GETEB_OFFS(0, tlsdata);

+            GETGB;

+            GB = EB->byte[0];

+            break;

         case 0x8B:                      /* MOV Gd,Ed */

             nextop = F8;

             GETED_OFFS(0, tlsdata);