diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-03-31 20:06:22 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-31 14:06:22 +0200 |
| commit | 27b1e28f6332c1a1bf79ed2777313f14812e09f9 (patch) | |
| tree | dd4b3e250d60bad7e1bda708b06d3fc91ad293de /src | |
| parent | 4431ef7736587e490c6c122038f4203bb729b8e6 (diff) | |
| download | box64-27b1e28f6332c1a1bf79ed2777313f14812e09f9.tar.gz box64-27b1e28f6332c1a1bf79ed2777313f14812e09f9.zip | |
[RV64_DYNAREC] Added more opcodes (#656)
* [RV64_DYNAREC] Added a TODO * [RV64_DYNAREC] Added F3 0F 5D MINSS opcode * [RV64_DYNAREC] Added F3 0F 5F MAXSS opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f30f.c | 30 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c index c6dff5d9..446d830f 100644 --- a/src/dynarec/rv64/dynarec_rv64_f0.c +++ b/src/dynarec/rv64/dynarec_rv64_f0.c @@ -61,6 +61,8 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0xC1: switch(rep) { case 0: + // TODO: Take care of unligned memory access. + // https://github.com/ptitSeb/box64/pull/604 INST_NAME("LOCK XADD Gd, Ed"); SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_f30f.c b/src/dynarec/rv64/dynarec_rv64_f30f.c index 41c3d62d..53e1daa9 100644 --- a/src/dynarec/rv64/dynarec_rv64_f30f.c +++ b/src/dynarec/rv64/dynarec_rv64_f30f.c @@ -126,6 +126,21 @@ uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEXSS(d0, 0); FSUBS(v0, v0, d0); break; + case 0x5D: + INST_NAME("MINSS Gx, Ex"); + nextop = F8; + GETGXSS(d0); + GETEXSS(d1, 0); + FEQS(x2, d0, d0); + FEQS(x3, d1, d1); + AND(x2, x2, x3); + BEQ_MARK(x2, xZR); + FLTS(x2, d1, d0); + BEQ_MARK2(x2, xZR); + MARK; + FMVS(d0, d1); + MARK2; + break; case 0x5E: INST_NAME("DIVSS Gx, Ex"); nextop = F8; @@ -133,6 +148,21 @@ uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEXSS(d0, 0); FDIVS(v0, v0, d0); break; + case 0x5F: + INST_NAME("MAXSS Gx, Ex"); + nextop = F8; + GETGXSS(d0); + GETEXSS(d1, 0); + FEQS(x2, d0, d0); + FEQS(x3, d1, d1); + AND(x2, x2, x3); + BEQ_MARK(x2, xZR); + FLTS(x2, d0, d1); + BEQ_MARK2(x2, xZR); + MARK; + FMVS(d0, d1); + MARK2; + break; case 0x7E: INST_NAME("MOVQ Gx, Ex"); nextop = F8; |