about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-10-03 02:44:04 +0800
committerGitHub <noreply@github.com>2024-10-02 20:44:04 +0200
commit6cbcfc7ab80269a0d3b80ec920fa344f59609b61 (patch)
tree841918dee9d8d959bb0a68e503ae1f5ec41b8f54 /src
parent564d06e84cd3bdc8a926f4489a481c3c4390c5a9 (diff)
downloadbox64-6cbcfc7ab80269a0d3b80ec920fa344f59609b61.tar.gz
box64-6cbcfc7ab80269a0d3b80ec920fa344f59609b61.zip
[DYNAREC] Added a new missing mode for fallback opcodes (#1896)
Diffstat (limited to 'src')
-rw-r--r--src/core.c6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67_avx.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass0.h2
-rw-r--r--src/dynarec/la64/dynarec_la64_pass0.h2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_0f_vector.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f_vector.c18
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass0.h2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass3.h2
9 files changed, 20 insertions, 18 deletions
diff --git a/src/core.c b/src/core.c
index 31cb413d..05f516d9 100644
--- a/src/core.c
+++ b/src/core.c
@@ -842,11 +842,13 @@ void LoadLogEnv()
     p = getenv("BOX64_DYNAREC_MISSING");
     if(p) {
         if(strlen(p)==1) {
-            if(p[0]>='0' && p[0]<='1')
+            if(p[0]>='0' && p[0]<='2')
                 box64_dynarec_missing = p[0]-'0';
         }
-        if(box64_dynarec_missing)
+        if(box64_dynarec_missing==1)
             printf_log(LOG_INFO, "Dynarec will print missing opcodes\n");
+        else if (box64_dynarec_missing==2)
+            printf_log(LOG_INFO, "Dynarec will print fallback to scalar opcodes\n");
     }
     p = getenv("BOX64_NODYNAREC");
     if(p) {
diff --git a/src/dynarec/arm64/dynarec_arm64_67_avx.c b/src/dynarec/arm64/dynarec_arm64_67_avx.c
index 4c3f147f..6c00a9dc 100644
--- a/src/dynarec/arm64/dynarec_arm64_67_avx.c
+++ b/src/dynarec/arm64/dynarec_arm64_67_avx.c
@@ -126,7 +126,7 @@ uintptr_t dynarec64_67_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
     }
     else {DEFAULT;}
 
-    if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing)) {
+    if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==1)) {
         dynarec_log(LOG_NONE, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);
     }
     return addr;
diff --git a/src/dynarec/arm64/dynarec_arm64_avx.c b/src/dynarec/arm64/dynarec_arm64_avx.c
index 1928a441..10a122a0 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx.c
@@ -71,7 +71,7 @@ uintptr_t dynarec64_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         addr = dynarec64_AVX_F3_0F38(dyn, addr, ip, ninst, vex, ok, need_epilog);
     else {DEFAULT;}
 
-    if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing)) {
+    if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==1)) {
         dynarec_log(LOG_NONE, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);
     }
     return addr;
diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h
index 9ce472db..a9dd57e5 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass0.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass0.h
@@ -35,7 +35,7 @@
 #define DEFAULT                         \
         --dyn->size;                    \
         *ok = -1;                       \
-        if(box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing) {\
+        if(box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==1) {\
         dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %sOpcode %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
         (void*)ip, rex.is32bits?"x86 ":"x64 ",\
         PKip(0),                        \
diff --git a/src/dynarec/la64/dynarec_la64_pass0.h b/src/dynarec/la64/dynarec_la64_pass0.h
index b3f0f7ef..3ed6c608 100644
--- a/src/dynarec/la64/dynarec_la64_pass0.h
+++ b/src/dynarec/la64/dynarec_la64_pass0.h
@@ -40,7 +40,7 @@
 #define DEFAULT                                                                                                                                     \
     --dyn->size;                                                                                                                                    \
     *ok = -1;                                                                                                                                       \
-    if (box64_dynarec_log >= LOG_INFO || box64_dynarec_dump || box64_dynarec_missing) {                                                             \
+    if (box64_dynarec_log >= LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==1) {                                                          \
         dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %sOpcode %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
             (void*)ip, rex.is32bits ? "32bits " : "",                                                                                               \
             PKip(0),                                                                                                                                \
diff --git a/src/dynarec/rv64/dynarec_rv64_0f_vector.c b/src/dynarec/rv64/dynarec_rv64_0f_vector.c
index 20cad81c..5d75e694 100644
--- a/src/dynarec/rv64/dynarec_rv64_0f_vector.c
+++ b/src/dynarec/rv64/dynarec_rv64_0f_vector.c
@@ -237,7 +237,7 @@ uintptr_t dynarec64_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip,
             }
             break;
         case 0xC6:
-            if (rv64_xtheadvector) return 0; // lack of vrgatherei16.vv
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // lack of vrgatherei16.vv
 
             INST_NAME("SHUFPS Gx, Ex, Ib");
             nextop = F8;
diff --git a/src/dynarec/rv64/dynarec_rv64_660f_vector.c b/src/dynarec/rv64/dynarec_rv64_660f_vector.c
index 3719b5a1..f9949273 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f_vector.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f_vector.c
@@ -309,7 +309,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
                     VADD_VX(q0, q1, xZR, VECTOR_MASKED);
                     break;
                 case 0x17:
-                    if (rv64_xtheadvector) return 0; // TODO: VMASK convertion
+                    if (rv64_xtheadvector) { DEFAULT_VECTOR; } // TODO: VMASK convertion
 
                     INST_NAME("PTEST Gx, Ex");
                     nextop = F8;
@@ -617,7 +617,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             opcode = F8;
             switch (opcode) {
                 case 0x0E:
-                    if (rv64_xtheadvector) return 0; // TODO: VMASK convertion
+                    if (rv64_xtheadvector) { DEFAULT_VECTOR; } // TODO: VMASK convertion
 
                     INST_NAME("PBLENDW Gx, Ex, Ib");
                     nextop = F8;
@@ -674,7 +674,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             }
             break;
         case 0x50:
-            if (rv64_xtheadvector) return 0; // TODO: VMASK convertion
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // TODO: VMASK convertion
 
             INST_NAME("PMOVMSKD Gd, Ex");
             nextop = F8;
@@ -1096,7 +1096,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             }
             break;
         case 0x70:
-            if (rv64_xtheadvector) return 0; // lack of vrgatherei16.vv
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // lack of vrgatherei16.vv
 
             INST_NAME("PSHUFD Gx, Ex, Ib");
             nextop = F8;
@@ -1326,7 +1326,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             break;
         case 0xA3 ... 0xC1: return 0;
         case 0xC4:
-            if (rv64_xtheadvector) return 0; // TODO: VMASK convertion
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // TODO: VMASK convertion
 
             INST_NAME("PINSRW Gx, Ed, Ib");
             nextop = F8;
@@ -1441,7 +1441,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             }
             break;
         case 0xD7:
-            if (rv64_xtheadvector) return 0; // TODO: VMASK convertion
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // TODO: VMASK convertion
 
             INST_NAME("PMOVMSKB Gd, Ex");
             nextop = F8;
@@ -1519,7 +1519,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             VAND_VV(q0, q1, q0, VECTOR_UNMASKED);
             break;
         case 0xE0:
-            if (rv64_xtheadvector) return 0; // lack of vaddu.vv
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // lack of vaddu.vv
 
             INST_NAME("PAVGB Gx, Ex");
             nextop = F8;
@@ -1572,7 +1572,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             VSRA_VX(q0, q0, x4, VECTOR_UNMASKED);
             break;
         case 0xE3:
-            if (rv64_xtheadvector) return 0; // lack of vaddu.vv
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // lack of vaddu.vv
 
             INST_NAME("PAVGW Gx, Ex");
             nextop = F8;
@@ -1708,7 +1708,7 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
             VSLL_VX(q0, q0, x4, VECTOR_UNMASKED);
             break;
         case 0xF5:
-            if (rv64_xtheadvector) return 0; // lack of vrgatherei16.vv
+            if (rv64_xtheadvector) { DEFAULT_VECTOR; } // lack of vrgatherei16.vv
 
             INST_NAME("PMADDWD Gx, Ex");
             nextop = F8;
diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h
index f026548a..c2b7a27b 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass0.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass0.h
@@ -45,7 +45,7 @@
 #define DEFAULT                         \
         --dyn->size;                    \
         *ok = -1;                       \
-        if(box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing) {\
+        if(box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==1) {\
         dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %sOpcode %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
         (void*)ip, rex.is32bits?"32bits ":"",\
         PKip(0),                        \
diff --git a/src/dynarec/rv64/dynarec_rv64_pass3.h b/src/dynarec/rv64/dynarec_rv64_pass3.h
index d8e7dfa4..0384b0a9 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass3.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass3.h
@@ -29,7 +29,7 @@
 #define FTABLE64(A, V)  {mmx87_regs_t v = {.d = V}; int val64offset = Table64(dyn, v.q, 3); MESSAGE(LOG_DUMP, "  FTable64: %g\n", v.d); AUIPC(x1, SPLIT20(val64offset)); FLD(A, x1, SPLIT12(val64offset));}
 
 #define DEFAULT_VECTOR                                                                                       \
-    if (box64_dynarec_log >= LOG_INFO || box64_dynarec_dump || box64_dynarec_missing) {                      \
+    if (box64_dynarec_log >= LOG_INFO || box64_dynarec_dump || box64_dynarec_missing==2) {                   \
         dynarec_log(LOG_NONE, "%p: Dynarec fallback to scalar version because of %sOpcode"                   \
                               " %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
             (void*)ip, rex.is32bits ? "x86 " : "x64 ",                                                       \