about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-08-09 18:03:20 +0800
committerGitHub <noreply@github.com>2024-08-09 12:03:20 +0200
commit649a65b8ee52a659d15420c034d1ce3130bbedb1 (patch)
tree04bbd748de984e0925b66934b75dd4f27814fb53 /src
parent949b64ca5346a7015185e1d39a3d96eed8cfb806 (diff)
downloadbox64-649a65b8ee52a659d15420c034d1ce3130bbedb1.tar.gz
box64-649a65b8ee52a659d15420c034d1ce3130bbedb1.zip
[RV64_DYNAREC] Fixed FNSTSW opcode (#1721)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_3.c1
-rw-r--r--src/dynarec/rv64/dynarec_rv64_df.c4
2 files changed, 5 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c
index b7fb9b4c..6e1990bc 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_3.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_3.c
@@ -391,6 +391,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     *need_epilog = 1;
                 } else {
                     MESSAGE(LOG_DUMP, "Native Call to %s\n", GetNativeName(GetNativeFnc(ip)));
+                    x87_stackcount(dyn, ninst, x1);
                     x87_forget(dyn, ninst, x3, x4, 0);
                     sse_purge07cache(dyn, ninst, x3);
                     // Partially support isSimpleWrapper
diff --git a/src/dynarec/rv64/dynarec_rv64_df.c b/src/dynarec/rv64/dynarec_rv64_df.c
index a164fc63..737f8e85 100644
--- a/src/dynarec/rv64/dynarec_rv64_df.c
+++ b/src/dynarec/rv64/dynarec_rv64_df.c
@@ -48,6 +48,10 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0xE0:
             INST_NAME("FNSTSW AX");
             LWU(x2, xEmu, offsetof(x64emu_t, top));
+            if (dyn->e.x87stack) {
+                ADDI(x2, x2, -dyn->e.x87stack);
+                ANDI(x2, x2, 0x7);
+            }
             LHU(x1, xEmu, offsetof(x64emu_t, sw));
             MOV32w(x3, 0b1100011111111111); // mask
             AND(x1, x1, x3);