diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-03-25 03:23:34 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-24 20:23:34 +0100 |
| commit | 75e9aae2817664d8935fb6f6eeb206b9ecee7f9c (patch) | |
| tree | 56d135c51d002540510f87e35f372c4d8734581d /src | |
| parent | b0de73852ca218c20047cb4d76b4142a2386474b (diff) | |
| download | box64-75e9aae2817664d8935fb6f6eeb206b9ecee7f9c.tar.gz box64-75e9aae2817664d8935fb6f6eeb206b9ecee7f9c.zip | |
[RV64_DYNAREC] Fixed scratch conflicts with fastround=0 in some x87 opcodes (#2464)
* [RV64_DYNAREC] Fixed scratch conflicts with fastround=0 in some x87 opcodes * another fix * more fix
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_d8.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_d9.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_db.c | 3 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_de.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_df.c | 6 |
5 files changed, 11 insertions, 14 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_d8.c b/src/dynarec/rv64/dynarec_rv64_d8.c index 6dd32420..824739c9 100644 --- a/src/dynarec/rv64/dynarec_rv64_d8.c +++ b/src/dynarec/rv64/dynarec_rv64_d8.c @@ -150,7 +150,7 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni s0 = fpu_get_scratch(dyn); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); FLW(s0, ed, fixedaddress); - if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x2); + if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x3); if (ST_IS_F(0)) { FADDS(v1, v1, s0); } else { @@ -165,7 +165,7 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni s0 = fpu_get_scratch(dyn); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); FLW(s0, ed, fixedaddress); - if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x2); + if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x3); if (ST_IS_F(0)) { FMULS(v1, v1, s0); } else { @@ -207,7 +207,7 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni s0 = fpu_get_scratch(dyn); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); FLW(s0, ed, fixedaddress); - if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x2); + if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x3); if (ST_IS_F(0)) { FSUBS(v1, v1, s0); } else { @@ -222,7 +222,7 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni s0 = fpu_get_scratch(dyn); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); FLW(s0, ed, fixedaddress); - if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x2); + if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x3); if (ST_IS_F(0)) { FSUBS(v1, s0, v1); } else { @@ -237,7 +237,7 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni s0 = fpu_get_scratch(dyn); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); FLW(s0, ed, fixedaddress); - if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x2); + if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x3); if (ST_IS_F(0)) { FDIVS(v1, v1, s0); } else { @@ -252,7 +252,7 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni s0 = fpu_get_scratch(dyn); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); FLW(s0, ed, fixedaddress); - if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x2); + if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x3); if (ST_IS_F(0)) { FDIVS(v1, s0, v1); } else { diff --git a/src/dynarec/rv64/dynarec_rv64_d9.c b/src/dynarec/rv64/dynarec_rv64_d9.c index f337a020..5f7cdb02 100644 --- a/src/dynarec/rv64/dynarec_rv64_d9.c +++ b/src/dynarec/rv64/dynarec_rv64_d9.c @@ -470,7 +470,7 @@ uintptr_t dynarec64_D9(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni v1 = x87_get_st(dyn, ninst, x1, x2, 0, EXT_CACHE_ST_F); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); if (!ST_IS_F(0)) { - if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x2); + if (!BOX64ENV(dynarec_fastround)) u8 = x87_setround(dyn, ninst, x1, x3); FCVTSD(v1, v1); if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); } diff --git a/src/dynarec/rv64/dynarec_rv64_db.c b/src/dynarec/rv64/dynarec_rv64_db.c index 3aa4b9b2..26c5a9d4 100644 --- a/src/dynarec/rv64/dynarec_rv64_db.c +++ b/src/dynarec/rv64/dynarec_rv64_db.c @@ -176,14 +176,13 @@ uintptr_t dynarec64_DB(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 3: INST_NAME("FISTP Ed, ST0"); v1 = x87_get_st(dyn, ninst, x1, x2, 0, EXT_CACHE_ST_D); - u8 = x87_setround(dyn, ninst, x1, x2); + 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); - x87_restoreround(dyn, ninst, u8); if (!BOX64ENV(dynarec_fastround)) { FRFLAGS(x5); // get back FPSR to check the IOC bit ANDI(x5, x5, 1 << FR_NV); diff --git a/src/dynarec/rv64/dynarec_rv64_de.c b/src/dynarec/rv64/dynarec_rv64_de.c index d0952a29..dc6a27ce 100644 --- a/src/dynarec/rv64/dynarec_rv64_de.c +++ b/src/dynarec/rv64/dynarec_rv64_de.c @@ -75,7 +75,6 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCOMD(v1, v2, x1, x2, x3, x4, x5); } - if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); break; case 0xD9: @@ -87,7 +86,6 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } else { FCOMD(v1, v2, x1, x2, x3, x4, x5); } - if (!BOX64ENV(dynarec_fastround)) x87_restoreround(dyn, ninst, u8); X87_POP_OR_FAIL(dyn, ninst, x3); X87_POP_OR_FAIL(dyn, ninst, x3); break; diff --git a/src/dynarec/rv64/dynarec_rv64_df.c b/src/dynarec/rv64/dynarec_rv64_df.c index 7d689d9b..39cdac19 100644 --- a/src/dynarec/rv64/dynarec_rv64_df.c +++ b/src/dynarec/rv64/dynarec_rv64_df.c @@ -159,7 +159,7 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 2: INST_NAME("FIST Ew, ST0"); v1 = x87_get_st(dyn, ninst, x1, x2, 0, EXT_CACHE_ST_F); - u8 = x87_setround(dyn, ninst, x1, x2); + u8 = x87_setround(dyn, ninst, x1, x5); addr = geted(dyn, addr, ninst, nextop, &wback, x2, x3, &fixedaddress, rex, NULL, 1, 0); if (!BOX64ENV(dynarec_fastround)) { FSFLAGSI(0); // reset all bits @@ -186,7 +186,7 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 3: INST_NAME("FISTP Ew, ST0"); v1 = x87_get_st(dyn, ninst, x1, x2, 0, EXT_CACHE_ST_F); - u8 = x87_setround(dyn, ninst, x1, x2); + u8 = x87_setround(dyn, ninst, x1, x5); addr = geted(dyn, addr, ninst, nextop, &wback, x2, x3, &fixedaddress, rex, NULL, 1, 0); if (!BOX64ENV(dynarec_fastround)) { FSFLAGSI(0); // reset all bits @@ -260,7 +260,7 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni INST_NAME("FISTP i64, ST0"); v1 = x87_get_st(dyn, ninst, x1, x2, 0, EXT_CACHE_ST_I64); if (!ST_IS_I64(0)) { - u8 = x87_setround(dyn, ninst, x1, x2); + u8 = x87_setround(dyn, ninst, x1, x7); } addr = geted(dyn, addr, ninst, nextop, &wback, x2, x3, &fixedaddress, rex, NULL, 1, 0); |