diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-03-15 19:37:42 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-15 12:37:42 +0100 |
| commit | 6f85a204a9b913047ae322ba8a48dd85a98c9ab8 (patch) | |
| tree | c5c53aa9ede05b87b50f13aa324a54f72840f834 /src | |
| parent | b5f3d2565abac6e86ed520aa87a1e3e6ce98218d (diff) | |
| download | box64-6f85a204a9b913047ae322ba8a48dd85a98c9ab8.tar.gz box64-6f85a204a9b913047ae322ba8a48dd85a98c9ab8.zip | |
[RV64_DYNAREC] Added C6 MOV opcode (#566)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00.c | 39 |
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; } |