diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-22 17:55:06 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-22 17:55:06 +0000 |
| commit | b6188abeeb034062a240d3dd56d0b1cfe0eb69a0 (patch) | |
| tree | 4f4f7241fcb65aa9ccccf7f9715aaee970265c5a /src | |
| parent | 1cd9fac9fb941c93fe8f0117cbfb673615862743 (diff) | |
| download | box64-b6188abeeb034062a240d3dd56d0b1cfe0eb69a0.tar.gz box64-b6188abeeb034062a240d3dd56d0b1cfe0eb69a0.zip | |
[RV64_DYNAREC] Added F3 0F 10 and 11 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f20f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f30f.c | 33 |
2 files changed, 34 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f20f.c b/src/dynarec/rv64/dynarec_rv64_f20f.c index b6bc6086..1cbe5d00 100644 --- a/src/dynarec/rv64/dynarec_rv64_f20f.c +++ b/src/dynarec/rv64/dynarec_rv64_f20f.c @@ -58,7 +58,7 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } else { SMREAD(); v0 = sse_get_reg_empty(dyn, ninst, x1, gd, 0); - addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 8, 0); FLD(v0, ed, fixedaddress); // reset upper part SD(xZR, xEmu, offsetof(x64emu_t, xmm[gd])+8); diff --git a/src/dynarec/rv64/dynarec_rv64_f30f.c b/src/dynarec/rv64/dynarec_rv64_f30f.c index bceaa6e7..4aa1a12b 100644 --- a/src/dynarec/rv64/dynarec_rv64_f30f.c +++ b/src/dynarec/rv64/dynarec_rv64_f30f.c @@ -47,6 +47,39 @@ uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int MAYUSE(j64); switch(opcode) { + case 0x10: + INST_NAME("MOVSS Gx, Ex"); + nextop = F8; + GETG; + if(MODREG) { + v0 = sse_get_reg(dyn, ninst, x1, gd, 1); + q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 1); + FMVS(v0, q0); + } else { + v0 = sse_get_reg_empty(dyn, ninst, x1, gd, 1); + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 8, 0); + FLW(v0, ed, fixedaddress); + // reset upper part + SW(xZR, xEmu, offsetof(x64emu_t, xmm[gd])+4); + SD(xZR, xEmu, offsetof(x64emu_t, xmm[gd])+8); + } + break; + case 0x11: + INST_NAME("MOVSS Ex, Gx"); + nextop = F8; + GETG; + v0 = sse_get_reg(dyn, ninst, x1, gd, 1); + if(MODREG) { + q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 1); + FMVS(q0, v0); + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); + FSW(v0, ed, fixedaddress); + SMWRITE2(); + } + break; + case 0x1E: INST_NAME("NOP / ENDBR32 / ENDBR64"); nextop = F8; |