about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-07-18 14:13:44 +0800
committerGitHub <noreply@github.com>2024-07-18 08:13:44 +0200
commitc1a14f93d81e2419458e5673729a2c46876996c9 (patch)
tree9f6419a703aec3be660e8f7a93b457a4f8bfbf00
parentf07ee85078a2571f02b8c3c9f132760a53b95331 (diff)
downloadbox64-c1a14f93d81e2419458e5673729a2c46876996c9.tar.gz
box64-c1a14f93d81e2419458e5673729a2c46876996c9.zip
[RV64_DYNAREC] Show missing opcodes in vector implementation (#1695)
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f_vector.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass0.h18
3 files changed, 22 insertions, 3 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f_vector.c b/src/dynarec/rv64/dynarec_rv64_660f_vector.c
index bcda4100..aec3028b 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f_vector.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f_vector.c
@@ -63,8 +63,8 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             }
             break;
         default:
-            // fallback to the scalar version
-            return 0;
+            DEFAULT_VECTOR;
     }
+
     return addr;
 }
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index 515170be..6b2731bd 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -1010,6 +1010,9 @@
     *ok = -1;   \
     BARRIER(2)
 #endif
+#ifndef DEFAULT_VECTOR
+#define DEFAULT_VECTOR return 0
+#endif
 
 #ifndef TABLE64
 #define TABLE64(A, V)
diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h
index 684d3bbf..ed3c321b 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass0.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass0.h
@@ -34,7 +34,7 @@
         dyn->insts[ninst].f_exit = dyn->f;      \
         dyn->insts[ninst].e = dyn->e;           \
         dyn->insts[ninst].x64.has_next = (ok>0)?1:0;
-#define INST_NAME(name) 
+#define INST_NAME(name)
 #define DEFAULT                         \
         --dyn->size;                    \
         *ok = -1;                       \
@@ -50,3 +50,19 @@
         printFunctionAddr(ip, " => ");  \
         dynarec_log(LOG_NONE, "\n");    \
         }
+
+#define DEFAULT_VECTOR                                                                                       \
+    if (box64_dynarec_log >= LOG_INFO || box64_dynarec_dump || box64_dynarec_missing) {                      \
+        dynarec_log(LOG_NONE, "%p: Dynarec fallback to scalar version because of %s Opcode"                  \
+                              " %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
+            (void*)ip, rex.is32bits ? "x86 " : "x64 ",                                                       \
+            PKip(0),                                                                                         \
+            PKip(1), PKip(2), PKip(3),                                                                       \
+            PKip(4), PKip(5), PKip(6),                                                                       \
+            PKip(7), PKip(8), PKip(9),                                                                       \
+            PKip(10), PKip(11), PKip(12),                                                                    \
+            PKip(13), PKip(14));                                                                             \
+        printFunctionAddr(ip, " => ");                                                                       \
+        dynarec_log(LOG_NONE, "\n");                                                                         \
+    }                                                                                                        \
+    return 0