diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-21 20:09:26 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-21 14:09:26 +0200 |
| commit | 20ea2987a8f6a373e1d982797277323f84b2cc36 (patch) | |
| tree | 954f055fb57dbfc0c3469e731acec96625f663b5 /src | |
| parent | eee547d50a7da5290e780b5d2c95d45f76959905 (diff) | |
| download | box64-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.c | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_d9.c | 7 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_db.c | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_dd.c | 1 |
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"); |