diff options
Diffstat (limited to 'src/dynarec/dynarec_native_functions.c')
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c index e2e149f2..4b72ea01 100644 --- a/src/dynarec/dynarec_native_functions.c +++ b/src/dynarec/dynarec_native_functions.c @@ -59,10 +59,20 @@ void native_fpatan(x64emu_t* emu) } void native_fxtract(x64emu_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 native_fprem(x64emu_t* emu) { |