about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <numbksco@gmail.com>2023-05-28 03:38:25 +0800
committerGitHub <noreply@github.com>2023-05-27 21:38:25 +0200
commita791677534315fb4c7708db907605ed61cb8b239 (patch)
tree2cddaede6965e8f8512a641f5b24bc045ee60849
parentbe17a6cbf03e66ac32af57f6f7daba33f2302956 (diff)
downloadbox64-a791677534315fb4c7708db907605ed61cb8b239.tar.gz
box64-a791677534315fb4c7708db907605ed61cb8b239.zip
[RV64_DYNAREC] Fixed 66 0F CMOV opcodes (#804)
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c45
1 files changed, 22 insertions, 23 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c
index d1f343b1..c95449a4 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f.c
@@ -120,29 +120,6 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             nextop = F8;
             FAKEED;
             break;
-        
-        #define GO(GETFLAGS, NO, YES, F)            \
-            READFLAGS(F);                           \
-            GETFLAGS;                               \
-            nextop=F8;                              \
-            GETGD;                                  \
-            if(MODREG) {                            \
-                ed = xRAX+(nextop&7)+(rex.b<<3);    \
-                ZEXTH(x4, ed);                      \
-            } else {                                \
-                SMREAD();                           \
-                addr = geted(dyn, addr, ninst, nextop, &ed, x2, x4, &fixedaddress, rex, NULL, 1, 0); \
-                LHU(x4, ed, fixedaddress);          \
-                ed = x4;                            \
-            }                                       \
-            B##NO(x1, 4+4*4);                       \
-            ADDI(x3, xZR, -1);                      \
-            SRLI(x3, x3, 48);                       \
-            AND(gd, gd, x3);                        \
-            OR(gd, gd, ed);
-
-        GOCOND(0x40, "CMOV", "Gw, Ew");
-        #undef GO
         case 0x28:
             INST_NAME("MOVAPD Gx,Ex");
             nextop = F8;
@@ -964,6 +941,28 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     DEFAULT;
             }
             break;
+        #define GO(GETFLAGS, NO, YES, F)            \
+            READFLAGS(F);                           \
+            GETFLAGS;                               \
+            nextop=F8;                              \
+            GETGD;                                  \
+            if(MODREG) {                            \
+                ed = xRAX+(nextop&7)+(rex.b<<3);    \
+                ZEXTH(x4, ed);                      \
+                ed = x4;                            \
+            } else {                                \
+                SMREAD();                           \
+                addr = geted(dyn, addr, ninst, nextop, &ed, x2, x4, &fixedaddress, rex, NULL, 1, 0); \
+                LHU(x4, ed, fixedaddress);          \
+                ed = x4;                            \
+            }                                       \
+            B##NO(x1, 4+3*4);                       \
+            LUI(x3, 0xffff0);                       \
+            AND(gd, gd, x3);                        \
+            OR(gd, gd, ed);
+
+        GOCOND(0x40, "CMOV", "Gw, Ew");
+        #undef GO
         case 0x50:
             INST_NAME("PMOVMSKD Gd, Ex");
             nextop = F8;