about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-05-30 21:38:43 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-05-30 21:38:43 +0200
commit2038df85c0fc289acc7ff1dce4cd6b416031f7f5 (patch)
tree0f9d73ad0b29388b8452f812fca9028eed8d0339 /src/emu
parentb142c5a1817fb788b9692870ff6aa0cb3e622aea (diff)
downloadbox64-2038df85c0fc289acc7ff1dce4cd6b416031f7f5.tar.gz
box64-2038df85c0fc289acc7ff1dce4cd6b416031f7f5.zip
[ARM64_DYNAREC] Try to optimise Windows INT n version on 64bits (TODO: Interp and 32bits and wowbox64)
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/x87emu_private.c6
-rw-r--r--src/emu/x87emu_private.h1
2 files changed, 6 insertions, 1 deletions
diff --git a/src/emu/x87emu_private.c b/src/emu/x87emu_private.c
index 5d95a8e5..4936bf6c 100644
--- a/src/emu/x87emu_private.c
+++ b/src/emu/x87emu_private.c
@@ -476,10 +476,14 @@ void fpu_xsave(x64emu_t* emu, void* ed, int is32bits)
 
 void fpu_xrstor(x64emu_t* emu, void* ed, int is32bits)
 {
+    uint64_t mask = R_EAX | (((uint64_t)R_EDX)<<32);
+    return fpu_xrstor_mask(emu, ed, is32bits, mask);
+}
+
+void fpu_xrstor_mask(x64emu_t* emu, void* ed, int is32bits, uint64_t mask) {
     xsave64_t *p = (xsave64_t*)ed;
     xsaveheader_t *h = (xsaveheader_t*)(p+1);
     int compressed = (h->xcomp_bv>>63);
-    uint64_t mask = R_EAX | (((uint64_t)R_EDX)<<32);
     uint32_t rfbm = (0b111&mask);
     uint32_t to_restore = rfbm & h->xstate_bv;
     uint32_t to_init = rfbm & ~h->xstate_bv;
diff --git a/src/emu/x87emu_private.h b/src/emu/x87emu_private.h
index 74758acf..ff42d440 100644
--- a/src/emu/x87emu_private.h
+++ b/src/emu/x87emu_private.h
@@ -219,6 +219,7 @@ void fpu_fxrstor64(x64emu_t* emu, void* ed);
 void fpu_xsave(x64emu_t* emu, void* ed, int is32bits);
 void fpu_xsave_mask(x64emu_t* emu, void* ed, int is32bits, uint64_t mask);
 void fpu_xrstor(x64emu_t* emu, void* ed, int is32bits);
+void fpu_xrstor_mask(x64emu_t* emu, void* ed, int is32bits, uint64_t mask);
 
 uint32_t cvtf16_32(uint16_t v);
 uint16_t cvtf32_16(uint32_t v, uint8_t rounding);