diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index a4351282..148cbe92 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -992,7 +992,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xA6: switch(rep) { case 1: - INST_NAME("REPZ CMPSB"); + INST_NAME("REPNZ CMPSB"); SETFLAGS(X_ALL, SF_SET); GETDIR(x3, 1); CBZx_NEXT(xRCX); @@ -1008,7 +1008,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5); break; case 2: - INST_NAME("REPNZ CMPSB"); + INST_NAME("REPZ CMPSB"); SETFLAGS(X_ALL, SF_SET); GETDIR(x3, 1); CBZx_NEXT(xRCX); @@ -1052,6 +1052,51 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_test32(dyn, ninst, rex, xRAX, x2, x3, x4); break; + case 0xAE: + switch(rep) { + case 1: + INST_NAME("REPNZ SCASB"); + SETFLAGS(X_ALL, SF_SET); + GETDIR(x3, 1); + CBZx_NEXT(xRCX); + BFIw(x1, xRAX, 0, 8); + MARK; + LDRB_U12(x2, xRDI, 0); + ADDx_REG(xRDI, xRDI, x3); + SUBx_U12(xRCX, xRCX, 1); + CMPSw_REG(x1, x2); + Bcond(cEQ, 4+4); + CBNZx_MARK(xRCX); + emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5); + break; + case 2: + INST_NAME("REPZ SCASB"); + SETFLAGS(X_ALL, SF_SET); + GETDIR(x3, 1); + CBZx_NEXT(xRCX); + BFIw(x1, xRAX, 0, 8); + MARK; + LDRB_U12(x2, xRDI, 0); + ADDx_REG(xRDI, xRDI, x3); + SUBx_U12(xRCX, xRCX, 1); + CMPSw_REG(x1, x2); + Bcond(cNE, 4+4); + CBNZx_MARK(xRCX); + emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5); + break; + default: + INST_NAME("SCASB"); + SETFLAGS(X_ALL, SF_SET); + GETDIR(x3, 1); + BFIw(x1, xRAX, 0, 8); + LDRB_U12(x2, xRDI, 0); + ADDx_REG(xRDI, xRDI, x3); + emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5); + break; + } + break; + + case 0xB0: case 0xB1: case 0xB2: |