about summary refs log tree commit diff stats
path: root/src/emu/x64run67.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x64run67.c')
-rw-r--r--src/emu/x64run67.c20
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;