diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-04-18 13:43:09 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-04-18 13:43:09 +0200 |
| commit | a66725adc4ae72234c256e50dc031fac603d8492 (patch) | |
| tree | b272b102775a96bca3a8a377eb444e154aeb9bbb /src | |
| parent | 8d9d5f3fc3da7356c71d98b0380b81293a486bba (diff) | |
| download | box64-a66725adc4ae72234c256e50dc031fac603d8492.tar.gz box64-a66725adc4ae72234c256e50dc031fac603d8492.zip | |
[DYNAREC] Small optim on flags barrier handling
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_native.c | 17 |
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; } |