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 | |
| 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')
| -rw-r--r-- | src/core.c | 10 | ||||
| -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 | ||||
| -rw-r--r-- | src/include/debug.h | 1 | ||||
| -rw-r--r-- | src/tools/rcfile.c | 2 |
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 |