about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-01-26 14:18:11 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-01-26 14:18:11 +0100
commitaab6bc086986bd22d513f05175276e5907340f86 (patch)
tree1ded23107c387b0b0048ffead0401c0cc0f387fe /src
parent77213bee1dc2f7ea15b232a74bd66d9dd300cf97 (diff)
downloadbox64-aab6bc086986bd22d513f05175276e5907340f86.tar.gz
box64-aab6bc086986bd22d513f05175276e5907340f86.zip
Added 66 8F opcode ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c49
-rw-r--r--src/emu/x64run66.c6
2 files changed, 35 insertions, 20 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 70ecb7d6..9e860dde 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -661,26 +661,37 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             STRH_U12(ed, xEmu, offsetof(x64emu_t, segs[u8]));

             STRw_U12(wZR, xEmu, offsetof(x64emu_t, segs_serial[u8]));

             break;

-

-            case 0x90:

-            case 0x91:

-            case 0x92:

-            case 0x93:

-            case 0x94:

-            case 0x95:

-            case 0x96:

-            case 0x97:

-                gd = xRAX+(opcode&0x07)+(rex.b<<3);

-                if(gd==xRAX) {

-                    INST_NAME("NOP");

-                } else {

-                    INST_NAME("XCHG AX, Reg");

-                    MOVw_REG(x2, xRAX);

-                    BFIx(xRAX, gd, 0, 16);

-                    BFIx(gd, x2, 0, 16);

-                }

+        case 0x8F:

+            INST_NAME("POP Ew");

+            nextop = F8;

+            POP1_16(x1);

+            if((nextop&0xC0)==0xC0) {

+                wback = xRAX+(nextop&7)+(rex.b<<3);

+                BFIx(wback, x1, 0, 16);

+            } else {

+                SMREAD();

+                addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 0);

+                STH(x1, wback, fixedaddress);

+            }

+            break;

+        case 0x90:

+        case 0x91:

+        case 0x92:

+        case 0x93:

+        case 0x94:

+        case 0x95:

+        case 0x96:

+        case 0x97:

+            gd = xRAX+(opcode&0x07)+(rex.b<<3);

+            if(gd==xRAX) {

+                INST_NAME("NOP");

+            } else {

+                INST_NAME("XCHG AX, Reg");

+                MOVw_REG(x2, xRAX);

+                BFIx(xRAX, gd, 0, 16);

+                BFIx(gd, x2, 0, 16);

+            }

             break;

-

         case 0x98:

             INST_NAME("CBW");

             SXTBw(x1, xRAX);

diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c
index b1325026..e26eb379 100644
--- a/src/emu/x64run66.c
+++ b/src/emu/x64run66.c
@@ -408,7 +408,11 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
         emu->segs[((nextop&0x38)>>3)] = EW->word[0];

         emu->segs_serial[((nextop&0x38)>>3)] = 0;

         break;

-

+    case 0x8F:                              /* POP Ew */

+        nextop = F8;

+        GETEW(0);

+        EW->word[0] = Pop16(emu);

+        break;

     case 0x90:                      /* NOP or XCHG R8d, AX*/

     case 0x91:

     case 0x92: