about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-11-14 00:54:56 +0800
committerGitHub <noreply@github.com>2023-11-13 17:54:56 +0100
commit0c6c01d86aa0b3253401579ef50070b21d615e1e (patch)
treea91a30693c118821c52df41580d4678f27d45e7d /src
parent13612d4024c50dbc79c5900e1cf1d8b5319ae1ba (diff)
downloadbox64-0c6c01d86aa0b3253401579ef50070b21d615e1e.tar.gz
box64-0c6c01d86aa0b3253401579ef50070b21d615e1e.zip
[RV64_DYNAREC] [32BITS] Added more opcodes for minipad2.exe (#1062)
* [RV64_DYNAREC] Added 67 0F B7 MOVXZ opcode

* [RV64_DYNAREC][32BITS] Added 66 A3 MOV opcode

* [RV64_DYNAREC] Added 67 C7 MOV opcode

* [RV64_DYNAREC] [32BITS] Added 64 FF /6 PUSH opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_64.c14
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c14
-rw-r--r--src/dynarec/rv64/dynarec_rv64_67.c30
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h12
4 files changed, 70 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c
index 40c6d861..3e1366fb 100644
--- a/src/dynarec/rv64/dynarec_rv64_64.c
+++ b/src/dynarec/rv64/dynarec_rv64_64.c
@@ -505,6 +505,20 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SMWRITE2();
             }
             break;
+
+        case 0xFF:
+            nextop = F8;
+            grab_segdata(dyn, addr, ninst, x6, seg);
+            switch((nextop>>3)&7) {
+                case 6: // Push Ed
+                    INST_NAME("PUSH Ed");
+                    GETEDOz(x6, 0, x3);
+                    PUSH1z(ed);
+                    break;
+                default:
+                    DEFAULT;
+            }
+            break;
         default:
             DEFAULT;
     }
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c
index 36bf1257..8b717923 100644
--- a/src/dynarec/rv64/dynarec_rv64_66.c
+++ b/src/dynarec/rv64/dynarec_rv64_66.c
@@ -15,6 +15,7 @@
 #include "emu/x64run_private.h"
 #include "x64trace.h"
 #include "dynarec_native.h"
+#include "custommem.h"
 
 #include "rv64_printer.h"
 #include "dynarec_rv64_private.h"
@@ -606,6 +607,19 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             AND(x1, x1, x2);
             OR(xRAX, xRAX, x1);
             break;
+
+        case 0xA3:
+            INST_NAME("MOV Od,EAX");
+            if(rex.is32bits)
+                u64 = F32;
+            else
+                u64 = F64;
+            MOV64z(x1, u64);
+            if(isLockAddress(u64)) lock=1; else lock = 0;
+            SH(xRAX, x1, 0);
+            SMWRITELOCK(lock);
+            break;
+
         case 0xA5:
             if(rep) {
                 INST_NAME("REP MOVSW");
diff --git a/src/dynarec/rv64/dynarec_rv64_67.c b/src/dynarec/rv64/dynarec_rv64_67.c
index 46fed446..e14ebfd1 100644
--- a/src/dynarec/rv64/dynarec_rv64_67.c
+++ b/src/dynarec/rv64/dynarec_rv64_67.c
@@ -205,6 +205,19 @@ uintptr_t dynarec64_67(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         LBU(gd, ed, fixedaddress);
                     }
                     break;
+                case 0xB7:
+                    INST_NAME("MOVZX Gd, Ew");
+                    nextop = F8;
+                    GETGD;
+                    if(MODREG) {
+                        ed = xRAX + (nextop & 7) + (rex.b << 3);
+                        ZEXTH(gd, ed);
+                    } else {
+                        SMREAD();
+                        addr = geted32(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0);
+                        LHU(gd, ed, fixedaddress);
+                    }
+                    break;
                 default:
                     DEFAULT;
             }
@@ -592,6 +605,23 @@ uintptr_t dynarec64_67(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 }
             }
             break;
+
+        case 0xC7:
+            INST_NAME("MOV Ed, Id");
+            nextop = F8;
+            if(MODREG) { // reg <= i32
+                i64 = F32S;
+                ed = xRAX + (nextop & 7) + (rex.b << 3);
+                MOV64xw(ed, i64);
+            } else {     // mem <= i32
+                addr = geted32(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0);
+                i64 = F32S;
+                MOV64xw(x3, i64);
+                SDxw(x3, ed, fixedaddress);
+                SMWRITELOCK(lock);
+            }
+            break;
+
         #define GO(Z)                                                   \
             BARRIER(BARRIER_MAYBE);                                     \
             JUMP(addr+i8, 1);                                           \
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index cf1b29bf..195f0b5f 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -222,6 +222,18 @@
         LDxw(x1, S, fixedaddress);                                                             \
         ed = x1;                                                                               \
     }
+// GETEDOz can use r1 for ed, and r2 for wback. wback is 0 if ed is xEAX..xEDI
+#define GETEDOz(O, D, S)                                                                       \
+    if (MODREG) {                                                                              \
+        ed = xRAX + (nextop & 7) + (rex.b << 3);                                               \
+        wback = 0;                                                                             \
+    } else {                                                                                   \
+        SMREAD();                                                                              \
+        addr = geted(dyn, addr, ninst, nextop, &wback, x2, S, &fixedaddress, rex, NULL, 1, D); \
+        ADD(S, wback, O);                                                                      \
+        LDz(x1, S, fixedaddress);                                                              \
+        ed = x1;                                                                               \
+    }
 #define WBACKO(O)         \
     if (wback) {          \
         ADD(O, wback, O); \