about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-21 16:05:54 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-21 16:05:54 +0100
commitb272f6bf15df69baad9be22a7a474c46e1c49f82 (patch)
tree0005e23aab02adf2f5ee55c42d7254624b9d14aa
parent715ce5dbe987c103eeebbda470325866dc614b16 (diff)
downloadbox64-b272f6bf15df69baad9be22a7a474c46e1c49f82.tar.gz
box64-b272f6bf15df69baad9be22a7a474c46e1c49f82.zip
Added/Fix some 16bits PUSH POP opcode ([ARM64_DYNAREC] too) (for DaveTheDiver, but not enough for it to run yet)
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c82
-rw-r--r--src/emu/x64run66.c27
2 files changed, 36 insertions, 73 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 6d77a3c0..70ecb7d6 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -84,23 +84,15 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             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;

-            }

+            INST_NAME("PUSH ES");

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

+            PUSH1_16(x1);

             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;

-            }

+            INST_NAME("POP ES");

+            POP1_16(x1);

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

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

             break;

 

         case 0x09:

@@ -200,23 +192,15 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             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;

-            }

+            INST_NAME("PUSH DS");

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

+            PUSH1_16(x1);

             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;

-            }

+            INST_NAME("POP DS");

+            POP1_16(x1);

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

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

             break;

 

         case 0x21:

@@ -370,17 +354,13 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x55:

         case 0x56:

         case 0x57:

-            if(rex.is32bits) {

-                INST_NAME("PUSH reg");

-                gd = xRAX+(opcode&0x07);

-                if (gd==xRSP) {

-                    MOVw_REG(x1, xRSP);

-                    PUSH1_16(x1);

-                } else {

-                    PUSH1_16(gd);

-                }

+            INST_NAME("PUSH reg");

+            gd = xRAX+(opcode&0x07);

+            if (gd==xRSP) {

+                MOVw_REG(x1, xRSP);

+                PUSH1_16(x1);

             } else {

-                DEFAULT;

+                PUSH1_16(gd);

             }

             break;

         case 0x58:

@@ -391,14 +371,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x5D:

         case 0x5E:

         case 0x5F:

-            if(rex.is32bits) {

-                INST_NAME("POP reg");

-                gd = xRAX+(opcode&0x07);

-                POP1_16(x1);

-                BFIw(gd, x1, 0, 16);

-            } else {

-                DEFAULT;

-            }

+            INST_NAME("POP reg");

+            gd = xRAX+(opcode&0x07);

+            POP1_16(x1);

+            BFIw(gd, x1, 0, 16);

             break;

         case 0x60:

             if(rex.is32bits) {

@@ -1331,13 +1307,9 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     EWBACK;

                     break;

                 case 6: // Push Ew

-                    if(rex.is32bits) {

-                        INST_NAME("PUSH Ew");

-                        GETEW(x1, 0);

-                        PUSH1_16(ed);

-                    } else {

-                        DEFAULT;

-                    }

+                    INST_NAME("PUSH Ew");

+                    GETEW(x1, 0);

+                    PUSH1_16(ed);

                     break;

 

                 default:

diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c
index 3ba3af50..03229b5e 100644
--- a/src/emu/x64run66.c
+++ b/src/emu/x64run66.c
@@ -116,13 +116,13 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
         if(!rex.is32bits) {

             return 0;

         }

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

+        Push16(emu, emu->segs[_ES]);

         break;

     case 0x07:                      /* POP ES */

         if(!rex.is32bits) {

             return 0;

         }

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

+        emu->segs[_ES] = Pop16(emu);

         emu->segs_serial[_ES] = 0;

         break;

 

@@ -152,13 +152,13 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
             if(!rex.is32bits) {

                 return 0;

             }

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

+            Push16(emu, emu->segs[_DS]);

             break;

         case 0x1F:                      /* POP DS */

             if(!rex.is32bits) {

                 return 0;

             }

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

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

             emu->segs_serial[_DS] = 0;

             break;

 

@@ -217,11 +217,8 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
     case 0x55:

     case 0x56:

     case 0x57:                      /* PUSH Reg */

-        if(rex.is32bits) {

-            tmp16u = emu->regs[opcode&7].word[0];

-            Push16(emu, tmp16u);

-        } else

-            return 0;

+        tmp16u = emu->regs[opcode&7].word[0];

+        Push16(emu, tmp16u);

         break;

     case 0x58:

     case 0x59:

@@ -231,11 +228,8 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
     case 0x5D:

     case 0x5E:

     case 0x5F:                      /* POP Reg */

-        if(rex.is32bits) {

-            tmp8u = opcode&7;

-            emu->regs[tmp8u].word[0] = Pop16(emu);

-        } else

-            return 0;

+        tmp8u = opcode&7;

+        emu->regs[tmp8u].word[0] = Pop16(emu);

         break;

     case 0x60:                              /* PUSHA */

         if(rex.is32bits) {

@@ -892,10 +886,7 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
                 addr = tmp64u;

                 break;

            case 6:                  /* Push Ew */

-                if(rex.is32bits) {

-                    Push16(emu, EW->word[0]);

-                } else 

-                    return 0;

+                Push16(emu, EW->word[0]);

                 break;

             default:

                     printf_log(LOG_NONE, "Illegal Opcode %p: 66 %02X %02X %02X %02X %02X %02X\n",(void*)R_RIP, opcode, nextop, PK(2), PK(3), PK(4), PK(5));