diff options
Diffstat (limited to 'src/dynarec/la64/dynarec_la64_67.c')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_67.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_67.c b/src/dynarec/la64/dynarec_la64_67.c index 5b81eb9d..242d315e 100644 --- a/src/dynarec/la64/dynarec_la64_67.c +++ b/src/dynarec/la64/dynarec_la64_67.c @@ -62,6 +62,39 @@ uintptr_t dynarec64_67(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } switch(opcode) { + case 0x88: + INST_NAME("MOV Eb, Gb"); + nextop = F8; + gd = ((nextop & 0x38) >> 3) + (rex.r << 3); + if (rex.rex) { + gb2 = 0; + gb1 = TO_LA64(gd); + } else { + gb2 = ((gd & 4) << 1); + gb1 = TO_LA64(gd & 3); + } + if (gb2) { + gd = x4; + BSTRPICK_D(gd, gb1, gb2 + 7, gb2); + } else { + gd = gb1; // no need to extract + } + if (MODREG) { + ed = (nextop & 7) + (rex.b << 3); + if (rex.rex) { + eb1 = TO_LA64(ed); + eb2 = 0; + } else { + eb1 = TO_LA64(ed & 3); // Ax, Cx, Dx or Bx + eb2 = ((ed & 4) >> 2); // L or H + } + BSTRINS_D(eb1, gd, eb2 * 8 + 7, eb2 * 8); + } else { + addr = geted32(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0); + ST_B(gb1, ed, fixedaddress); + SMWRITELOCK(lock); + } + break; case 0x89: INST_NAME("MOV Ed, Gd"); nextop = F8; |