about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-21 12:08:43 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-21 12:08:43 +0100
commitc1f2304c887afc2e25becbf33ad3646cb8554a4c (patch)
tree6f2b146b522edc4bef40fc7e15d20d855b8dfc3b /src
parent85c6e28d472a6ffd8ff54d8e8ac4d53945778a1b (diff)
downloadbox64-c1f2304c887afc2e25becbf33ad3646cb8554a4c.tar.gz
box64-c1f2304c887afc2e25becbf33ad3646cb8554a4c.zip
Small fix for XSAVE/XRSTOR opcodes ([DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c4
-rw-r--r--src/dynarec/la64/dynarec_la64_0f.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_0f.c4
-rw-r--r--src/emu/x64run0f.c4
-rw-r--r--src/emu/x87emu_private.c2
-rw-r--r--src/tools/my_cpuid.c2
6 files changed, 10 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 91a78dfb..edd85a4e 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -1833,7 +1833,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         fpu_purgecache(dyn, ninst, 0, x1, x2, x3);

                         addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

                         if(ed!=x1) {MOVx_REG(x1, ed);}

-                        MOV32w(x2, rex.is32bits);

+                        MOV32w(x2, rex.w?0:1);

                         CALL((void*)fpu_xsave, -1);

                         break;

                     case 5:

@@ -1842,7 +1842,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         fpu_purgecache(dyn, ninst, 0, x1, x2, x3);

                         addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

                         if(ed!=x1) {MOVx_REG(x1, ed);}

-                        MOV32w(x2, rex.is32bits);

+                        MOV32w(x2, rex.w?0:1);

                         CALL((void*)fpu_xrstor, -1);

                         break;

                     case 7:

diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c
index bc584b86..477240aa 100644
--- a/src/dynarec/la64/dynarec_la64_0f.c
+++ b/src/dynarec/la64/dynarec_la64_0f.c
@@ -822,7 +822,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
                         addr = geted(dyn, addr, ninst, nextop, &wback, x1, x2, &fixedaddress, rex, NULL, 0, 0);
                         if (ed != x1) { MV(x1, ed); }
-                        MOV32w(x2, rex.is32bits);
+                        MOV32w(x2, rex.w?0:1);
                         CALL((void*)fpu_xsave, -1);
                         break;
                     case 5:
@@ -831,7 +831,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
                         addr = geted(dyn, addr, ninst, nextop, &wback, x1, x2, &fixedaddress, rex, NULL, 0, 0);
                         if (ed != x1) { MV(x1, ed); }
-                        MOV32w(x2, rex.is32bits);
+                        MOV32w(x2, rex.w?0:1);
                         CALL((void*)fpu_xrstor, -1);
                         break;
                     case 7:
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c
index 6df08e11..c583987b 100644
--- a/src/dynarec/rv64/dynarec_rv64_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_0f.c
@@ -1904,7 +1904,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
                         addr = geted(dyn, addr, ninst, nextop, &wback, x1, x2, &fixedaddress, rex, NULL, 0, 0);
                         if (ed != x1) { MV(x1, ed); }
-                        MOV32w(x2, rex.is32bits);
+                        MOV32w(x2, rex.w?0:1);
                         CALL((void*)fpu_xsave, -1);
                         break;
                     case 5:
@@ -1913,7 +1913,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
                         addr = geted(dyn, addr, ninst, nextop, &wback, x1, x2, &fixedaddress, rex, NULL, 0, 0);
                         if (ed != x1) { MV(x1, ed); }
-                        MOV32w(x2, rex.is32bits);
+                        MOV32w(x2, rex.w?0:1);
                         CALL((void*)fpu_xrstor, -1);
                         break;
                     case 7:
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index d7b0fe61..de5472e7 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -1298,12 +1298,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                     #ifdef TEST_INTERPRETER

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

                     #else

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

+                    fpu_xsave(emu, ED, rex.w?0:1);

                     #endif

                     break;

                 case 5:                 /* XRSTOR Ed */

                     _GETED(0);

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

+                    fpu_xrstor(emu, ED, rex.w?0:1);

                     break;

                 case 7:                 /* CLFLUSH Ed */

                     _GETED(0);

diff --git a/src/emu/x87emu_private.c b/src/emu/x87emu_private.c
index a463bc01..5f6bdba0 100644
--- a/src/emu/x87emu_private.c
+++ b/src/emu/x87emu_private.c
@@ -444,7 +444,7 @@ 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&mask);
-    h->xstate_bv =(h->xstate_bv&~0b111)|rfbm;
+    h->xstate_bv =(h->xstate_bv&~mask)|rfbm;
     h->xcomp_bv = 0;
     if(h->xstate_bv&0b001) {
         int top = emu->top&7;
diff --git a/src/tools/my_cpuid.c b/src/tools/my_cpuid.c
index 067714bc..b30466f3 100644
--- a/src/tools/my_cpuid.c
+++ b/src/tools/my_cpuid.c
@@ -366,7 +366,7 @@ void my_cpuid(x64emu_t* emu, uint32_t tmp32u)
             case 0:
                 R_EAX = 0b111;          // x87 SSE AVX saved
                 R_EBX = 512+64+16*16;     // size of xsave/xrstor
-                R_ECX = 512+64+16*16;     // same
+                R_ECX = 512+64+16*16;     // maximum size of xsave area
                 R_EDX = 0;              // more bits
                 break;
             case 1: