about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-09-25 03:58:47 +0800
committerGitHub <noreply@github.com>2024-09-24 21:58:47 +0200
commitdc391439ba4b9c95eadaa9ee8c6daa2aadeff83f (patch)
tree5fd342dd8cf3711cfa3d7ac49e03d8b65d26d837 /src
parente44c43deeb91899d6cdf37ba750fcd228d4721bd (diff)
downloadbox64-dc391439ba4b9c95eadaa9ee8c6daa2aadeff83f.tar.gz
box64-dc391439ba4b9c95eadaa9ee8c6daa2aadeff83f.zip
[RV64_DYNAREC][BOX32] Added more opcodes (#1866)
* [RV64_DYNAREC][BOX32] Added more opcodes

* more
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_3.c18
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c64
2 files changed, 74 insertions, 8 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c
index 3288a73a..146645ae 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_3.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_3.c
@@ -1010,6 +1010,24 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             *need_epilog = 0;
             *ok = 0;
             break;
+        case 0xEC ... 0xEF:
+            if (opcode == 0xEC)
+                INST_NAME("IN AL, DX");
+            else if (opcode == 0xED)
+                INST_NAME("IN EAX, DX");
+            else if (opcode == 0xEE)
+                INST_NAME("OUT DX, AL");
+            else
+                INST_NAME("OUT DX, EAX");
+            SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state
+            GETIP(ip);
+            STORE_XEMU_CALL(xRIP);
+            CALL(native_priv, -1);
+            LOAD_XEMU_CALL();
+            jump_to_epilog(dyn, 0, xRIP, ninst);
+            *need_epilog = 0;
+            *ok = 0;
+            break;
         case 0xF0:
             addr = dynarec64_F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
             break;
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c
index 6c6aa8cd..47d17d04 100644
--- a/src/dynarec/rv64/dynarec_rv64_66.c
+++ b/src/dynarec/rv64/dynarec_rv64_66.c
@@ -379,10 +379,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             gd = xRAX + (opcode&7);
             ZEXTH(x1, gd);
             emit_inc16(dyn, ninst, x1, x2, x3, x4);
-            LUI(x3, 0xffff0);
-            AND(gd, gd, x3);
-            OR(gd, gd, x1);
-            ZEROUP(gd);
+            INSHz(gd, x1, x3, x4, 1, 0);
             break;
         case 0x48:
         case 0x49:
@@ -397,10 +394,32 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             gd = xRAX + (opcode&7);
             ZEXTH(x1, gd);
             emit_dec16(dyn, ninst, x1, x2, x3, x4, x5);
-            LUI(x3, 0xffff0);
-            AND(gd, gd, x3);
-            OR(gd, gd, x1);
-            ZEROUP(gd);
+            INSHz(gd, x1, x3, x4, 1, 0);
+            break;
+        case 0x50:
+        case 0x51:
+        case 0x52:
+        case 0x53:
+        case 0x54:
+        case 0x55:
+        case 0x56:
+        case 0x57:
+            INST_NAME("PUSH reg");
+            gd = xRAX + (opcode & 0x07) + (rex.b << 3);
+            PUSH1_16(gd);
+            break;
+        case 0x58:
+        case 0x59:
+        case 0x5A:
+        case 0x5B:
+        case 0x5C:
+        case 0x5D:
+        case 0x5E:
+        case 0x5F:
+            INST_NAME("POP reg");
+            gd = xRAX + (opcode & 0x07) + (rex.b << 3);
+            POP1_16(x1);
+            INSHz(gd, x1, x2, x3, 1, 0);
             break;
         case 0x64:
             addr = dynarec64_6664(dyn, addr, ip, ninst, rex, _FS, ok, need_epilog);
@@ -1180,6 +1199,35 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     emit_neg16(dyn, ninst, ed, x2, x4);
                     EWBACK;
                     break;
+                case 4:
+                    INST_NAME("MUL AX, Ew");
+                    SETFLAGS(X_ALL, SF_PENDING);
+                    GETEW(x1, 0);
+                    ZEXTH(x2, xRAX);
+                    MULW(x1, x2, x1);
+                    UFLAG_RES(x1);
+                    INSHz(xRAX, x1, x4, x5, 1, 1);
+                    SRLI(xRDX, xRDX, 16);
+                    SLLI(xRDX, xRDX, 16);
+                    SRLI(x1, x1, 48);
+                    OR(xRDX, xRDX, x1);
+                    UFLAG_DF(x1, d_mul16);
+                    break;
+                case 5:
+                    INST_NAME("IMUL AX, Ew");
+                    SETFLAGS(X_ALL, SF_PENDING);
+                    GETSEW(x1, 0);
+                    SLLI(x2, xRAX, 16);
+                    SRAIW(x2, x2, 16);
+                    MULW(x1, x2, x1);
+                    UFLAG_RES(x1);
+                    INSHz(xRAX, x1, x4, x5, 1, 1);
+                    SRLI(xRDX, xRDX, 16);
+                    SLLI(xRDX, xRDX, 16);
+                    SRLI(x1, x1, 48);
+                    OR(xRDX, xRDX, x1);
+                    UFLAG_DF(x1, d_imul16);
+                    break;
                 case 6:
                     INST_NAME("DIV Ew");
                     SETFLAGS(X_ALL, SF_SET);