about summary refs log tree commit diff stats
path: root/src/emu/x87emu_private.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x87emu_private.c')
-rw-r--r--src/emu/x87emu_private.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/emu/x87emu_private.c b/src/emu/x87emu_private.c
index e19f67a2..d5e2421a 100644
--- a/src/emu/x87emu_private.c
+++ b/src/emu/x87emu_private.c
@@ -441,11 +441,11 @@ typedef struct xsaveheader_s {
     uint8_t  reserved[64-16];
 } xsaveheader_t;
 
-void fpu_xsave(x64emu_t* emu, void* ed, int is32bits)
+void fpu_xsave_mask(x64emu_t* emu, void* ed, int is32bits, uint64_t mask)
 {
     xsave64_t *p = (xsave64_t*)ed;
     xsaveheader_t *h = (xsaveheader_t*)(p+1);
-    uint32_t rfbm = (0b111&R_EAX);
+    uint32_t rfbm = (0b111&mask);
     h->xstate_bv =(h->xstate_bv&~0b111)|rfbm;
     h->xcomp_bv = 0;
     if(h->xstate_bv&0b001) {
@@ -473,16 +473,21 @@ void fpu_xsave(x64emu_t* emu, void* ed, int is32bits)
     }
     // copy SSE regs
     if(h->xstate_bv&0b10) {
-        for(int i=0; i<is32bits?8:16; ++i)
+        for(int i=0; i<(is32bits?8:16); ++i)
             memcpy(&p->XmmRegisters[i], &emu->xmm[i], 16);
     }
     if(h->xstate_bv&0b100) {
         sse_regs_t* avx = (sse_regs_t*)(h+1);
-        for(int i=0; i<is32bits?8:16; ++i)
+        for(int i=0; i<(is32bits?8:16); ++i)
             memcpy(&avx[i], &emu->ymm[i], 16);
     }
 }
 
+void fpu_xsave(x64emu_t* emu, void* ed, int is32bits)
+{
+    fpu_xsave_mask(emu, ed, is32bits, R_RAX);
+}
+
 void fpu_xrstor(x64emu_t* emu, void* ed, int is32bits)
 {
     xsave64_t *p = (xsave64_t*)ed;
@@ -518,19 +523,19 @@ void fpu_xrstor(x64emu_t* emu, void* ed, int is32bits)
     }
     if(to_restore&0b010) {
         // copy SSE regs
-        for(int i=0; i<is32bits?8:16; ++i)
+        for(int i=0; i<(is32bits?8:16); ++i)
             memcpy(&emu->xmm[i], &p->XmmRegisters[i], 16);
     } else if(to_init&0b010) {
-        for(int i=0; i<is32bits?8:16; ++i)
+        for(int i=0; i<(is32bits?8:16); ++i)
             memset(&emu->xmm[i], 0, 16);
     }
     if(to_restore&0b100) {
         // copy AVX upper part of regs
         sse_regs_t* avx = (sse_regs_t*)(h+1);
-        for(int i=0; i<is32bits?8:16; ++i)
+        for(int i=0; i<(is32bits?8:16); ++i)
             memcpy(&emu->ymm[i], &avx[i], 16);
     } else if(to_init&0b100) {
-        for(int i=0; i<is32bits?8:16; ++i)
+        for(int i=0; i<(is32bits?8:16); ++i)
             memcpy(&emu->ymm[i], 0, 16);
     }
 }
\ No newline at end of file