about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-23 13:26:52 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-23 13:26:52 +0100
commit1360e7112c8a027dd7e1a6cdd7942d1038aa54f2 (patch)
tree7f262a4002ab6cd3142b101826a071e4f7f9bccf /src
parent12987af5619489d945d45d2dd05af1656707e2a2 (diff)
downloadbox64-1360e7112c8a027dd7e1a6cdd7942d1038aa54f2.tar.gz
box64-1360e7112c8a027dd7e1a6cdd7942d1038aa54f2.zip
[ARM64_DYNAREC] Added work in progress BOX64_DYNAREC_DF env. var.
Diffstat (limited to 'src')
-rw-r--r--src/core.c10
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass0.h3
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass1.h11
-rw-r--r--src/dynarec/dynarec.c3
-rw-r--r--src/include/debug.h1
-rw-r--r--src/tools/rcfile.c2
6 files changed, 24 insertions, 6 deletions
diff --git a/src/core.c b/src/core.c
index 4810146b..c97a57db 100644
--- a/src/core.c
+++ b/src/core.c
@@ -98,6 +98,7 @@ uintptr_t box64_nodynarec_end = 0;
 uintptr_t box64_dynarec_test_start = 0;
 uintptr_t box64_dynarec_test_end = 0;
 int box64_dynarec_gdbjit = 0;
+int box64_dynarec_df = 1;
 #ifdef ARM64
 int arm64_asimd = 0;
 int arm64_aes = 0;
@@ -911,6 +912,15 @@ void LoadLogEnv()
         if (box64_dynarec_gdbjit)
             printf_log(LOG_INFO, "Dynarec will generate debuginfo for gdbjit\n");
     }
+    p = getenv("BOX64_DYNAREC_DF");
+    if(p) {
+        if(strlen(p)==1) {
+            if(p[0]>='0' && p[0]<='1')
+                box64_dynarec_df = p[0]-'0';
+        }
+        if(!box64_dynarec_df)
+            printf_log(LOG_INFO, "Dynarec will not use/generate defered flags\n");
+    }
     p = getenv("BOX64_DYNAREC_ALIGNED_ATOMICS");
     if(p) {
         if(strlen(p)==1) {
diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h
index 4429aefb..83382629 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass0.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass0.h
@@ -14,7 +14,8 @@
         dyn->insts[ninst].x64.set_flags = A;    \
         dyn->insts[ninst].x64.state_flags = (B)&~SF_DF;  \
         dyn->f.pending=(B)&SF_SET_PENDING;      \
-        dyn->f.dfnone=((B)&SF_SET)?(((B)==SF_SET_NODF)?0:1):0;
+        dyn->f.dfnone=((B)&SF_SET)?(((B)==SF_SET_NODF)?0:1):0;  \
+        if(!box64_dynarec_df) {dyn->f.dfnone=1; dyn->f.pending=0; if((A)==SF_PENDING){printf_log(LOG_INFO, "Warning, some opcode use SF_PENDING, forcing deferedflags ON\n"); box64_dynarec_df=1; }}
 #define EMIT(A)         dyn->native_size+=4
 #define JUMP(A, C)         add_jump(dyn, ninst); add_next(dyn, (uintptr_t)A); SMEND(); dyn->insts[ninst].x64.jmp = A; dyn->insts[ninst].x64.jmp_cond = C; dyn->insts[ninst].x64.jmp_insts = 0
 #define BARRIER(A)      if(A!=BARRIER_MAYBE) {fpu_purgecache(dyn, ninst, 0, x1, x2, x3); dyn->insts[ninst].x64.barrier = A;} else dyn->insts[ninst].barrier_maybe = 1
diff --git a/src/dynarec/arm64/dynarec_arm64_pass1.h b/src/dynarec/arm64/dynarec_arm64_pass1.h
index 9a3132b3..f0f7019d 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass1.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass1.h
@@ -7,11 +7,12 @@
         if(!dyn->insts[ninst].x64.gen_flags && !dyn->insts[ninst].x64.use_flags)   \
                 propagate_nodf(dyn, ninst);     \
         dyn->f.dfnone = 0
-#define SETFLAGS(A,B)   \
-        dyn->insts[ninst].x64.set_flags = A;    \
-        dyn->insts[ninst].x64.state_flags = (B)&~SF_DF;  \
-        dyn->f.pending=(B)&SF_SET_PENDING;      \
-        dyn->f.dfnone=((B)&SF_SET)?(((B)==SF_SET_NODF)?0:1):0;
+#define SETFLAGS(A,B)                                                   \
+        dyn->insts[ninst].x64.set_flags = A;                            \
+        dyn->insts[ninst].x64.state_flags = (B)&~SF_DF;                 \
+        dyn->f.pending=(B)&SF_SET_PENDING;                              \
+        dyn->f.dfnone=((B)&SF_SET)?(((B)==SF_SET_NODF)?0:1):0;          \
+        if(!box64_dynarec_df) {dyn->f.dfnone=1; dyn->f.pending=0; }
 #define NEW_INST                                \
         dyn->insts[ninst].f_entry = dyn->f;     \
         dyn->n.combined1 = dyn->n.combined2 = 0;\
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c
index 84ff79ad..1e744b8f 100644
--- a/src/dynarec/dynarec.c
+++ b/src/dynarec/dynarec.c
@@ -216,6 +216,9 @@ void DynaRun(x64emu_t* emu)
                 Run(emu, 1);
             } else {
                 dynarec_log(LOG_DEBUG, "%04d|Running DynaRec Block @%p (%p) of %d x64 insts (hash=0x%x) emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize, block->hash, emu);
+                if(!box64_dynarec_df) {
+                    CHECK_FLAGS(emu);
+                }
                 // block is here, let's run it!
                 native_prolog(emu, block->block);
             }
diff --git a/src/include/debug.h b/src/include/debug.h
index 0a8d4058..14e062d5 100644
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -42,6 +42,7 @@ extern int box64_dynarec_wait;
 extern int box64_dynarec_missing;
 extern int box64_dynarec_aligned_atomics;
 extern int box64_dynarec_nativeflags;
+extern int box64_dynarec_df;
 #ifdef ARM64
 extern int arm64_asimd;
 extern int arm64_aes;
diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c
index 2881539c..247d821e 100644
--- a/src/tools/rcfile.c
+++ b/src/tools/rcfile.c
@@ -175,6 +175,7 @@ ENTRYBOOL(BOX64_DYNAREC_WAIT, box64_dynarec_wait)                   \
 ENTRYSTRING_(BOX64_NODYNAREC, box64_nodynarec)                      \
 ENTRYSTRING_(BOX64_DYNAREC_TEST, box64_dynarec_test)                \
 ENTRYBOOL(BOX64_DYNAREC_MISSING, box64_dynarec_missing)             \
+ENTRYBOOL(BOX64_DYNAREC_DF, box64_dynarec_df)                       \
 
 #else
 #define SUPER3()                                                    \
@@ -203,6 +204,7 @@ IGNORE(BOX64_DYNAREC_WAIT)                                          \
 IGNORE(BOX64_NODYNAREC)                                             \
 IGNORE(BOX64_DYNAREC_TEST)                                          \
 IGNORE(BOX64_DYNAREC_MISSING)                                       \
+IGNORE(BOX64_DYNAREC_DF)                                            \
 
 #endif