about summary refs log tree commit diff stats
path: root/src/dynarec
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/dynarec
parent12987af5619489d945d45d2dd05af1656707e2a2 (diff)
downloadbox64-1360e7112c8a027dd7e1a6cdd7942d1038aa54f2.tar.gz
box64-1360e7112c8a027dd7e1a6cdd7942d1038aa54f2.zip
[ARM64_DYNAREC] Added work in progress BOX64_DYNAREC_DF env. var.
Diffstat (limited to 'src/dynarec')
-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
3 files changed, 11 insertions, 6 deletions
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);
             }