diff options
| -rwxr-xr-x | docs/USAGE.md | 3 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 6 | ||||
| -rwxr-xr-x | src/main.c | 4 |
3 files changed, 8 insertions, 5 deletions
diff --git a/docs/USAGE.md b/docs/USAGE.md index 56d450d1..b3723f81 100755 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -123,7 +123,8 @@ Enables/Disables Box64's Dynarec building BigBlock. #### BOX64_DYNAREC_STRONGMEM Enable/Disable simulation of Strong Memory model * 0 : Don't try anything special (Default.) -* 1 : Enable some Memory Barrier when reading from memory (on MOV opcode) to simulate Strong Memory Model (Default when libmonobdwgc-2.0.so is loaded) +* 1 : Enable some Memory Barrier when reading from memory (on some MOV opcode) to simulate Strong Memory Model while trying to limit performance impact (Default when libmonobdwgc-2.0.so is loaded) +* 2 : Enable some Memory Barrier when reading from memory (on some MOV opcode) to simulate Strong Memory Model #### BOX64_LIBGL * libXXXX set the name for libGL (defaults to libGL.so.1). diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 917e7e4a..bb40a9a7 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -955,7 +955,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin ed = wback; } } else { - if(box64_dynarec_strongmem) { + if(box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || !ninst || box64_dynarec_strongmem>1 || (ninst && dyn->insts[ninst-1].x64.barrier))) { DMB_ISH(); } addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff, 0, rex, 0, 0); @@ -971,7 +972,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(MODREG) { MOVxw_REG(gd, xRAX+(nextop&7)+(rex.b<<3)); } else { - if(box64_dynarec_strongmem) { + if(box64_dynarec_strongmem && + (dyn->insts[ninst].x64.barrier || !ninst || box64_dynarec_strongmem>1 || (ninst && dyn->insts[ninst-1].x64.barrier))) { DMB_ISH(); } addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, 0, 0); diff --git a/src/main.c b/src/main.c index c5719f4e..cc48eb14 100755 --- a/src/main.c +++ b/src/main.c @@ -276,11 +276,11 @@ void LoadLogEnv() p = getenv("BOX64_DYNAREC_STRONGMEM"); if(p) { if(strlen(p)==1) { - if(p[0]>='0' && p[0]<='1') + if(p[0]>='0' && p[0]<='2') box64_dynarec_strongmem = p[0]-'0'; } if(box64_dynarec_strongmem) - printf_log(LOG_INFO, "Dynarec will try to emulate a strong memory model\n"); + printf_log(LOG_INFO, "Dynarec will try to emulate a strong memory model%s\n", (box64_dynarec_strongmem==1)?" with limited performace loss":""); } p = getenv("BOX64_NODYNAREC"); if(p) { |