about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-16 15:08:56 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-16 15:08:56 +0200
commitb26a20e709fb8673fcab6930a879ff86d181055e (patch)
tree25d8f154d7a5612b4ab7f4598e052b4125a9f7bb /src
parentd7eb87129eb6aa7eeac61ddeeb1357a654380e4b (diff)
downloadbox64-b26a20e709fb8673fcab6930a879ff86d181055e.tar.gz
box64-b26a20e709fb8673fcab6930a879ff86d181055e.zip
[ARM64_DYNAREC] More handling of low precision x87 flag change
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_d9.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_db.c1
-rw-r--r--src/dynarec/arm64/dynarec_arm64_dd.c1
3 files changed, 4 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_d9.c b/src/dynarec/arm64/dynarec_arm64_d9.c
index ca18951a..fe7242df 100644
--- a/src/dynarec/arm64/dynarec_arm64_d9.c
+++ b/src/dynarec/arm64/dynarec_arm64_d9.c
@@ -562,6 +562,8 @@ uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 INST_NAME("FLDCW Ew");
                 GETEW(x1, 0);
                 STRH_U12(x1, xEmu, offsetof(x64emu_t, cw));    // hopefully cw is not too far for an imm8
+                if(dyn->need_x87check)
+                    UBFXw(x87pc, x1, 8, 2);
                 break;
             case 6:
                 INST_NAME("FNSTENV Ed");
diff --git a/src/dynarec/arm64/dynarec_arm64_db.c b/src/dynarec/arm64/dynarec_arm64_db.c
index 1de2a9a6..1cda1140 100644
--- a/src/dynarec/arm64/dynarec_arm64_db.c
+++ b/src/dynarec/arm64/dynarec_arm64_db.c
@@ -134,6 +134,7 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             MESSAGE(LOG_DUMP, "Need Optimization (FNINIT)\n");
             x87_purgecache(dyn, ninst, 0, x1, x2, x3);
             CALL(reset_fpu, -1);
+            ARM64_CHECK_PRECISION();
             break;
         case 0xE8:
         case 0xE9:
diff --git a/src/dynarec/arm64/dynarec_arm64_dd.c b/src/dynarec/arm64/dynarec_arm64_dd.c
index 623551d4..68a430da 100644
--- a/src/dynarec/arm64/dynarec_arm64_dd.c
+++ b/src/dynarec/arm64/dynarec_arm64_dd.c
@@ -206,6 +206,7 @@ uintptr_t dynarec64_DD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 if(ed!=x1) {MOVx_REG(x1, ed);}
                 CALL(native_fsave, -1);
                 CALL(reset_fpu, -1);
+                ARM64_CHECK_PRECISION();
                 break;
             case 7:
                 INST_NAME("FNSTSW m2byte");