about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-24 10:58:23 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-24 10:58:23 +0200
commitaf555abb6f16ece1ee8f3571979923d885b1194c (patch)
tree266319f31bd87e2cffef1d71076dd7623bd31e28 /src
parent926e4b2da82d2da28484f2e8da6d30f30e702205 (diff)
downloadbox64-af555abb6f16ece1ee8f3571979923d885b1194c.tar.gz
box64-af555abb6f16ece1ee8f3571979923d885b1194c.zip
[INTERP] Small change to various (V)MOVNT* opcodes, forbidding reg -> reg form
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run660f.c30
-rw-r--r--src/emu/x64runavx0f.c20
-rw-r--r--src/emu/x64runavx660f.c40
-rw-r--r--src/emu/x64runavx660f38.c24
-rw-r--r--src/emu/x64runf20f.c8
-rw-r--r--src/emu/x64runf30f.c8
6 files changed, 74 insertions, 56 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index b16a276e..001a9aa4 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -211,10 +211,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         break;

     case 0x2B:                      /* MOVNTPD Ex, Gx */

         nextop = F8;

-        GETEX(0);

-        GETGX;

-        EX->q[0] = GX->q[0];

-        EX->q[1] = GX->q[1];

+        if(!MODREG) {

+            GETEX(0);

+            GETGX;

+            EX->q[0] = GX->q[0];

+            EX->q[1] = GX->q[1];

+        }

         break;

     case 0x2C:                      /* CVTTPD2PI Gm, Ex */

         nextop = F8;

@@ -554,10 +556,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
                 break;

             case 0x2A:  /* MOVNTDQA Gx, Ex */

                 nextop = F8;

-                GETEX(0);

-                GETGX;

-                GX->q[0] = EX->q[0];

-                GX->q[1] = EX->q[1];

+                if(!MODREG) {

+                    GETEX(0);

+                    GETGX;

+                    GX->q[0] = EX->q[0];

+                    GX->q[1] = EX->q[1];

+                }

                 break;

             case 0x2B:  /* PACKUSDW Gx, Ex */

                 nextop = F8;

@@ -2454,10 +2458,12 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         break;

     case 0xE7:   /* MOVNTDQ Ex, Gx */

         nextop = F8;

-        GETEX(0);

-        GETGX;

-        EX->q[0] = GX->q[0];

-        EX->q[1] = GX->q[1];

+        if(!MODREG) {

+            GETEX(0);

+            GETGX;

+            EX->q[0] = GX->q[0];

+            EX->q[1] = GX->q[1];

+        }

         break;

     case 0xE8:  /* PSUBSB Gx,Ex */

         nextop = F8;

diff --git a/src/emu/x64runavx0f.c b/src/emu/x64runavx0f.c
index 8509f270..934bed34 100644
--- a/src/emu/x64runavx0f.c
+++ b/src/emu/x64runavx0f.c
@@ -207,15 +207,17 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
 
         case 0x2B:                      /* VMOVNTPS Ex,Gx */
             nextop = F8;
-            GETEX(0);
-            GETGX;
-            EX->q[0] = GX->q[0];
-            EX->q[1] = GX->q[1];
-            if(vex.l) {
-                GETEY;
-                GETGY;
-                EY->q[0] = GY->q[0];
-                EY->q[1] = GY->q[1];
+            if(!MODREG) {
+                GETEX(0);
+                GETGX;
+                EX->q[0] = GX->q[0];
+                EX->q[1] = GX->q[1];
+                if(vex.l) {
+                    GETEY;
+                    GETGY;
+                    EY->q[0] = GY->q[0];
+                    EY->q[1] = GY->q[1];
+                }
             }
             break;
 
diff --git a/src/emu/x64runavx660f.c b/src/emu/x64runavx660f.c
index 0e440eff..e17fe8b2 100644
--- a/src/emu/x64runavx660f.c
+++ b/src/emu/x64runavx660f.c
@@ -187,15 +187,17 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
 
         case 0x2B:                      /* MOVNTPD Ex, Gx */
             nextop = F8;
-            GETEX(0);
-            GETGX;
-            EX->q[0] = GX->q[0];
-            EX->q[1] = GX->q[1];
-            if(vex.l) {
-                GETGY;
-                GETEY;
-                EY->q[0] = GY->q[0];
-                EY->q[1] = GY->q[1];
+            if(!MODREG) {
+                GETEX(0);
+                GETGX;
+                EX->q[0] = GX->q[0];
+                EX->q[1] = GX->q[1];
+                if(vex.l) {
+                    GETGY;
+                    GETEY;
+                    EY->q[0] = GY->q[0];
+                    EY->q[1] = GY->q[1];
+                }
             }
             break;
 
@@ -1712,15 +1714,17 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             break;
         case 0xE7:   /* VMOVNTDQ Ex, Gx */
             nextop = F8;
-            GETEX(0);
-            GETGX;
-            EX->q[0] = GX->q[0];
-            EX->q[1] = GX->q[1];
-            if(vex.l) {
-                GETEY;
-                GETGY;
-                EY->q[0] = GY->q[0];
-                EY->q[1] = GY->q[1];
+            if(!MODREG) {
+                GETEX(0);
+                GETGX;
+                EX->q[0] = GX->q[0];
+                EX->q[1] = GX->q[1];
+                if(vex.l) {
+                    GETEY;
+                    GETGY;
+                    EY->q[0] = GY->q[0];
+                    EY->q[1] = GY->q[1];
+                }
             }
             break;
         case 0xE8:  /* VSUBSB Gx, Vx, Ex */
diff --git a/src/emu/x64runavx660f38.c b/src/emu/x64runavx660f38.c
index fdde1d6c..fc2442ab 100644
--- a/src/emu/x64runavx660f38.c
+++ b/src/emu/x64runavx660f38.c
@@ -777,17 +777,19 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             break;
         case 0x2A:  /* VMOVNTDQA Gx, Ex */
             nextop = F8;
-            GETEX(0);
-            GETGX;
-            GETGY;
-            GX->q[0] = EX->q[0];
-            GX->q[1] = EX->q[1];
-            if(vex.l) {
-                GETEY;
-                GY->q[0] = EY->q[0];
-                GY->q[1] = EY->q[1];
-            } else
-                GY->u128 = 0;
+            if(!MODREG) {
+                GETEX(0);
+                GETGX;
+                GETGY;
+                GX->q[0] = EX->q[0];
+                GX->q[1] = EX->q[1];
+                if(vex.l) {
+                    GETEY;
+                    GY->q[0] = EY->q[0];
+                    GY->q[1] = EY->q[1];
+                } else
+                    GY->u128 = 0;
+            }
             break;
         case 0x2B:  /* VPACKUSDW Gx, Vx, Ex */
             nextop = F8;
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index d8b3a373..93bc5e09 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -90,9 +90,11 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         break;

     case 0x2B:  /* MOVNTSD Ex, Gx */

         nextop = F8;

-        GETEX8(0);

-        GETGX;

-        EX->q[0] = GX->q[0];

+        if(!MODREG) {

+            GETEX8(0);

+            GETGX;

+            EX->q[0] = GX->q[0];

+        }

         break;

     case 0x2C:  /* CVTTSD2SI Gd, Ex */

         nextop = F8;

diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index 6a0652ee..38ef2ad4 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -96,9 +96,11 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         break;

     case 0x2B:  /* MOVNTSS Ex Gx */

         nextop = F8;

-        GETEX4(0);

-        GETGX;

-        EX->ud[0] = GX->ud[0];

+        if(!MODREG) {

+            GETEX4(0);

+            GETGX;

+            EX->ud[0] = GX->ud[0];

+        }

         break;

     case 0x2C:  /* CVTTSS2SI Gd, Ex */

         nextop = F8;