about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorLiZhuoheng <114734429+zohanzephyr@users.noreply.github.com>2024-07-04 13:59:54 +0800
committerGitHub <noreply@github.com>2024-07-04 07:59:54 +0200
commitb5946f37526606e05b28fc29af0b5eb1a2497414 (patch)
tree486911d50c958700ef1d07bb9989444771009474 /src
parent371435afd0de11707c3f32405d0bf168a1250a7d (diff)
downloadbox64-b5946f37526606e05b28fc29af0b5eb1a2497414.tar.gz
box64-b5946f37526606e05b28fc29af0b5eb1a2497414.zip
[RV64_DYNAREC] modify DF default /4 opcode (#1633)
* [RV64_DYNAREC] modify DF default /4 opcode

* [RV64_DYNAREC] added DF default /4 opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_df.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_df.c b/src/dynarec/rv64/dynarec_rv64_df.c
index 239a0c6f..a164fc63 100644
--- a/src/dynarec/rv64/dynarec_rv64_df.c
+++ b/src/dynarec/rv64/dynarec_rv64_df.c
@@ -151,8 +151,8 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     SH(x4, wback, fixedaddress);
                     X87_POP_OR_FAIL(dyn, ninst, x3);
                     break;
-                case 3:
-                    INST_NAME("FISTP Ew, ST0");
+                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);
                     addr = geted(dyn, addr, ninst, nextop, &wback, x2, x3, &fixedaddress, rex, NULL, 1, 0);
@@ -177,10 +177,9 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     }
                     MARK2;
                     SH(x4, wback, fixedaddress);
-                    X87_POP_OR_FAIL(dyn, ninst, x3);
                     break;
-                case 4:
-                    INST_NAME("FIST Ew, ST0");
+                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);
                     addr = geted(dyn, addr, ninst, nextop, &wback, x2, x3, &fixedaddress, rex, NULL, 1, 0);
@@ -205,6 +204,16 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     }
                     MARK2;
                     SH(x4, wback, fixedaddress);
+                    X87_POP_OR_FAIL(dyn, ninst, x3);
+                    break;
+                case 4:
+                    INST_NAME("FBLD ST0, tbytes");
+                    X87_PUSH_EMPTY_OR_FAIL(dyn, ninst, x1);
+                    addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 0, 0);
+                    if(ed != x1) { MV(x1, ed); }
+                    s0 = x87_stackcount(dyn, ninst, x3);
+                    CALL(fpu_fbld, -1);
+                    x87_unstackcount(dyn, ninst, x3, s0);
                     break;
                 case 5:
                     INST_NAME("FILD ST0, i64");