diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-10-28 15:10:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-10-28 15:10:51 +0200 |
| commit | f34427e772d35235370252870a17c3c7594989ec (patch) | |
| tree | 15511e89d95be4b52e61432014c46be31b7b69c1 /src | |
| parent | a1666986c64d45b0e1fb5ae7e2bc5e6229f9a596 (diff) | |
| download | box64-f34427e772d35235370252870a17c3c7594989ec.tar.gz box64-f34427e772d35235370252870a17c3c7594989ec.zip | |
[DYNAREC] Added 66 87 opcode
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_66.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c index ecdb4b1b..f46da3f9 100755 --- a/src/dynarec/arm64/dynarec_arm64_66.c +++ b/src/dynarec/arm64/dynarec_arm64_66.c @@ -432,6 +432,35 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_test16(dyn, ninst, x1, x2, x3, x4, x5); break; + case 0x87: + INST_NAME("(LOCK)XCHG Ew, Gw"); + nextop = F8; + if(MODREG) { + GETGD; + GETED(0); + MOVxw_REG(x1, gd); + BFIx(gd, ed, 0, 16); + BFIx(ed, x1, 0, 16); + } else { + GETGD; + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0); + DMB_ISH(); + TSTx_mask(ed, 1, 0, 0); // mask=1 + B_MARK(cNE); + MARKLOCK; + LDAXRH(x1, ed); + STLXRH(x3, gd, ed); + CBNZx_MARKLOCK(x3); + B_MARK2_nocond; + MARK; + LDRH_U12(x1, ed, 0); + STRH_U12(gd, ed, 0); + MARK2; + DMB_ISH(); + BFIx(gd, x1, 0, 16); + } + break; + case 0x89: INST_NAME("MOV Ew, Gw"); nextop = F8; |