about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-11-19 11:22:59 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-11-19 11:22:59 +0100
commit3533db97ff091ee3950621f1fec60f438a9502b6 (patch)
tree13e76b6d6323a4ca005097af8748cc12dfdaca89 /src
parent7888cae6c79ace9e561fcdf21abbd81e83e9904a (diff)
downloadbox64-3533db97ff091ee3950621f1fec60f438a9502b6.tar.gz
box64-3533db97ff091ee3950621f1fec60f438a9502b6.zip
[DYNAREC] Reduce performance impact of StrongMem, and added old Strongmem method as BOX64_DYNAREC_STRONGMEM=2
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c6
-rwxr-xr-xsrc/main.c4
2 files changed, 6 insertions, 4 deletions
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) {