about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-21 20:09:26 +0800
committerGitHub <noreply@github.com>2025-04-21 14:09:26 +0200
commit20ea2987a8f6a373e1d982797277323f84b2cc36 (patch)
tree954f055fb57dbfc0c3469e731acec96625f663b5 /src
parenteee547d50a7da5290e780b5d2c95d45f76959905 (diff)
downloadbox64-20ea2987a8f6a373e1d982797277323f84b2cc36.tar.gz
box64-20ea2987a8f6a373e1d982797277323f84b2cc36.zip
[DYNAREC] More handling of low precision x87 flag change (#2556)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_d9.c1
-rw-r--r--src/dynarec/rv64/dynarec_rv64_d9.c7
-rw-r--r--src/dynarec/rv64/dynarec_rv64_db.c1
-rw-r--r--src/dynarec/rv64/dynarec_rv64_dd.c1
4 files changed, 8 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_d9.c b/src/dynarec/arm64/dynarec_arm64_d9.c
index fe7242df..c6615291 100644
--- a/src/dynarec/arm64/dynarec_arm64_d9.c
+++ b/src/dynarec/arm64/dynarec_arm64_d9.c
@@ -557,6 +557,7 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 }
                 MOV32w(x2, 0);
                 CALL(fpu_loadenv, -1);
+                NATIVE_RESTORE_X87PC();
                 break;
             case 5:
                 INST_NAME("FLDCW Ew");
diff --git a/src/dynarec/rv64/dynarec_rv64_d9.c b/src/dynarec/rv64/dynarec_rv64_d9.c
index bcdf3854..39dafc19 100644
--- a/src/dynarec/rv64/dynarec_rv64_d9.c
+++ b/src/dynarec/rv64/dynarec_rv64_d9.c
@@ -92,7 +92,6 @@ uintptr_t dynarec64_D9(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FNEGS(v1, v1);
                 } else {
                     FNEGD(v1, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
                 break;
             case 0xE1:
@@ -102,7 +101,6 @@ uintptr_t dynarec64_D9(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     FABSS(v1, v1);
                 } else {
                     FABSD(v1, v1);
-                    X87_CHECK_PRECISION(v1);
                 }
                 break;
 
@@ -485,11 +483,16 @@ uintptr_t dynarec64_D9(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 0, 0);
                 MOV32w(x2, 0);
                 CALL(fpu_loadenv, -1, ed, x2);
+                NATIVE_RESTORE_X87PC();
                 break;
             case 5:
                 INST_NAME("FLDCW Ew");
                 GETEW(x1, 0);
                 SH(x1, xEmu, offsetof(x64emu_t, cw)); // hopefully cw is not too far for an imm8
+                if (dyn->need_x87check) {
+                    SRLI(x87pc, x1, 8);
+                    ANDI(x87pc, x87pc, 0b11);
+                }
                 break;
             case 6:
                 INST_NAME("FNSTENV Ed");
diff --git a/src/dynarec/rv64/dynarec_rv64_db.c b/src/dynarec/rv64/dynarec_rv64_db.c
index c782e932..26c31b45 100644
--- a/src/dynarec/rv64/dynarec_rv64_db.c
+++ b/src/dynarec/rv64/dynarec_rv64_db.c
@@ -112,6 +112,7 @@ uintptr_t dynarec64_DB(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 MESSAGE(LOG_DUMP, "Need Optimization\n");
                 x87_purgecache(dyn, ninst, 0, x1, x2, x3);
                 CALL(reset_fpu, -1, 0, 0);
+                NATIVE_RESTORE_X87PC();
                 break;
             case 0xE8 ... 0xEF:
                 INST_NAME("FUCOMI ST0, STx");
diff --git a/src/dynarec/rv64/dynarec_rv64_dd.c b/src/dynarec/rv64/dynarec_rv64_dd.c
index 794baa6c..926ac85f 100644
--- a/src/dynarec/rv64/dynarec_rv64_dd.c
+++ b/src/dynarec/rv64/dynarec_rv64_dd.c
@@ -162,6 +162,7 @@ uintptr_t dynarec64_DD(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 addr = geted(dyn, addr, ninst, nextop, &ed, x4, x6, &fixedaddress, rex, NULL, 0, 0);
                 CALL(native_fsave, -1, ed, 0);
                 CALL(reset_fpu, -1, 0, 0);
+                NATIVE_RESTORE_X87PC();
                 break;
             case 7:
                 INST_NAME("FNSTSW m2byte");