diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-04-09 14:41:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-09 08:41:36 +0200 |
| commit | 24f2720df43c4570ab9d344a688e0a36d0a8fa88 (patch) | |
| tree | 04e3028d83969421887e29468106f46b416b9144 /src | |
| parent | d9c30c8942888d609d89df5b8ea29071d2663b46 (diff) | |
| download | box64-24f2720df43c4570ab9d344a688e0a36d0a8fa88.tar.gz box64-24f2720df43c4570ab9d344a688e0a36d0a8fa88.zip | |
[TESTS] Disable compiler optimizations for test17 and some related fixes (#677)
* [TESTS] Disable compiler optimizations for test17 * [INTERP] Fixed MAXSD/MINSD when both sources are 0 * [RV64_DYNAREC] Fixed F2 0F 5D MINSD opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f20f.c | 8 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 4 |
2 files changed, 11 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f20f.c b/src/dynarec/rv64/dynarec_rv64_f20f.c index 6cb62e3c..2a8089a1 100644 --- a/src/dynarec/rv64/dynarec_rv64_f20f.c +++ b/src/dynarec/rv64/dynarec_rv64_f20f.c @@ -161,7 +161,13 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int INST_NAME("MINSD Gx, Ex"); nextop = F8; GETGXSD(v0); - GETEXSD(v1, 0); + GETEXSD(v1, 0); + d0 = sse_get_reg_empty(dyn, ninst, x1, x4, 0); + FMVDX(d0, xZR); + FEQD(x2, v0, d0); + FEQD(x3, v1, d0); + AND(x2, x2, x3); + BNE_MARK(x2, xZR); FEQD(x2, v0, v0); FEQD(x3, v1, v1); AND(x2, x2, x3); diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c index 10da2f09..33750318 100644 --- a/src/emu/x64runf20f.c +++ b/src/emu/x64runf20f.c @@ -205,6 +205,8 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) nextop = F8; GETEX(0); GETGX; + if (GX->d[0] == 0.0 && EX->d[0] == 0.0) + GX->d[0] = EX->d[0]; if (isnan(GX->d[0]) || isnan(EX->d[0]) || isless(EX->d[0], GX->d[0])) GX->d[0] = EX->d[0]; break; @@ -225,6 +227,8 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) nextop = F8; GETEX(0); GETGX; + if (GX->d[0] == 0.0 && EX->d[0] == 0.0) + GX->d[0] = EX->d[0]; if (isnan(GX->d[0]) || isnan(EX->d[0]) || isgreater(EX->d[0], GX->d[0])) GX->d[0] = EX->d[0]; break; |