about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-07-23 11:15:31 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-07-23 11:15:31 +0200
commitb2c2f7bbd24dec0178af1172c46bbac33f38205b (patch)
treebd5e5c4c492ae9e291f217f20e80b3126a93d9e5 /src/dynarec
parentda6ad1a43d85e0a9ad4f2801f5b5bdb73dc55055 (diff)
downloadbox64-b2c2f7bbd24dec0178af1172c46bbac33f38205b.tar.gz
box64-b2c2f7bbd24dec0178af1172c46bbac33f38205b.zip
[32BITS] Added 66 50-5F opcodes ([ARM64_DYNAREC] too, and fixed 66 61 opcode)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c61
1 files changed, 52 insertions, 9 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 8f588207..cb1e1c51 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -319,7 +319,44 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             emit_dec16(dyn, ninst, x1, x2, x3);

             BFIw(gd, x1, 0, 16);

             break;

-

+        case 0x50:

+        case 0x51:

+        case 0x52:

+        case 0x53:

+        case 0x54:

+        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);

+                }

+            } else {

+                DEFAULT;

+            }

+            break;

+        case 0x58:

+        case 0x59:

+        case 0x5A:

+        case 0x5B:

+        case 0x5C:

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

+            }

+            break;

         case 0x60:

             if(rex.is32bits) {

                 INST_NAME("PUSHA 16 (32bits)");

@@ -339,15 +376,21 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x61:

             if(rex.is32bits) {

                 INST_NAME("POPA 16 (32bits)");

-                MOVw_REG(x1, xRSP);

-                LDRH_S9_postindex(xRDI, xRSP, 2);

-                LDRH_S9_postindex(xRSI, xRSP, 2);

-                LDRH_S9_postindex(xRBP, xRSP, 2);

                 LDRH_S9_postindex(x1, xRSP, 2);

-                LDRH_S9_postindex(xRBX, xRSP, 2);

-                LDRH_S9_postindex(xRDX, xRSP, 2);

-                LDRH_S9_postindex(xRCX, xRSP, 2);

-                LDRH_S9_postindex(xRAX, xRSP, 2);

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

+                LDRH_S9_postindex(x1, xRSP, 2);

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

+                LDRH_S9_postindex(x1, xRSP, 2);

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

+                LDRH_S9_postindex(x1, xRSP, 2); // RSP ignored

+                LDRH_S9_postindex(x1, xRSP, 2);

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

+                LDRH_S9_postindex(x1, xRSP, 2);

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

+                LDRH_S9_postindex(x1, xRSP, 2);

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

+                LDRH_S9_postindex(x1, xRSP, 2);

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

             } else {

                 DEFAULT;

             }