about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-10-24 16:59:40 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-10-24 16:59:40 +0200
commit12c40a5b804143cee0d538c4de4b526522bcfcd2 (patch)
treec3a976d0f65df337ac04f16710d92f02a39cefaa
parente9a2f9ff6281eac45b1e10457f3c79f780451c02 (diff)
downloadbox64-12c40a5b804143cee0d538c4de4b526522bcfcd2.tar.gz
box64-12c40a5b804143cee0d538c4de4b526522bcfcd2.zip
[32BITS] Added 66 06/07 and 66 1E/1F opcodes ([ARM64_DYNAREC] too)
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c38
-rw-r--r--src/emu/x64run66.c28
2 files changed, 66 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index b3504b48..c41c19ef 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -83,6 +83,25 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             emit_add16(dyn, ninst, x1, x2, x3, x4);

             BFIx(xRAX, x1, 0, 16);

             break;

+        case 0x06:

+            if(rex.is32bits) {

+                INST_NAME("PUSH ES");

+                LDRH_U12(x1, xEmu, offsetof(x64emu_t, segs[_ES]));

+                PUSH1_32(x1);

+            } else {

+                DEFAULT;

+            }

+            break;

+        case 0x07:

+            if(rex.is32bits) {

+                INST_NAME("POP ES");

+                POP1_32(x1);

+                STRH_U12(x1, xEmu, offsetof(x64emu_t, segs[_ES]));

+                STRw_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_ES]));

+            } else {

+                DEFAULT;

+            }

+            break;

 

         case 0x09:

             INST_NAME("OR Ew, Gw");

@@ -176,6 +195,25 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             emit_sbb16(dyn, ninst, x1, x2, x3, x4);

             BFIx(xRAX, x1, 0, 16);

             break;

+        case 0x1E:

+            if(rex.is32bits) {

+                INST_NAME("PUSH DS");

+                LDRH_U12(x1, xEmu, offsetof(x64emu_t, segs[_DS]));

+                PUSH1_32(x1);

+            } else {

+                DEFAULT;

+            }

+            break;

+        case 0x1F:

+            if(rex.is32bits) {

+                INST_NAME("POP DS");

+                POP1_32(x1);

+                STRH_U12(x1, xEmu, offsetof(x64emu_t, segs[_DS]));

+                STRw_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_DS]));

+            } else {

+                DEFAULT;

+            }

+            break;

 

         case 0x21:

             INST_NAME("AND Ew, Gw");

diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c
index 938fde48..49a5ba3c 100644
--- a/src/emu/x64run66.c
+++ b/src/emu/x64run66.c
@@ -112,6 +112,20 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
     GO(0x28, sub)                   /* SUB 0x29 ~> 0x2D */

     GO(0x30, xor)                   /* XOR 0x31 ~> 0x35 */

 

+    case 0x06:                      /* PUSH ES */

+        if(!rex.is32bits) {

+            return 0;

+        }

+        Push32(emu, emu->segs[_ES]);  // even if a segment is a 16bits, a 32bits push/pop is done

+        break;

+    case 0x07:                      /* POP ES */

+        if(!rex.is32bits) {

+            return 0;

+        }

+        emu->segs[_ES] = Pop32(emu);    // no check, no use....

+        emu->segs_serial[_ES] = 0;

+        break;

+

     case 0x0F:                              /* more opcdes */

         #ifdef TEST_INTERPRETER

         return Test660F(test, rex, addr);

@@ -119,6 +133,20 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
         return Run660F(emu, rex, addr);

         #endif

 

+        case 0x1E:                      /* PUSH DS */

+            if(!rex.is32bits) {

+                return 0;

+            }

+            Push32(emu, emu->segs[_DS]);  // even if a segment is a 16bits, a 32bits push/pop is done

+            break;

+        case 0x1F:                      /* POP DS */

+            if(!rex.is32bits) {

+                return 0;

+            }

+            emu->segs[_DS] = Pop32(emu);    // no check, no use....

+            emu->segs_serial[_DS] = 0;

+            break;

+

     case 0x39:

         nextop = F8;

         GETEW(0);