diff options
Diffstat (limited to 'src/emu/x64run67.c')
| -rw-r--r-- | src/emu/x64run67.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/emu/x64run67.c b/src/emu/x64run67.c index 8b058f6b..8b68d4c5 100644 --- a/src/emu/x64run67.c +++ b/src/emu/x64run67.c @@ -41,6 +41,9 @@ uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) #endif opcode = F8; + if(rex.is32bits) + return Run67_32(emu, rex, rep, addr); + while(opcode==0x67) opcode = F8; @@ -151,6 +154,19 @@ uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) cmp32(emu, R_EAX, F32); break; + case 0x63: /* MOVSXD Gd,Ed */ + nextop = F8; + GETED32(0); + GETGD; + if(rex.w) + GD->sq[0] = ED->sdword[0]; + else + if(MODREG) + GD->q[0] = ED->dword[0]; // not really a sign extension + else + GD->sdword[0] = ED->sdword[0]; // meh? + break; + case 0x66: #ifdef TEST_INTERPRETER return Test6766(test, rex, rep, addr); @@ -259,7 +275,7 @@ uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) case 0x8D: /* LEA Gd,M */ nextop = F8; - GETED32(0); + _GETED32(0); GETGD; if(rex.w) GD->q[0] = (uint64_t)ED; @@ -348,7 +364,7 @@ uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) case 0xE8: /* CALL Id */ tmp32s = F32S; // call is relative - Push(emu, addr); + Push64(emu, addr); addr += tmp32s; break; |