diff options
| author | Yang Liu <numbksco@gmail.com> | 2025-10-22 02:37:39 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-21 20:37:39 +0200 |
| commit | 79efa2d8e57106afe488af4dd394e66ae579f155 (patch) | |
| tree | ea624dedc38998ebbd68076d65606204fc26edbe | |
| parent | 83a37589f27c392347f2e69a5a8e51037ccafb50 (diff) | |
| download | box64-79efa2d8e57106afe488af4dd394e66ae579f155.tar.gz box64-79efa2d8e57106afe488af4dd394e66ae579f155.zip | |
[RV64_DYNAREC] Added DB /2 FIST opcode (#3082)
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_db.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 2 |
2 files changed, 18 insertions, 2 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_db.c b/src/dynarec/rv64/dynarec_rv64_db.c index c07e35a5..d31ddc11 100644 --- a/src/dynarec/rv64/dynarec_rv64_db.c +++ b/src/dynarec/rv64/dynarec_rv64_db.c @@ -170,7 +170,23 @@ uintptr_t dynarec64_DB(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 2: INST_NAME("FIST Ed, ST0"); - DEFAULT; + v1 = x87_get_st(dyn, ninst, x1, x2, 0, EXT_CACHE_ST_D); + u8 = x87_setround(dyn, ninst, x1, x5); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x3, &fixedaddress, rex, NULL, 1, 0); + v2 = fpu_get_scratch(dyn); + if (!BOX64ENV(dynarec_fastround)) { + FSFLAGSI(0); // reset all bits + } + FCVTWD(x4, v1, RD_DYN); + if (!BOX64ENV(dynarec_fastround)) { + FRFLAGS(x5); // get back FPSR to check the IOC bit + ANDI(x5, x5, 1 << FR_NV); + BEQ_MARK2(x5, xZR); + MOV32w(x4, 0x80000000); + } + MARK2; + SW(x4, wback, fixedaddress); + x87_restoreround(dyn, ninst, u8); break; case 3: INST_NAME("FISTP Ed, ST0"); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 7daba6bf..87c05526 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -1401,7 +1401,7 @@ #define emit_ror32c STEPNAME(emit_ror32c) #define emit_shrd32c STEPNAME(emit_shrd32c) #define emit_shld32c STEPNAME(emit_shld32c) -#define emit_shrd32 STEPNAME(emit_shld32) +#define emit_shrd32 STEPNAME(emit_shrd32) #define emit_shld32 STEPNAME(emit_shld32) #define emit_shld16c STEPNAME(emit_shld16c) #define emit_shrd16c STEPNAME(emit_shrd16c) |