about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-12-25 22:40:21 +0800
committerGitHub <noreply@github.com>2024-12-25 15:40:21 +0100
commit0329d5fcc269397ecb87869c9559aed3a3bbbb93 (patch)
tree54f21c9c7f6a7d4df469f3a8c47e7e442f950a61
parentf39b5514c5bf8e13c85ae1d9b96f30c5c1f2e82b (diff)
downloadbox64-0329d5fcc269397ecb87869c9559aed3a3bbbb93.tar.gz
box64-0329d5fcc269397ecb87869c9559aed3a3bbbb93.zip
[RV64_DYNAREC] Added more opcodes ([LA64_DYNAREC] too) (#2205)
* [RV64_DYNAREC] Added 66 8E MOV opcode ([LA64_DYNAREC] too)

* Added more opcodes
-rw-r--r--src/dynarec/la64/dynarec_la64_00.c12
-rw-r--r--src/dynarec/la64/dynarec_la64_66.c15
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c15
3 files changed, 42 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c
index 88eb8211..adf19f34 100644
--- a/src/dynarec/la64/dynarec_la64_00.c
+++ b/src/dynarec/la64/dynarec_la64_00.c
@@ -1137,6 +1137,18 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 LDxw(gd, ed, fixedaddress);
             }
             break;
+        case 0x8C:
+            INST_NAME("MOV Ed, Seg");
+            nextop = F8;
+            if ((nextop & 0xC0) == 0xC0) { // reg <= seg
+                LD_HU(TO_NAT((nextop & 7) + (rex.b << 3)), xEmu, offsetof(x64emu_t, segs[(nextop & 0x38) >> 3]));
+            } else { // mem <= seg
+                addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
+                LD_HU(x3, xEmu, offsetof(x64emu_t, segs[(nextop & 0x38) >> 3]));
+                ST_H(x3, ed, fixedaddress);
+                SMWRITE2();
+            }
+            break;
         case 0x8D:
             INST_NAME("LEA Gd, Ed");
             nextop = F8;
diff --git a/src/dynarec/la64/dynarec_la64_66.c b/src/dynarec/la64/dynarec_la64_66.c
index 18322121..70973167 100644
--- a/src/dynarec/la64/dynarec_la64_66.c
+++ b/src/dynarec/la64/dynarec_la64_66.c
@@ -497,6 +497,21 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 BSTRINSz(gd, x1, 15, 0);
             }
             break;
+        case 0x8E:
+            INST_NAME("MOV Seg, Ew");
+            nextop = F8;
+            u8 = (nextop & 0x38) >> 3;
+            if ((nextop & 0xC0) == 0xC0) {
+                ed = TO_NAT((nextop & 7) + (rex.b << 3));
+            } else {
+                SMREAD();
+                addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0);
+                LD_HU(x1, wback, fixedaddress);
+                ed = x1;
+            }
+            ST_H(ed, xEmu, offsetof(x64emu_t, segs[u8]));
+            ST_H(xZR, xEmu, offsetof(x64emu_t, segs_serial[u8]));
+            break;
         case 0x90:
         case 0x91:
         case 0x92:
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c
index f3fe90c9..6c7f98d4 100644
--- a/src/dynarec/rv64/dynarec_rv64_66.c
+++ b/src/dynarec/rv64/dynarec_rv64_66.c
@@ -718,6 +718,21 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SMWRITE2();
             }
             break;
+        case 0x8E:
+            INST_NAME("MOV Seg, Ew");
+            nextop = F8;
+            u8 = (nextop & 0x38) >> 3;
+            if ((nextop & 0xC0) == 0xC0) {
+                ed = TO_NAT((nextop & 7) + (rex.b << 3));
+            } else {
+                SMREAD();
+                addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0);
+                LHU(x1, wback, fixedaddress);
+                ed = x1;
+            }
+            SH(ed, xEmu, offsetof(x64emu_t, segs[u8]));
+            SH(xZR, xEmu, offsetof(x64emu_t, segs_serial[u8]));
+            break;
         case 0x90:
         case 0x91:
         case 0x92: