diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/arm64_emitter.h | 1 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_66.c | 33 |
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; |