diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64.c | 14 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 14 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_67.c | 30 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 12 |
4 files changed, 70 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index 40c6d861..3e1366fb 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -505,6 +505,20 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SMWRITE2(); } break; + + case 0xFF: + nextop = F8; + grab_segdata(dyn, addr, ninst, x6, seg); + switch((nextop>>3)&7) { + case 6: // Push Ed + INST_NAME("PUSH Ed"); + GETEDOz(x6, 0, x3); + PUSH1z(ed); + break; + default: + DEFAULT; + } + break; default: DEFAULT; } diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index 36bf1257..8b717923 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -15,6 +15,7 @@ #include "emu/x64run_private.h" #include "x64trace.h" #include "dynarec_native.h" +#include "custommem.h" #include "rv64_printer.h" #include "dynarec_rv64_private.h" @@ -606,6 +607,19 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni AND(x1, x1, x2); OR(xRAX, xRAX, x1); break; + + case 0xA3: + INST_NAME("MOV Od,EAX"); + if(rex.is32bits) + u64 = F32; + else + u64 = F64; + MOV64z(x1, u64); + if(isLockAddress(u64)) lock=1; else lock = 0; + SH(xRAX, x1, 0); + SMWRITELOCK(lock); + break; + case 0xA5: if(rep) { INST_NAME("REP MOVSW"); diff --git a/src/dynarec/rv64/dynarec_rv64_67.c b/src/dynarec/rv64/dynarec_rv64_67.c index 46fed446..e14ebfd1 100644 --- a/src/dynarec/rv64/dynarec_rv64_67.c +++ b/src/dynarec/rv64/dynarec_rv64_67.c @@ -205,6 +205,19 @@ uintptr_t dynarec64_67(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LBU(gd, ed, fixedaddress); } break; + case 0xB7: + INST_NAME("MOVZX Gd, Ew"); + nextop = F8; + GETGD; + if(MODREG) { + ed = xRAX + (nextop & 7) + (rex.b << 3); + ZEXTH(gd, ed); + } else { + SMREAD(); + addr = geted32(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0); + LHU(gd, ed, fixedaddress); + } + break; default: DEFAULT; } @@ -592,6 +605,23 @@ uintptr_t dynarec64_67(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } } break; + + case 0xC7: + INST_NAME("MOV Ed, Id"); + nextop = F8; + if(MODREG) { // reg <= i32 + i64 = F32S; + ed = xRAX + (nextop & 7) + (rex.b << 3); + MOV64xw(ed, i64); + } else { // mem <= i32 + addr = geted32(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0); + i64 = F32S; + MOV64xw(x3, i64); + SDxw(x3, ed, fixedaddress); + SMWRITELOCK(lock); + } + break; + #define GO(Z) \ BARRIER(BARRIER_MAYBE); \ JUMP(addr+i8, 1); \ diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index cf1b29bf..195f0b5f 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -222,6 +222,18 @@ LDxw(x1, S, fixedaddress); \ ed = x1; \ } +// GETEDOz can use r1 for ed, and r2 for wback. wback is 0 if ed is xEAX..xEDI +#define GETEDOz(O, D, S) \ + if (MODREG) { \ + ed = xRAX + (nextop & 7) + (rex.b << 3); \ + wback = 0; \ + } else { \ + SMREAD(); \ + addr = geted(dyn, addr, ninst, nextop, &wback, x2, S, &fixedaddress, rex, NULL, 1, D); \ + ADD(S, wback, O); \ + LDz(x1, S, fixedaddress); \ + ed = x1; \ + } #define WBACKO(O) \ if (wback) { \ ADD(O, wback, O); \ |