about summary refs log tree commit diff stats
path: root/src/emu/x64run0f.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x64run0f.c')
-rw-r--r--src/emu/x64run0f.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index f2666e5e..95b8cc12 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -91,11 +91,16 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
             if(MODREG)

             switch(nextop) {

                 case 0xD0:

-                    #ifndef TEST_INTERPRETER

-                    emit_signal(emu, SIGILL, (void*)R_RIP, 0);

-                    #else

-                    test->notest = 1;

-                    #endif

+                    if(R_RCX) {

+                        #ifndef TEST_INTERPRETER

+                        emit_signal(emu, SIGILL, (void*)R_RIP, 0);

+                        #else

+                        test->notest = 1;

+                        #endif

+                    } else {

+                        R_RAX = 0b11;   // x87 & SSE for now

+                        R_RDX = 0;

+                    }

                     break;

                 case 0xE0:

                 case 0xE1:

@@ -1286,6 +1291,18 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                     GETED(0);

                     ED->dword[0] = emu->mxcsr.x32;

                     break;

+                case 4:                 /* XSAVE Ed */

+                    _GETED(0);

+                    #ifdef TEST_INTERPRETER

+                    emu->sw.f.F87_TOP = emu->top&7;

+                    #else

+                    fpu_xsave(emu, ED, rex.is32bits);

+                    #endif

+                    break;

+                case 5:                 /* XRSTOR Ed */

+                    _GETED(0);

+                    fpu_xrstor(emu, ED, rex.is32bits);

+                    break;

                 case 7:                 /* CLFLUSH Ed */

                     _GETED(0);

                     #if defined(DYNAREC) && !defined(TEST_INTERPRETER)