From 20432122de2634dfa8da79f97a3695fce6c97498 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 3 Dec 2024 14:36:23 +0100 Subject: [PATCH] [INTERPRETER] Fixed D9 F4 opcode ([DYNAREC] too) (backported from box64) --- src/dynarec/dynarec_arm_functions.c | 18 ++++++++++++++---- src/emu/x86rund9.c | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/dynarec/dynarec_arm_functions.c b/src/dynarec/dynarec_arm_functions.c index fe1a6300..c1fe888b 100755 --- a/src/dynarec/dynarec_arm_functions.c +++ b/src/dynarec/dynarec_arm_functions.c @@ -62,10 +62,20 @@ void arm_fpatan(x86emu_t* emu) } void arm_fxtract(x86emu_t* emu) { - int32_t tmp32s = (ST1.q&0x7ff0000000000000LL)>>52; - tmp32s -= 1023; - ST1.d /= exp2(tmp32s); - ST0.d = tmp32s; + int tmp32s; + if(isnan(ST1.d)) { + ST0.d = ST1.d; + } else if(isinf(ST1.d)) { + ST0.d = ST1.d; + ST1.d = INFINITY; + } else if(ST1.d==0.0) { + ST0.d = ST1.d; + ST1.d = -INFINITY; + } else { + // LD80bits doesn't have implicit "1" bit, so need to adjust for that + ST0.d = frexp(ST1.d, &tmp32s)*2; + ST1.d = tmp32s-1; + } } void arm_fprem(x86emu_t* emu) { diff --git a/src/emu/x86rund9.c b/src/emu/x86rund9.c index 9567c0e2..8c31d618 100755 --- a/src/emu/x86rund9.c +++ b/src/emu/x86rund9.c @@ -144,9 +144,20 @@ uintptr_t RunD9(x86emu_t *emu, uintptr_t addr) emu->sw.f.F87_C1 = 0; break; case 0xF4: /* FXTRACT */ - ST0.d = frexp(ST0.d, &tmp32s); fpu_do_push(emu); - ST0.d = tmp32s; + if(isnan(ST1.d)) { + ST0.d = ST1.d; + } else if(isinf(ST1.d)) { + ST0.d = ST1.d; + ST1.d = INFINITY; + } else if(ST1.d==0.0) { + ST0.d = ST1.d; + ST1.d = -INFINITY; + } else { + // LD80bits doesn't have implicit "1" bit, so need to adjust for that + ST0.d = frexp(ST1.d, &tmp32s)*2; + ST1.d = tmp32s-1; + } // C1 set only if stack under/overflow occurs break;