diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-08 05:15:47 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-07 23:15:47 +0200 |
| commit | c59b9f2686190e7e0e8063929393928be952d299 (patch) | |
| tree | 4fb884836ece3e7f0e09a33c87d72641e62d5ab3 /src | |
| parent | 98431d8cf577dc00050b51103165c448cd9fea21 (diff) | |
| download | box64-c59b9f2686190e7e0e8063929393928be952d299.tar.gz box64-c59b9f2686190e7e0e8063929393928be952d299.zip | |
[LA64_DYNAREC] Refined F3 0F 5D/5F MINSS/MAXSS opcodes (#2912)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_f30f.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/src/dynarec/la64/dynarec_la64_f30f.c b/src/dynarec/la64/dynarec_la64_f30f.c index daad35f4..0c113ddd 100644 --- a/src/dynarec/la64/dynarec_la64_f30f.c +++ b/src/dynarec/la64/dynarec_la64_f30f.c @@ -271,15 +271,14 @@ uintptr_t dynarec64_F30F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int nextop = F8; GETGX(d0, 1); GETEXSS(d1, 0, 0); - FCMP_S(fcc0, d0, d1, cUN); - BCNEZ_MARK(fcc0); - FCMP_S(fcc1, d1, d0, cLT); - BCEQZ_MARK2(fcc1); - MARK; - v1 = fpu_get_scratch(dyn); - FMOV_S(v1, d1); - VEXTRINS_W(d0, v1, 0); - MARK2; + q0 = fpu_get_scratch(dyn); + if (BOX64ENV(dynarec_fastnan)) { + FMIN_S(q0, d0, d1); + } else { + FCMP_S(fcc0, d1, d0, cULE); + FSEL(q0, d0, d1, fcc0); + } + VEXTRINS_W(d0, q0, 0); break; case 0x5E: INST_NAME("DIVSS Gx, Ex"); @@ -295,15 +294,14 @@ uintptr_t dynarec64_F30F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int nextop = F8; GETGX(d0, 1); GETEXSS(d1, 0, 0); - FCMP_S(fcc0, d0, d1, cUN); - BCNEZ_MARK(fcc0); - FCMP_S(fcc1, d0, d1, cLT); - BCEQZ_MARK2(fcc1); - MARK; - v1 = fpu_get_scratch(dyn); - FMOV_S(v1, d1); - VEXTRINS_W(d0, v1, 0); - MARK2; + q0 = fpu_get_scratch(dyn); + if (BOX64ENV(dynarec_fastnan)) { + FMAX_S(q0, d0, d1); + } else { + FCMP_S(fcc0, d1, d0, cLT); + FSEL(q0, d1, d0, fcc0); + } + VEXTRINS_W(d0, q0, 0); break; case 0x6F: INST_NAME("MOVDQU Gx, Ex"); |