From a66725adc4ae72234c256e50dc031fac603d8492 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 18 Apr 2022 13:43:09 +0200 Subject: [DYNAREC] Small optim on flags barrier handling --- src/dynarec/dynarec_native.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'src') 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; } -- cgit 1.4.1