diff options
| author | Yang Liu <numbksco@gmail.com> | 2023-05-28 17:19:12 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-28 11:19:12 +0200 |
| commit | 4b81cfcb479bac540e2dd936889edca0e5a7506e (patch) | |
| tree | e08d9ef573085b7e86ddc735449e0b850f1181ca /src | |
| parent | a7074f03f7ed00e2a88fb6abf8f1a725d56da9da (diff) | |
| download | box64-4b81cfcb479bac540e2dd936889edca0e5a7506e.tar.gz box64-4b81cfcb479bac540e2dd936889edca0e5a7506e.zip | |
[RV64_DYNAREC] Added more opcodes (#806)
* [RV64_DYNAREC] Added DC /6 FDIV opcode * [RV64_DYNAREC] Added 66 0F 13 MOVLPD opcode * [RV64_DYNAREC] Added 66 19 SBB opcode * [RV64_DYNAREC] Added F0 29 LOCK SUB opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 10 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 14 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_dc.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 21 |
4 files changed, 53 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index afa95515..36359a20 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -122,6 +122,16 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x0F: addr = dynarec64_660F(dyn, addr, ip, ninst, rex, ok, need_epilog); break; + case 0x19: + INST_NAME("SBB Ew, Gw"); + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET_PENDING); + nextop = F8; + GETGW(x2); + GETEW(x1, 0); + emit_sbb16(dyn, ninst, x1, x2, x4, x5, x6); + EWBACK; + break; case 0x1B: INST_NAME("SBB Gw, Ew"); READFLAGS(X_CF); diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index c95449a4..b3e097eb 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -80,6 +80,20 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int LD(x3, wback, fixedaddress); SD(x3, gback, 0); break; + case 0x13: + INST_NAME("MOVLPD Eq, Gx"); + nextop = F8; + GETGX(x1); + if(MODREG) { + // access register instead of memory is bad opcode! + DEFAULT; + return addr; + } + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x3, &fixedaddress, rex, NULL, 1, 0); + LD(x3, gback, 0); + SD(x3, wback, fixedaddress); + SMWRITE2(); + break; case 0x14: INST_NAME("UNPCKLPD Gx, Ex"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_dc.c b/src/dynarec/rv64/dynarec_rv64_dc.c index 4facfe0e..750789da 100644 --- a/src/dynarec/rv64/dynarec_rv64_dc.c +++ b/src/dynarec/rv64/dynarec_rv64_dc.c @@ -104,6 +104,14 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni x87_do_pop(dyn, ninst, x3); break; + case 6: + INST_NAME("FDIV ST0, double[ED]"); + v1 = x87_get_st(dyn, ninst, x1, x2, 0, EXT_CACHE_ST_D); + v2 = fpu_get_scratch(dyn); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0); + FLD(v2, wback, fixedaddress); + FDIVD(v1, v1, v2); + break; default: DEFAULT; } diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c index 9e184343..cafca95d 100644 --- a/src/dynarec/rv64/dynarec_rv64_f0.c +++ b/src/dynarec/rv64/dynarec_rv64_f0.c @@ -355,6 +355,27 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } SMDMB(); break; + case 0x29: + INST_NAME("LOCK SUB Ed, Gd"); + SETFLAGS(X_ALL, SF_SET_PENDING); + nextop = F8; + GETGD; + SMDMB(); + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + emit_sub32(dyn, ninst, rex, ed, gd, x3, x4, x5); + } else { + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0); + MARKLOCK; + LRxw(x1, wback, 1, 1); + SUB(x4, x1, gd); + SCxw(x3, x4, wback, 1, 1); + BNEZ_MARKLOCK(x3); + IFX(X_ALL|X_PEND) + emit_sub32(dyn, ninst, rex, x1, gd, x3, x4, x5); + } + SMDMB(); + break; case 0x81: case 0x83: nextop = F8; |