about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/arm64_emitter.h1
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_66.c33
2 files changed, 34 insertions, 0 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h
index 60ca1ae1..af35b140 100755
--- a/src/dynarec/arm64/arm64_emitter.h
+++ b/src/dynarec/arm64/arm64_emitter.h
@@ -299,6 +299,7 @@
 #define STRw_S9_preindex(Rt, Rn, imm9)    EMIT(STR_gen(0b10, 0b00, (imm9)&0x1ff, 0b11, Rn, Rt))
 #define STRxw_S9_postindex(Rt, Rn, imm9)  EMIT(STR_gen(rex.w?0b11:0b10, 0b00, (imm9)&0x1ff, 0b01, Rn, Rt))
 #define STRB_S9_postindex(Rt, Rn, imm9)   EMIT(STR_gen(0b00, 0b00, (imm9)&0x1ff, 0b01, Rn, Rt))
+#define STRH_S9_preindex(Rt, Rn, imm9)    EMIT(STR_gen(0b01, 0b00, (imm9)&0x1ff, 0b11, Rn, Rt))
 #define STRH_S9_postindex(Rt, Rn, imm9)   EMIT(STR_gen(0b01, 0b00, (imm9)&0x1ff, 0b01, Rn, Rt))
 
 #define ST_gen(size, op1, imm12, Rn, Rt)        ((size)<<30 | 0b111<<27 | (op1)<<24 | 0b00<<22 | (imm12)<<10 | (Rn)<<5 | (Rt))
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index f2f0a0a1..17aef347 100755
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -320,6 +320,39 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             BFIw(gd, x1, 0, 16);

             break;

 

+        case 0x60:

+            if(rex.is32bits) {

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

+                MOVw_REG(x1, xRSP);

+                STRH_S9_preindex(xRAX, xRSP, -2);

+                STRH_S9_preindex(xRCX, xRSP, -2);

+                STRH_S9_preindex(xRDX, xRSP, -2);

+                STRH_S9_preindex(xRBX, xRSP, -2);

+                STRH_S9_preindex(x1, xRSP, -2);

+                STRH_S9_preindex(xRBP, xRSP, -2);

+                STRH_S9_preindex(xRSI, xRSP, -2);

+                STRH_S9_preindex(xRDI, xRSP, -2);

+            } else {

+                DEFAULT;

+            }

+            break;

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

+            } else {

+                DEFAULT;

+            }

+            break;

+

         case 0x64:

             addr = dynarec64_6664(dyn, addr, ip, ninst, rex, _FS, ok, need_epilog);

             break;