about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-11-29 02:39:24 +0800
committerGitHub <noreply@github.com>2023-11-28 19:39:24 +0100
commitfaaeffbd387623f9312613d6e45ff4fc6020ba72 (patch)
treed2c7ca5219a0c5014a09bf530f3c597c816425fb
parenta070066b715bd0185b4a06fe684868803d921567 (diff)
downloadbox64-faaeffbd387623f9312613d6e45ff4fc6020ba72.tar.gz
box64-faaeffbd387623f9312613d6e45ff4fc6020ba72.zip
[DYNAREC_RV64] Added more opcodes for flatout.exe (#1099)
* [DYNAREC_RV64] Added 66 AD LODSW opcode

* [DYNAREC_RV64] Added AD LODSD opcode

* [DYNAREC_RV64] Added AC LODSB opcode
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_0.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_2.c22
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c14
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f0.c2
4 files changed, 37 insertions, 3 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_0.c b/src/dynarec/rv64/dynarec_rv64_00_0.c
index 4971849c..8674eca1 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_0.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_0.c
@@ -213,7 +213,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             u8 = F8;
             ANDI(x1, xRAX, 0xff);
             emit_adc8c(dyn, ninst, x1, u8, x3, x4, x5, x6);
-            ANDI(xRAX, xRAX, -256);
+            ANDI(xRAX, xRAX, ~0xff);
             OR(xRAX, xRAX, x1);
             break;
         case 0x15:
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c
index 11c24bc8..998795e3 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_2.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_2.c
@@ -709,6 +709,28 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                 ADD(xRDI, xRDI, x3);
             }
             break;
+        case 0xAC:
+            if (rep) {
+                DEFAULT;
+            } else {
+                INST_NAME("LODSB");
+                GETDIR(x1, x2, 1);
+                LBU(x2, xRSI, 0);
+                ADD(xRSI, xRSI, x1);
+                ANDI(xRAX, xRAX, ~0xff);
+                OR(xRAX, xRAX, x2);
+            }
+            break;
+        case 0xAD:
+            if (rep) {
+                DEFAULT;
+            } else {
+                INST_NAME("LODSD");
+                GETDIR(x1, x2, rex.w ? 8 : 4);
+                LDxw(xRAX, xRSI, 0);
+                ADD(xRSI, xRSI, x1);
+            }
+            break;
         case 0xAE:
             switch (rep) {
             case 1:
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c
index b4e7ad3e..6e13c867 100644
--- a/src/dynarec/rv64/dynarec_rv64_66.c
+++ b/src/dynarec/rv64/dynarec_rv64_66.c
@@ -685,7 +685,19 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 ADD(xRDI, xRDI, x3);
             }
             break;
-
+        case 0xAD:
+            if (rep) {
+                DEFAULT;
+            } else {
+                INST_NAME("LODSW");
+                GETDIR(x1, x2, 2);
+                LHU(x2, xRSI, 0);
+                ADD(xRSI, xRSI, x1);
+                LUI(x1, 0xffff0);
+                AND(xRAX, xRAX, x1);
+                OR(xRAX, xRAX, x2);
+            }
+            break;
         case 0xAF:
             switch (rep) {
                 case 1:
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c
index bb5c78c5..c4373c44 100644
--- a/src/dynarec/rv64/dynarec_rv64_f0.c
+++ b/src/dynarec/rv64/dynarec_rv64_f0.c
@@ -371,7 +371,7 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 MARKLOCK;
                 LR_W(x5, wback, 1, 1);
                 ANDI(x4, x5, 0xff); // x4 = Ed.b[0]
-                ANDI(x5, x5, -256); // x5 = clear Ed.b[0]
+                ANDI(x5, x5, ~0xff); // x5 = clear Ed.b[0]
                 ADDW(x6, x4, x2);
                 ANDI(x9, xFlags, 1 << F_CF);
                 ADDW(x6, x6, x9);   // x6 = adc