diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-12-23 13:26:52 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-12-23 13:26:52 +0100 |
| commit | 1360e7112c8a027dd7e1a6cdd7942d1038aa54f2 (patch) | |
| tree | 7f262a4002ab6cd3142b101826a071e4f7f9bccf /src/dynarec | |
| parent | 12987af5619489d945d45d2dd05af1656707e2a2 (diff) | |
| download | box64-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.h | 3 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass1.h | 11 | ||||
| -rw-r--r-- | src/dynarec/dynarec.c | 3 |
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); } |