diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-10-22 16:13:55 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-10-22 16:13:55 +0200 |
| commit | bf6e74ad8eb26d30de5654b7ab021a18061346b1 (patch) | |
| tree | d77dc9cedeb3bb606eefee9eb4e5fcadb93296e2 /src | |
| parent | c2253dafc09b9651a263e19f5f656564f18df633 (diff) | |
| download | box64-bf6e74ad8eb26d30de5654b7ab021a18061346b1.tar.gz box64-bf6e74ad8eb26d30de5654b7ab021a18061346b1.zip | |
[DYNAREC] Added BOX64_DYNAREC_SAFEFLAGS
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 13 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 3 | ||||
| -rwxr-xr-x | src/include/debug.h | 1 | ||||
| -rwxr-xr-x | src/main.c | 12 |
4 files changed, 24 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 4cdb7bea..59c70674 100755 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1565,7 +1565,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xC2: INST_NAME("RETN"); //SETFLAGS(X_ALL, SF_SET); // Hack, set all flags (to an unknown state...) - READFLAGS(X_PEND); // lets play safe here too + if(box64_dynarec_safeflags) { + READFLAGS(X_PEND); // lets play safe here too + } BARRIER(BARRIER_FLOAT); i32 = F16; retn_to_epilog(dyn, ninst, i32); @@ -1575,7 +1577,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xC3: INST_NAME("RET"); // SETFLAGS(X_ALL, SF_SET); // Hack, set all flags (to an unknown state...) - READFLAGS(X_PEND); // so instead, force the defered flags, so it's not too slow, and flags are not lost + if(box64_dynarec_safeflags) { + READFLAGS(X_PEND); // so instead, force the defered flags, so it's not too slow, and flags are not lost + } BARRIER(BARRIER_FLOAT); ret_to_epilog(dyn, ninst); *need_epilog = 0; @@ -2134,7 +2138,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; default: - if(ninst && dyn->insts[ninst-1].x64.set_flags) { + if((box64_dynarec_safeflags>1) || (ninst && dyn->insts[ninst-1].x64.set_flags)) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET); // Hack to set flags to "dont'care" state @@ -2464,7 +2468,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: // CALL Ed INST_NAME("CALL Ed"); - PASS2IF(((ninst && dyn->insts[ninst-1].x64.set_flags) + PASS2IF((box64_dynarec_safeflags>1) || + ((ninst && dyn->insts[ninst-1].x64.set_flags) || ((ninst>1) && dyn->insts[ninst-2].x64.set_flags)), 1) { READFLAGS(X_PEND); // that's suspicious diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 81e746c1..ff735cff 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -947,7 +947,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: // CALL Ed INST_NAME("CALL Ed"); - PASS2IF(((ninst && dyn->insts[ninst-1].x64.set_flags) + PASS2IF((box64_dynarec_safeflags>1) || + ((ninst && dyn->insts[ninst-1].x64.set_flags) || ((ninst>1) && dyn->insts[ninst-2].x64.set_flags)), 1) { READFLAGS(X_PEND); // that's suspicious diff --git a/src/include/debug.h b/src/include/debug.h index 5f228f58..4efcc7bb 100755 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -18,6 +18,7 @@ extern int box64_dynarec_bigblock; extern int box64_dynarec_strongmem; extern int box64_dynarec_fastnan; extern int box64_dynarec_x87double; +extern int box64_dynarec_safeflags; #ifdef ARM64 extern int arm64_asimd; extern int arm64_aes; diff --git a/src/main.c b/src/main.c index 6db4830f..9e1bb0bd 100755 --- a/src/main.c +++ b/src/main.c @@ -49,6 +49,7 @@ int box64_dynarec_bigblock = 1; int box64_dynarec_strongmem = 0; int box64_dynarec_x87double = 0; int box64_dynarec_fastnan = 1; +int box64_dynarec_safeflags = 1; uintptr_t box64_nodynarec_start = 0; uintptr_t box64_nodynarec_end = 0; #ifdef ARM64 @@ -456,6 +457,17 @@ void LoadLogEnv() if(!box64_dynarec_fastnan) printf_log(LOG_INFO, "Dynarec will try to normalize generated NAN\n"); } + p = getenv("BOX64_DYNAREC_SAFEFLAGS"); + if(p) { + if(strlen(p)==1) { + if(p[0]>='0' && p[0]<='2') + box64_dynarec_safeflags = p[0]-'0'; + } + if(!box64_dynarec_safeflags) + printf_log(LOG_INFO, "Dynarec will not play it safe with x64 flags\n"); + else + printf_log(LOG_INFO, "Dynarec will play %s safe with x64 flags\n", (box64_dynarec_safeflags==1)?"moderatly":"it"); + } p = getenv("BOX64_NODYNAREC"); if(p) { if (strchr(p,'-')) { |