about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-03-15 19:37:42 +0800
committerGitHub <noreply@github.com>2023-03-15 12:37:42 +0100
commit6f85a204a9b913047ae322ba8a48dd85a98c9ab8 (patch)
treec5c53aa9ede05b87b50f13aa324a54f72840f834
parentb5f3d2565abac6e86ed520aa87a1e3e6ce98218d (diff)
downloadbox64-6f85a204a9b913047ae322ba8a48dd85a98c9ab8.tar.gz
box64-6f85a204a9b913047ae322ba8a48dd85a98c9ab8.zip
[RV64_DYNAREC] Added C6 MOV opcode (#566)
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00.c b/src/dynarec/rv64/dynarec_rv64_00.c
index 385e83b2..c7434831 100644
--- a/src/dynarec/rv64/dynarec_rv64_00.c
+++ b/src/dynarec/rv64/dynarec_rv64_00.c
@@ -199,7 +199,46 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     DEFAULT;
             }
             break;
+        case 0xC6:
+            INST_NAME("MOV Eb, Ib");
+            nextop=F8;
+            if(MODREG) {   // reg <= u8
+                u8 = F8;
+                if(!rex.rex) {
+                    ed = (nextop&7);
+                    eb1 = xRAX+(ed&3);  // Ax, Cx, Dx or Bx
+                    eb2 = (ed&4)>>2;    // L or H
+                } else {
+                    eb1 = xRAX+(nextop&7)+(rex.b<<3);
+                    eb2 = 0;
+                }
 
+                if (eb2) {
+                    // load a mask to x3 (ffffffffffff00ff)
+                    LUI(x3, 0xffff0);
+                    ADDI(x3, x3, 0xff);
+                    // apply mask
+                    AND(eb1, eb1, x3);
+                    ADDI(x4, xZR, u8);
+                    SLLI(x4, x4, 8);
+                    OR(eb1, eb1, x4);
+                } else {
+                    SRLI(eb1, eb1, 8);
+                    SLLI(eb1, eb1, 8);
+                    ADDI(eb1, eb1, u8);
+                }
+            } else {                    // mem <= u8
+                addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, &lock, 0, 1);
+                u8 = F8;
+                if(u8) {
+                    ADDI(x3, xZR, u8);
+                    ed = x3;
+                } else
+                    ed = xZR;
+                SB(ed, wback, fixedaddress);
+                SMWRITELOCK(lock);
+            }
+            break;
         default:
             DEFAULT;
     }