diff options
Diffstat (limited to 'src/emu/x87emu_private.c')
| -rw-r--r-- | src/emu/x87emu_private.c | 21 |
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 |