about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-03-25 03:23:34 +0800
committerGitHub <noreply@github.com>2025-03-24 20:23:34 +0100
commit75e9aae2817664d8935fb6f6eeb206b9ecee7f9c (patch)
tree56d135c51d002540510f87e35f372c4d8734581d /src
parentb0de73852ca218c20047cb4d76b4142a2386474b (diff)
downloadbox64-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.c12
-rw-r--r--src/dynarec/rv64/dynarec_rv64_d9.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_db.c3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_de.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_df.c6
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);