about summary refs log tree commit diff stats
path: root/src/dynarec/arm64
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/dynarec/arm64
parent854f6675db48245ebb520b6f6a2caefeefc05e1c (diff)
downloadbox64-ad494480ce5dfdb4c5c712802cdc3668916b2f2c.tar.gz
box64-ad494480ce5dfdb4c5c712802cdc3668916b2f2c.zip
[DYNAREC] Added a x87pc test and some cosmetic changes too (#2561)
Diffstat (limited to 'src/dynarec/arm64')
-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
8 files changed, 42 insertions, 83 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