diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-08-09 18:03:20 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-09 12:03:20 +0200 |
| commit | 649a65b8ee52a659d15420c034d1ce3130bbedb1 (patch) | |
| tree | 04bbd748de984e0925b66934b75dd4f27814fb53 /src | |
| parent | 949b64ca5346a7015185e1d39a3d96eed8cfb806 (diff) | |
| download | box64-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.c | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_df.c | 4 |
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); |