From 7ac92548b9cf9934ca9533b81f85268eb8044f65 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Mon, 10 Aug 2026 15:56:53 +0800 Subject: [PATCH] [DYNAREC] Hard reset x87 state in EMMS --- src/dynarec/la64/dynarec_la64_0f.c | 5 +++++ src/dynarec/rv64/dynarec_rv64_0f.c | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c index a77c4587e4..3eb9300b9d 100644 --- a/src/dynarec/la64/dynarec_la64_0f.c +++ b/src/dynarec/la64/dynarec_la64_0f.c @@ -1393,6 +1393,11 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni INST_NAME("EMMS"); // empty MMX, FPU now usable mmx_purgecache(dyn, ninst, 0, x1); + x87_purgecache(dyn, ninst, 0, x1, x2, x3); // also purge x87 and hard reset it + ST_W(xZR, xEmu, offsetof(x64emu_t, top)); + ST_W(xZR, xEmu, offsetof(x64emu_t, fpu_stack)); + MOV32w(x1, TAGS_EMPTY); + ST_D(x1, xEmu, offsetof(x64emu_t, fpu_tags)); break; case 0x7E: INST_NAME("MOVD Ed, Gm"); diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index a01a48ddf2..8f837995cd 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -1822,9 +1822,11 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni INST_NAME("EMMS"); // empty MMX, FPU now usable mmx_purgecache(dyn, ninst, 0, x1); - /*emu->top = 0; - emu->fpu_stack = 0;*/ - // TODO: Check if something is needed here? + x87_purgecache(dyn, ninst, 0, x1, x2, x3); // also purge x87 and hard reset it + SW(xZR, xEmu, offsetof(x64emu_t, top)); + SW(xZR, xEmu, offsetof(x64emu_t, fpu_stack)); + MOV32w(x1, TAGS_EMPTY); + SD(x1, xEmu, offsetof(x64emu_t, fpu_tags)); break; case 0x7E: INST_NAME("MOVD Ed, Gm");