about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-10-26 21:57:37 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-10-26 21:57:37 +0200
commita1ac21af75b0fae21981830e660cc31527f9f0f0 (patch)
tree50a53dd3b2b7208d0ecb49d5faa6565f398f43e0 /src
parentd3d5e4e7bc8e44e28c5a4541ec5507270f709c1c (diff)
downloadbox64-a1ac21af75b0fae21981830e660cc31527f9f0f0.tar.gz
box64-a1ac21af75b0fae21981830e660cc31527f9f0f0.zip
[32BITS] Added a few 66 opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c18
-rw-r--r--src/emu/x64run66.c6
2 files changed, 23 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 84427d20..6c0985aa 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -43,7 +43,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     MAYUSE(j64);

     MAYUSE(lock);

 

-    while((opcode==0x2E) || (opcode==0x36) || (opcode==0x66))   // ignoring CS:, SS: or multiple 0x66

+    while((opcode==0x2E) || (opcode==0x36) || (opcode==0x26) || (opcode==0x66))   // ignoring CS:, SS:, ES: or multiple 0x66

         opcode = F8;

 

     while((opcode==0xF2) || (opcode==0xF3)) {

@@ -649,6 +649,22 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             }

             break;

 

+        case 0x8E:

+            INST_NAME("MOV Seg,Ew");

+            nextop = F8;

+            u8 = (nextop&0x38)>>3;

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

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

+            } else {

+                SMREAD();

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

+                LDH(x1, wback, fixedaddress);

+                ed = x1;

+            }

+            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:

diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c
index 49a5ba3c..6596d081 100644
--- a/src/emu/x64run66.c
+++ b/src/emu/x64run66.c
@@ -391,6 +391,12 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
         else

             GD->word[0] = (uint16_t)tmp64u;

         break;

+    case 0x8E:                               /* MOV Seg,Ew */

+        nextop = F8;

+        GETEW(0);

+        emu->segs[((nextop&0x38)>>3)] = EW->word[0];

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

+        break;

 

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

     case 0x91: