about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-04-18 13:43:09 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-04-18 13:43:09 +0200
commita66725adc4ae72234c256e50dc031fac603d8492 (patch)
treeb272b102775a96bca3a8a377eb444e154aeb9bbb /src
parent8d9d5f3fc3da7356c71d98b0380b81293a486bba (diff)
downloadbox64-a66725adc4ae72234c256e50dc031fac603d8492.tar.gz
box64-a66725adc4ae72234c256e50dc031fac603d8492.zip
[DYNAREC] Small optim on flags barrier handling
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_native.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index b7ab0ff9..6957ed34 100755
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -348,18 +348,15 @@ static void updateNeed(dynarec_native_t* dyn, int ninst, uint32_t need) {
     if(dyn->insts[ninst].x64.jmp_insts==-1)
         new_need |= X_PEND;
 
+    if((new_need == old_need) && (new_use == old_use))    // no changes, bye
+        return;
+    
+    new_need &=~new_set;    // clean needed flag that were suplied
+    new_need |= new_use;    // new need
     // a Flag Barrier will change all need to "Pending", as it clear all flags optimisation
     if(new_need && dyn->insts[ninst].x64.barrier&BARRIER_FLAGS)
         new_need = X_PEND;
     
-    if((new_need == old_need) && (new_use == old_use))    // no changes, bye
-        return;
-    
-    if(!(new_need && dyn->insts[ninst].x64.barrier&BARRIER_FLAGS)) {
-        new_need &=~new_set;    // clean needed flag that were suplied
-        new_need |= new_use;    // new need
-    }
-
     if((new_need == (X_ALL|X_PEND)) && (dyn->insts[ninst].x64.state_flags & SF_SET))
         new_need = X_ALL;
 
@@ -438,7 +435,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) {
         protectDB(addr, end-addr);  //end is 1byte after actual end
     // compute hash signature
     uint32_t hash = X31_hash_code((void*)addr, end-addr);
-    // Compute flag_need, without with current barriers
+    // Compute flag_need, without current barriers
     resetNeed(&helper);
     for(int i = helper.size; i-- > 0;)
         updateNeed(&helper, i, 0);
@@ -515,7 +512,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) {
             else
                 helper.insts[i].x64.use_flags |= (helper.insts[k].x64.need_flags | helper.insts[k].x64.use_flags);
         }
-        if(helper.insts[i].x64.barrier&BARRIER_FLAGS)
+        if(helper.insts[i].x64.barrier&BARRIER_FLAGS && !(helper.insts[i].x64.set_flags&SF_PENDING))
             // immediate barrier
             helper.insts[i].x64.use_flags |= X_PEND;
     }