about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-02 13:10:50 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-02 13:10:50 +0200
commit2493706315db07b7146ba5e9ade9bed7d33e467e (patch)
tree30eab9ef1479f21adde9ce69996887d04e68e198 /src
parentb49273c079dd9fa02ba1ee709e6d4edb1e728f71 (diff)
downloadbox64-2493706315db07b7146ba5e9ade9bed7d33e467e.tar.gz
box64-2493706315db07b7146ba5e9ade9bed7d33e467e.zip
[COSIM] Improved reliability with AVX (but there is still something wrong there)
Diffstat (limited to 'src')
-rw-r--r--src/emu/modrm.h9
-rw-r--r--src/emu/x64test.c20
2 files changed, 15 insertions, 14 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index 8bc3cbd4..03cccdba 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -43,11 +43,14 @@
 #define GETEX32(D)          opex=TestEx32O(test, &addr, rex, nextop, D, 0)

 #define GETEX_OFFS(D, O)    opex=TestExO(test, &addr, rex, nextop, D, O)

 #define GETGX               opgx=GetGx(test->emu, &addr, rex, nextop)

-#define GETGY               opgy=GetGy(emu, &addr, rex, nextop)

-#define GETEY               opey=(opex>=&emu->xmm[0] && opex<=&emu->xmm[15])?((sse_regs_t*)((uintptr_t)opex+offsetof(x64emu_t, ymm)-offsetof(x64emu_t, xmm))):((sse_regs_t*)((uintptr_t)opex+16))

+#define GETGY               opgy=GetGy(test->emu, &addr, rex, nextop)

+#define GETEY               opey=(opex>=&test->emu->xmm[0] && opex<=&test->emu->xmm[15])?((sse_regs_t*)((uintptr_t)opex+offsetof(x64emu_t, ymm)-offsetof(x64emu_t, xmm))):((sse_regs_t*)((uintptr_t)opex+16))

 #define GETEM(D)            opem=TestEm(test, &addr, rex, nextop, D)

 #define GETEM32(D)          opem=TestEm32O(test, &addr, rex, nextop, D, 0)

 #define GETGM               opgm=GetGm(test->emu, &addr, rex, nextop)

+#define GETVX               opvx=&test->emu->xmm[vex.v]

+#define GETVY               opvy=&test->emu->ymm[vex.v]

+#define GETVD               opvd=&test->emu->regs[vex.v]

 #else

 #define GETED(D)            oped=GetEd(emu, &addr, rex, nextop, D)

 #define GETE4(D)            GETED(D)

@@ -76,10 +79,10 @@
 #define GETEM(D)            opem=GetEm(emu, &addr, rex, nextop, D)

 #define GETEM32(D)          opem=GetEm32O(emu, &addr, rex, nextop, D, 0)

 #define GETGM               opgm=GetGm(emu, &addr, rex, nextop)

-#endif

 #define GETVX               opvx=&emu->xmm[vex.v]

 #define GETVY               opvy=&emu->ymm[vex.v]

 #define GETVD               opvd=&emu->regs[vex.v]

+#endif

 #define ED  oped

 #define GD  opgd

 #define VD  opvd

diff --git a/src/emu/x64test.c b/src/emu/x64test.c
index 62ff1c32..49bd09cf 100644
--- a/src/emu/x64test.c
+++ b/src/emu/x64test.c
@@ -108,22 +108,20 @@ void x64test_check(x64emu_t* ref, uintptr_t ip)
         BANNER;
         printf_log(LOG_NONE, "MXCSR: %x | %x\n", ref->mxcsr.x32, emu->mxcsr.x32);
     }
-    if(box64_avx) {
-        if(memcmp(ref->xmm, emu->xmm, sizeof(emu->xmm)) || memcmp(ref->ymm, emu->ymm, sizeof(emu->ymm))) {
+    if(box64_avx)
+        if(memcmp(ref->ymm, emu->ymm, sizeof(emu->ymm))) {
             BANNER;
             for(int i=0; i<16; ++i) {
-                if(ref->ymm[i].u128!=emu->ymm[i].u128 || ref->xmm[i].u128!=emu->xmm[i].u128 ) {
-                    printf_log(LOG_NONE, "YMM[%02d]: %016zx-%016zx-%016zx-%016zx | %016zx-%016zx-%016zx-%016zx\n", i, ref->ymm[i].q[1], ref->ymm[i].q[0], ref->xmm[i].q[1], ref->xmm[i].q[0], emu->ymm[i].q[1], emu->ymm[i].q[0], emu->xmm[i].q[1], emu->xmm[i].q[0]);
+                if(ref->ymm[i].u128!=emu->ymm[i].u128) {
+                    printf_log(LOG_NONE, "YMM[%02d]: %016zx-%016zx | %016zx-%016zx\n", i, ref->ymm[i].q[1], ref->ymm[i].q[0], emu->ymm[i].q[1], emu->ymm[i].q[0]);
                 }
             }
         }
-    } else {
-        if(memcmp(ref->xmm, emu->xmm, sizeof(emu->xmm))) {
-            BANNER;
-            for(int i=0; i<16; ++i) {
-                if(ref->xmm[i].u128!=emu->xmm[i].u128) {
-                    printf_log(LOG_NONE, "XMM[%02d]: %016zx-%016zx | %016zx-%016zx\n", i, ref->xmm[i].q[1], ref->xmm[i].q[0], emu->xmm[i].q[1], emu->xmm[i].q[0]);
-                }
+    if(memcmp(ref->xmm, emu->xmm, sizeof(emu->xmm))) {
+        BANNER;
+        for(int i=0; i<16; ++i) {
+            if(ref->xmm[i].u128!=emu->xmm[i].u128) {
+                printf_log(LOG_NONE, "XMM[%02d]: %016zx-%016zx | %016zx-%016zx\n", i, ref->xmm[i].q[1], ref->xmm[i].q[0], emu->xmm[i].q[1], emu->xmm[i].q[0]);
             }
         }
     }