about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-22 19:31:04 +0800
committerGitHub <noreply@github.com>2025-04-22 13:31:04 +0200
commitad494480ce5dfdb4c5c712802cdc3668916b2f2c (patch)
treeab2f9886828dd428bbdf68290fd0d021a3b1430b /src
parent854f6675db48245ebb520b6f6a2caefeefc05e1c (diff)
downloadbox64-ad494480ce5dfdb4c5c712802cdc3668916b2f2c.tar.gz
box64-ad494480ce5dfdb4c5c712802cdc3668916b2f2c.zip
[DYNAREC] Added a x87pc test and some cosmetic changes too (#2561)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_d8.c36
-rw-r--r--src/dynarec/arm64/dynarec_arm64_d9.c3
-rw-r--r--src/dynarec/arm64/dynarec_arm64_da.c6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_dc.c24
-rw-r--r--src/dynarec/arm64/dynarec_arm64_de.c24
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.h14
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass0.h6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass1.h12
-rw-r--r--src/dynarec/rv64/dynarec_rv64_d8.c36
-rw-r--r--src/dynarec/rv64/dynarec_rv64_d9.c3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_da.c6
-rw-r--r--src/dynarec/rv64/dynarec_rv64_dc.c19
-rw-r--r--src/dynarec/rv64/dynarec_rv64_de.c18
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h13
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass0.h7
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass1.h14
16 files changed, 83 insertions, 158 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_d8.c b/src/dynarec/arm64/dynarec_arm64_d8.c
index f7ccac5e..32b26566 100644
--- a/src/dynarec/arm64/dynarec_arm64_d8.c
+++ b/src/dynarec/arm64/dynarec_arm64_d8.c
@@ -56,9 +56,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FADDS(v1, v1, v2);
             } else {
                 FADDD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -79,9 +78,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FMULS(v1, v1, v2);
             } else {
                 FMULD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -139,9 +137,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FSUBS(v1, v1, v2);
             } else {
                 FSUBD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -162,9 +159,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FSUBS(v1, v2, v1);
             } else {
                 FSUBD(v1, v2, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -185,9 +181,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FDIVS(v1, v1, v2);
             } else {
                 FDIVD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -208,9 +203,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FDIVS(v1, v2, v1);
             } else {
                 FDIVD(v1, v2, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -232,9 +226,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     FCVT_D_S(s0, s0);
                     FADDD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -251,9 +244,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     FCVT_D_S(s0, s0);
                     FMULD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -299,9 +291,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     FCVT_D_S(s0, s0);
                     FSUBD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -318,9 +309,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     FCVT_D_S(s0, s0);
                     FSUBD(v1, s0, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -337,9 +327,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     FCVT_D_S(s0, s0);
                     FDIVD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -356,9 +345,8 @@ uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 } else {
                     FCVT_D_S(s0, s0);
                     FDIVD(v1, s0, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
diff --git a/src/dynarec/arm64/dynarec_arm64_d9.c b/src/dynarec/arm64/dynarec_arm64_d9.c
index cd5a5b78..787b597f 100644
--- a/src/dynarec/arm64/dynarec_arm64_d9.c
+++ b/src/dynarec/arm64/dynarec_arm64_d9.c
@@ -430,9 +430,8 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FSQRTS(v1, v1);
             } else {
                 FSQRTD(v1, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
diff --git a/src/dynarec/arm64/dynarec_arm64_da.c b/src/dynarec/arm64/dynarec_arm64_da.c
index 40387735..8189f43f 100644
--- a/src/dynarec/arm64/dynarec_arm64_da.c
+++ b/src/dynarec/arm64/dynarec_arm64_da.c
@@ -151,7 +151,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x5, x4);
                 FADDD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -167,7 +166,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x5, x4);
                 FMULD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -206,7 +204,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x5, x4);
                 FSUBD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -222,7 +219,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x5, x4);
                 FSUBD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -238,7 +234,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x5, x4);
                 FDIVD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -254,7 +249,6 @@ uintptr_t dynarec64_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x5, x4);
                 FDIVD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
diff --git a/src/dynarec/arm64/dynarec_arm64_dc.c b/src/dynarec/arm64/dynarec_arm64_dc.c
index 3ff95fe6..ccdff070 100644
--- a/src/dynarec/arm64/dynarec_arm64_dc.c
+++ b/src/dynarec/arm64/dynarec_arm64_dc.c
@@ -54,9 +54,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FADDS(v1, v1, v2);
             } else {
                 FADDD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -77,9 +76,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FMULS(v1, v1, v2);
             } else {
                 FMULD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -137,9 +135,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FSUBS(v1, v2, v1);
             } else {
                 FSUBD(v1, v2, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -160,9 +157,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FSUBS(v1, v1, v2);
             } else {
                 FSUBD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -183,9 +179,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FDIVS(v1, v2, v1);
             } else {
                 FDIVD(v1, v2, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -206,9 +201,8 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FDIVS(v1, v1, v2);
             } else {
                 FDIVD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             break;
@@ -227,7 +221,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x2, x4);
                 FADDD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -241,7 +234,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x2, x4);
                 FMULD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -274,7 +266,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x2, x4);
                 FSUBD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -288,7 +279,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x2, x4);
                 FSUBD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -302,7 +292,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x2, x4);
                 FDIVD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
@@ -316,7 +305,6 @@ uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     u8 = x87_setround(dyn, ninst, x1, x2, x4);
                 FDIVD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if(!BOX64ENV(dynarec_fastround))
                     x87_restoreround(dyn, ninst, u8);
                 break;
diff --git a/src/dynarec/arm64/dynarec_arm64_de.c b/src/dynarec/arm64/dynarec_arm64_de.c
index 2d861f2b..f1754ebb 100644
--- a/src/dynarec/arm64/dynarec_arm64_de.c
+++ b/src/dynarec/arm64/dynarec_arm64_de.c
@@ -54,9 +54,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FADDS(v1, v1, v2);
             } else {
                 FADDD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             X87_POP_OR_FAIL(dyn, ninst, x3);
@@ -78,9 +77,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FMULS(v1, v1, v2);
             } else {
                 FMULD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             X87_POP_OR_FAIL(dyn, ninst, x3);
@@ -134,9 +132,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FSUBS(v1, v2, v1);
             } else {
                 FSUBD(v1, v2, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             X87_POP_OR_FAIL(dyn, ninst, x3);
@@ -158,9 +155,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FSUBS(v1, v1, v2);
             } else {
                 FSUBD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             X87_POP_OR_FAIL(dyn, ninst, x3);
@@ -182,9 +178,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FDIVS(v1, v2, v1);
             } else {
                 FDIVD(v1, v2, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             X87_POP_OR_FAIL(dyn, ninst, x3);
@@ -206,9 +201,8 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 FDIVS(v1, v1, v2);
             } else {
                 FDIVD(v1, v1, v2);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if(!BOX64ENV(dynarec_fastround))
                 x87_restoreround(dyn, ninst, u8);
             X87_POP_OR_FAIL(dyn, ninst, x3);
@@ -229,7 +223,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 SCVTFDD(v2, v2);
                 FADDD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 break;
             case 1:
                 INST_NAME("FIMUL ST0, word[ED]");
@@ -242,7 +235,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 SCVTFDD(v2, v2);
                 FMULD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 break;
             case 2:
                 INST_NAME("FICOM ST0, word[ED]");
@@ -280,7 +272,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 SCVTFDD(v2, v2);
                 FSUBD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 break;
             case 5:
                 INST_NAME("FISUBR ST0, word[ED]");
@@ -293,7 +284,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 SCVTFDD(v2, v2);
                 FSUBD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 break;
             case 6:
                 INST_NAME("FIDIV ST0, word[ED]");
@@ -306,7 +296,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 SCVTFDD(v2, v2);
                 FDIVD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 break;
             case 7:
                 INST_NAME("FIDIVR ST0, word[ED]");
@@ -319,7 +308,6 @@ uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 SCVTFDD(v2, v2);
                 FDIVD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 break;
         }
     return addr;
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index 7cbb8ff1..ded76a69 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -1006,16 +1006,14 @@
     }
 #endif
 #ifndef X87_CHECK_PRECISION
-#define X87_CHECK_PRECISION(A)                      \
-    if(dyn->need_x87check) {                        \
-        CBNZw(x87pc, 4+8);                          \
-        FCVT_S_D(A, A);                             \
-        FCVT_D_S(A, A);                             \
+#define X87_CHECK_PRECISION(A)               \
+    if (!ST_IS_F(0) && dyn->need_x87check) { \
+        CBNZw(x87pc, 4 + 8);                 \
+        FCVT_S_D(A, A);                      \
+        FCVT_D_S(A, A);                      \
     }
 #endif
-#ifndef MARK_X87PC
-#define MARK_X87PC()
-#endif
+
 #define STORE_REG(A)    STRx_U12(x##A, xEmu, offsetof(x64emu_t, regs[_##A]))
 #define STP_REGS(A, B)  STPx_S7_offset(x##A, x##B, xEmu, offsetof(x64emu_t, regs[_##A]))
 #define LDP_REGS(A, B)  LDPx_S7_offset(x##A, x##B, xEmu, offsetof(x64emu_t, regs[_##A]))
diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h
index 2bd18ac5..d1e6d7d8 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass0.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass0.h
@@ -74,5 +74,7 @@
 #define IF_ALIGNED(A)   if(!(dyn->insts[ninst].unaligned=is_addr_unaligned(A)))
 
 #define NATIVE_RESTORE_X87PC()
-#define X87_CHECK_PRECISION(A)
-#define MARK_X87PC()   if(dyn->need_x87check) dyn->insts[ninst].x87precision = 1
\ No newline at end of file
+#define X87_CHECK_PRECISION(A)                                      \
+    do {                                                            \
+        if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1; \
+    } while (0)
diff --git a/src/dynarec/arm64/dynarec_arm64_pass1.h b/src/dynarec/arm64/dynarec_arm64_pass1.h
index 0f904c61..ba8b11a6 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass1.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass1.h
@@ -24,9 +24,11 @@
 #define INST_NAME(name)
 
 #define NATIVE_RESTORE_X87PC()
-#define X87_CHECK_PRECISION(A)      \
-    do {                            \
-        if (dyn->need_x87check)     \
-            dyn->need_x87check = 2; \
+#define X87_CHECK_PRECISION(A)                  \
+    do {                                        \
+        if (dyn->need_x87check) {               \
+            dyn->insts[ninst].x87precision = 1; \
+            if (!ST_IS_F(0))                    \
+                dyn->need_x87check = 2;         \
+        }                                       \
     } while (0)
-#define MARK_X87PC()   if(dyn->need_x87check) dyn->insts[ninst].x87precision = 1
\ No newline at end of file
diff --git a/src/dynarec/rv64/dynarec_rv64_d8.c b/src/dynarec/rv64/dynarec_rv64_d8.c
index 83de0eec..25a8fed5 100644
--- a/src/dynarec/rv64/dynarec_rv64_d8.c
+++ b/src/dynarec/rv64/dynarec_rv64_d8.c
@@ -52,9 +52,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FADDS(v1, v1, v2);
                 } else {
                     FADDD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xC8 ... 0xCF:
@@ -66,9 +65,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FMULS(v1, v1, v2);
                 } else {
                     FMULD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xD0 ... 0xD7:
@@ -101,9 +99,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FSUBS(v1, v1, v2);
                 } else {
                     FSUBD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xE8 ... 0xEF:
@@ -115,9 +112,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FSUBS(v1, v2, v1);
                 } else {
                     FSUBD(v1, v2, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xF0 ... 0xF7:
@@ -129,9 +125,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FDIVS(v1, v1, v2);
                 } else {
                     FDIVD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xF8 ... 0xFF:
@@ -143,9 +138,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FDIVS(v1, v2, v1);
                 } else {
                     FDIVD(v1, v2, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             default:
@@ -166,9 +160,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 } else {
                     FCVTDS(s0, s0);
                     FADDD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 1:
@@ -183,9 +176,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 } else {
                     FCVTDS(s0, s0);
                     FMULD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 2:
@@ -227,9 +219,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 } else {
                     FCVTDS(s0, s0);
                     FSUBD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 5:
@@ -244,9 +235,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 } else {
                     FCVTDS(s0, s0);
                     FSUBD(v1, s0, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 6:
@@ -261,9 +251,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 } else {
                     FCVTDS(s0, s0);
                     FDIVD(v1, v1, s0);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 7:
@@ -278,9 +267,8 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 } else {
                     FCVTDS(s0, s0);
                     FDIVD(v1, s0, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
         }
diff --git a/src/dynarec/rv64/dynarec_rv64_d9.c b/src/dynarec/rv64/dynarec_rv64_d9.c
index 5e2e0e32..a5fb073f 100644
--- a/src/dynarec/rv64/dynarec_rv64_d9.c
+++ b/src/dynarec/rv64/dynarec_rv64_d9.c
@@ -349,9 +349,8 @@ uintptr_t dynarec64_D9(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 FSQRTS(v1, v1);
             } else {
                 FSQRTD(v1, v1);
-                X87_CHECK_PRECISION(v1);
             }
-            MARK_X87PC();
+            X87_CHECK_PRECISION(v1);
             if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
             break;
         case 0xFB:
diff --git a/src/dynarec/rv64/dynarec_rv64_da.c b/src/dynarec/rv64/dynarec_rv64_da.c
index 884edb88..72921282 100644
--- a/src/dynarec/rv64/dynarec_rv64_da.c
+++ b/src/dynarec/rv64/dynarec_rv64_da.c
@@ -119,7 +119,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5);
                 FADDD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 1:
@@ -132,7 +131,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5);
                 FMULD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 2:
@@ -164,7 +162,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5);
                 FSUBD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 5:
@@ -177,7 +174,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5);
                 FSUBD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 6:
@@ -190,7 +186,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5);
                 FDIVD(v1, v1, v2);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 7:
@@ -203,7 +198,6 @@ uintptr_t dynarec64_DA(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5);
                 FDIVD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
         }
diff --git a/src/dynarec/rv64/dynarec_rv64_dc.c b/src/dynarec/rv64/dynarec_rv64_dc.c
index 80a7f082..76d1cea7 100644
--- a/src/dynarec/rv64/dynarec_rv64_dc.c
+++ b/src/dynarec/rv64/dynarec_rv64_dc.c
@@ -48,9 +48,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FADDS(v1, v1, v2);
                 } else {
                     FADDD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xC8 ... 0xCF:
@@ -62,9 +61,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FMULS(v1, v1, v2);
                 } else {
                     FMULD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xD0 ... 0xD7:
@@ -97,9 +95,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FSUBS(v1, v2, v1);
                 } else {
                     FSUBD(v1, v2, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xE8 ... 0xEF:
@@ -111,9 +108,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FSUBS(v1, v1, v2);
                 } else {
                     FSUBD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xF0 ... 0xF7:
@@ -125,9 +121,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FDIVS(v1, v2, v1);
                 } else {
                     FDIVD(v1, v2, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             case 0xF8 ... 0xFF:
@@ -139,9 +134,8 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FDIVS(v1, v1, v2);
                 } else {
                     FDIVD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
             default:
@@ -226,7 +220,6 @@ uintptr_t dynarec64_DC(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x5);
                 FDIVD(v1, v2, v1);
                 X87_CHECK_PRECISION(v1);
-                MARK_X87PC();
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 break;
         }
diff --git a/src/dynarec/rv64/dynarec_rv64_de.c b/src/dynarec/rv64/dynarec_rv64_de.c
index 50b29a5b..fbb98e0d 100644
--- a/src/dynarec/rv64/dynarec_rv64_de.c
+++ b/src/dynarec/rv64/dynarec_rv64_de.c
@@ -47,9 +47,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FADDS(v1, v1, v2);
                 } else {
                     FADDD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 X87_POP_OR_FAIL(dyn, ninst, x3);
                 break;
@@ -62,9 +61,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FMULS(v1, v1, v2);
                 } else {
                     FMULD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 X87_POP_OR_FAIL(dyn, ninst, x3);
                 break;
@@ -100,9 +98,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FSUBS(v1, v2, v1);
                 } else {
                     FSUBD(v1, v2, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 X87_POP_OR_FAIL(dyn, ninst, x3);
                 break;
@@ -115,9 +112,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FSUBS(v1, v1, v2);
                 } else {
                     FSUBD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 X87_POP_OR_FAIL(dyn, ninst, x3);
                 break;
@@ -130,9 +126,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FDIVS(v1, v2, v1);
                 } else {
                     FDIVD(v1, v2, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 X87_POP_OR_FAIL(dyn, ninst, x3);
                 break;
@@ -145,9 +140,8 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FDIVS(v1, v1, v2);
                 } else {
                     FDIVD(v1, v1, v2);
-                    X87_CHECK_PRECISION(v1);
                 }
-                MARK_X87PC();
+                X87_CHECK_PRECISION(v1);
                 if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8);
                 X87_POP_OR_FAIL(dyn, ninst, x3);
                 break;
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index 9e9e9f42..68962786 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -849,16 +849,13 @@
     }
 #endif
 #ifndef X87_CHECK_PRECISION
-#define X87_CHECK_PRECISION(A) \
-    if (dyn->need_x87check) {  \
-        BNEZ(x87pc, 4 + 8);    \
-        FCVTSD(A, A);          \
-        FCVTDS(A, A);          \
+#define X87_CHECK_PRECISION(A)               \
+    if (!ST_IS_F(0) && dyn->need_x87check) { \
+        BNEZ(x87pc, 4 + 8);                  \
+        FCVTSD(A, A);                        \
+        FCVTDS(A, A);                        \
     }
 #endif
-#ifndef MARK_X87PC
-#define MARK_X87PC()
-#endif
 
 #define STORE_REG(A) SD(x##A, xEmu, offsetof(x64emu_t, regs[_##A]))
 #define LOAD_REG(A)  LD(x##A, xEmu, offsetof(x64emu_t, regs[_##A]))
diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h
index b1f2302c..f2d38d90 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass0.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass0.h
@@ -102,6 +102,7 @@
 #define IF_ALIGNED(A)   if ((dyn->insts[ninst].unaligned = (is_addr_unaligned(A) ? 1 : 0)))
 
 #define NATIVE_RESTORE_X87PC()
-#define X87_CHECK_PRECISION(A)
-#define MARK_X87PC() \
-    if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1
+#define X87_CHECK_PRECISION(A)                                      \
+    do {                                                            \
+        if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1; \
+    } while (0)
diff --git a/src/dynarec/rv64/dynarec_rv64_pass1.h b/src/dynarec/rv64/dynarec_rv64_pass1.h
index fd7d2433..1e1cbc94 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass1.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass1.h
@@ -27,11 +27,11 @@
 
 
 #define NATIVE_RESTORE_X87PC()
-#define X87_CHECK_PRECISION(A)      \
-    do {                            \
-        if (dyn->need_x87check)     \
-            dyn->need_x87check = 2; \
+#define X87_CHECK_PRECISION(A)                  \
+    do {                                        \
+        if (dyn->need_x87check) {               \
+            dyn->insts[ninst].x87precision = 1; \
+            if (!ST_IS_F(0))                    \
+                dyn->need_x87check = 2;         \
+        }                                       \
     } while (0)
-
-#define MARK_X87PC() \
-    if (dyn->need_x87check) dyn->insts[ninst].x87precision = 1