diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-02-07 20:28:02 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-07 13:28:02 +0100 |
| commit | ba6ff73c6922322b2b37a6c7063bc1645c00cfab (patch) | |
| tree | e4897c32fdc60222a4773b39e52e4867ce6484a4 /src | |
| parent | 2bf78ea18cf9985eecaebf9ddf5ac4aa4b53a015 (diff) | |
| download | box64-ba6ff73c6922322b2b37a6c7063bc1645c00cfab.tar.gz box64-ba6ff73c6922322b2b37a6c7063bc1645c00cfab.zip | |
[LA64_DYNAREC] Added more opcodes (#2323)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_0f.c | 11 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_f0.c | 17 | ||||
| -rw-r--r-- | src/dynarec/la64/la64_emitter.h | 2 |
3 files changed, 30 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c index 73ce14e5..a260ccc6 100644 --- a/src/dynarec/la64/dynarec_la64_0f.c +++ b/src/dynarec/la64/dynarec_la64_0f.c @@ -1281,6 +1281,17 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 7: VFCMP_S(v0, v0, v1, cOR); break; // not NaN } break; + case 0xC3: + INST_NAME("MOVNTI Ed, Gd"); + nextop = F8; + GETGD; + if (MODREG) { + MVxw(TO_NAT((nextop & 7) + (rex.b << 3)), gd); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); + SDxw(gd, ed, fixedaddress); + } + break; case 0xC6: INST_NAME("SHUFPS Gx, Ex, Ib"); nextop = F8; diff --git a/src/dynarec/la64/dynarec_la64_f0.c b/src/dynarec/la64/dynarec_la64_f0.c index d19e9f70..4ff48729 100644 --- a/src/dynarec/la64/dynarec_la64_f0.c +++ b/src/dynarec/la64/dynarec_la64_f0.c @@ -424,6 +424,23 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } SMDMB(); break; + case 0x21: + INST_NAME("LOCK AND Ed, Gd"); + SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); + nextop = F8; + GETGD; + SMDMB(); + if (MODREG) { + ed = TO_NAT((nextop & 7) + (rex.b << 3)); + emit_and32(dyn, ninst, rex, ed, gd, x3, x4); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0); + AMAND_DBxw(x1, gd, wback); + IFXORNAT (X_ALL | X_PEND) + emit_and32(dyn, ninst, rex, x1, gd, x3, x4); + } + SMDMB(); + break; case 0x29: INST_NAME("LOCK SUB Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); diff --git a/src/dynarec/la64/la64_emitter.h b/src/dynarec/la64/la64_emitter.h index 6d8e507f..257fcae6 100644 --- a/src/dynarec/la64/la64_emitter.h +++ b/src/dynarec/la64/la64_emitter.h @@ -853,6 +853,8 @@ f24-f31 fs0-fs7 Static registers Callee #define AMMIN_DB_WU(rd, rk, rj) EMIT(type_3R(0b00111000011100010, rk, rj, rd)) #define AMMIN_DB_DU(rd, rk, rj) EMIT(type_3R(0b00111000011100011, rk, rj, rd)) +#define AMAND_DBxw(rd, rk, rj) EMIT(type_3R(0b00111000011010110 | rex.w, rk, rj, rd)) + #define FLD_D(fd, rj, imm12) EMIT(type_2RI12(0b0010101110, imm12, rj, fd)) #define FLD_S(fd, rj, imm12) EMIT(type_2RI12(0b0010101100, imm12, rj, fd)) #define FST_D(fd, rj, imm12) EMIT(type_2RI12(0b0010101111, imm12, rj, fd)) |