diff options
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 20 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_0f.c | 28 | ||||
| -rw-r--r-- | system/box64.box64rc | 6 |
3 files changed, 16 insertions, 38 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index 83f7b3b4..ccff6c02 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -1233,13 +1233,9 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETEX(v1, 0, 0); // FMIN/FMAX wll not copy the value if v0[x] is NaN // but x86 will copy if either v0[x] or v1[x] is NaN, so lets force a copy if source is NaN - if(BOX64ENV(dynarec_fastnan)) { - VFMINQS(v0, v0, v1); - } else { - q0 = fpu_get_scratch(dyn, ninst); - VFCMGTQS(q0, v1, v0); // 0 is NaN or v1 GT v0, so invert mask for copy - VBIFQ(v0, v1, q0); - } + q0 = fpu_get_scratch(dyn, ninst); + VFCMGTQS(q0, v1, v0); // 0 is NaN or v1 GT v0, so invert mask for copy + VBIFQ(v0, v1, q0); break; case 0x5E: INST_NAME("DIVPS Gx, Ex"); @@ -1268,13 +1264,9 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETEX(v1, 0, 0); // FMIN/FMAX wll not copy the value if v0[x] is NaN // but x86 will copy if either v0[x] or v1[x] is NaN, or if values are equals, so lets force a copy if source is NaN - if(BOX64ENV(dynarec_fastnan)) { - VFMAXQS(v0, v0, v1); - } else { - q0 = fpu_get_scratch(dyn, ninst); - VFCMGTQS(q0, v0, v1); // 0 is NaN or v0 GT v1, so invert mask for copy - VBIFQ(v0, v1, q0); - } + q0 = fpu_get_scratch(dyn, ninst); + VFCMGTQS(q0, v0, v1); // 0 is NaN or v0 GT v1, so invert mask for copy + VBIFQ(v0, v1, q0); break; case 0x60: INST_NAME("PUNPCKLBW Gm,Em"); diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_0f.c index dc3d07ae..668ece1d 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_0f.c @@ -550,20 +550,14 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x5D: INST_NAME("VMINPS Gx, Vx, Ex"); nextop = F8; - if(!BOX64ENV(dynarec_fastnan)) { - q0 = fpu_get_scratch(dyn, ninst); - } + q0 = fpu_get_scratch(dyn, ninst); for(int l=0; l<1+vex.l; ++l) { if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); } // FMIN/FMAX wll not copy a NaN if either is NaN // but x86 will copy src2 if either value is NaN, so lets force a copy of Src2 (Ex) if result is NaN - if(BOX64ENV(dynarec_fastnan)) { - VFMINQS(v0, v2, v1); - } else { - VFCMGTQS(q0, v1, v2); // 0 if NaN or v1 GT v2, so invert mask for copy - if(v0!=v1) VBIFQ(v0, v1, q0); - if(v0!=v2) VBITQ(v0, v2, q0); - } + VFCMGTQS(q0, v1, v2); // 0 if NaN or v1 GT v2, so invert mask for copy + if(v0!=v1) VBIFQ(v0, v1, q0); + if(v0!=v2) VBITQ(v0, v2, q0); } if(!vex.l) YMM0(gd); break; @@ -594,20 +588,14 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x5F: INST_NAME("VMAXPS Gx, Vx, Ex"); nextop = F8; - if(!BOX64ENV(dynarec_fastnan)) { - q0 = fpu_get_scratch(dyn, ninst); - } + q0 = fpu_get_scratch(dyn, ninst); for(int l=0; l<1+vex.l; ++l) { if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); } // FMIN/FMAX wll not copy a NaN if either is NaN // but x86 will copy src2 if either value is NaN, so lets force a copy of Src2 (Ex) if result is NaN - if(BOX64ENV(dynarec_fastnan)) { - VFMAXQS(v0, v2, v1); - } else { - VFCMGTQS(q0, v2, v1); // 0 if NaN or v2 GT v1, so invert mask for copy - if(v0!=v1) VBIFQ(v0, v1, q0); - if(v0!=v2) VBITQ(v0, v2, q0); - } + VFCMGTQS(q0, v2, v1); // 0 if NaN or v2 GT v1, so invert mask for copy + if(v0!=v1) VBIFQ(v0, v1, q0); + if(v0!=v2) VBITQ(v0, v2, q0); } if(!vex.l) YMM0(gd); break; diff --git a/system/box64.box64rc b/system/box64.box64rc index 7ff5e8c2..18397c58 100644 --- a/system/box64.box64rc +++ b/system/box64.box64rc @@ -645,7 +645,6 @@ BOX64_DYNAREC_STRONGMEM=1 [MiSideFull.exe] BOX64_DYNAREC_STRONGMEM=1 -BOX64_DYNAREC_FASTNAN=0 # fixes graphical issues like invisible mita's skirt BOX64_DYNAREC_BIGBLOCK=2 BOX64_DYNAREC_CALLRET=1 @@ -665,7 +664,6 @@ BOX64_DYNAREC_BIGBLOCK=3 BOX64_DYNAREC_SAFEFLAGS=2 BOX64_DYNAREC_DIRTY=1 BOX64_DYNAREC_CALLRET=1 -BOX64_DYNAREC_FASTNAN=0 [NeedForSpeedPayback.exe] BOX64_DYNAREC_STRONGMEM=0 @@ -758,7 +756,7 @@ BOX64_DYNAREC_STRONGMEM=1 BOX64_DYNAREC_BIGBLOCK=3 BOX64_DYNAREC_CALLRET=1 BOX64_SSE_FLUSHTO0=1 -BOX64_DYNAREC_FASTNAN=0 +BOX64_DYNAREC_FASTNAN=0 #needed to avoid freeze BOX64_DYNAREC_FASTROUND=0 [RocketLeague.exe] @@ -803,7 +801,7 @@ BOX64_DYNAREC_STRONGMEM=1 [Talos2-Win64-Shipping.exe] BOX64_DYNAREC_BIGBLOCK=3 BOX64_DYNAREC_CALLRET=1 -BOX64_DYNAREC_FASTNAN=0 # Avoid a freeze at 80% +#BOX64_DYNAREC_FASTNAN=0 # Avoid a freeze at 80%; might be solved now [TESV.exe] BOX64_DYNAREC_SAFEFLAGS=2 |