diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-10-22 17:28:35 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-10-22 17:28:35 +0200 |
| commit | a530f565110875c431ff9600ee9da4a640599ec7 (patch) | |
| tree | 9ae38b0e04480078bc0ba7420c5afaf78d4a96f7 /src | |
| parent | bf6e74ad8eb26d30de5654b7ab021a18061346b1 (diff) | |
| download | box64-a530f565110875c431ff9600ee9da4a640599ec7.tar.gz box64-a530f565110875c431ff9600ee9da4a640599ec7.zip | |
[DYNAREC] Small change on how add_next/get_closest_next works
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_native.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index b9beabf0..9da1bdc9 100755 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -61,12 +61,20 @@ void printf_x64_instruction(zydis_dec_t* dec, instruction_x64_t* inst, const cha void add_next(dynarec_native_t *dyn, uintptr_t addr) { if(!box64_dynarec_bigblock) return; + // exist? for(int i=0; i<dyn->next_sz; ++i) if(dyn->next[i]==addr) return; + // put in a free slot + for(int i=0; i<dyn->next_sz; ++i) + if(!dyn->next[i]) { + dyn->next[i] = addr; + return; + } + // add slots if(dyn->next_sz == dyn->next_cap) { dyn->next_cap += 16; - dyn->next = (uintptr_t*)box_realloc(dyn->next, dyn->next_cap*sizeof(uintptr_t)); + dyn->next = (uintptr_t*)realloc(dyn->next, dyn->next_cap*sizeof(uintptr_t)); } dyn->next[dyn->next_sz++] = addr; } @@ -76,13 +84,12 @@ uintptr_t get_closest_next(dynarec_native_t *dyn, uintptr_t addr) { int i = 0; while((i<dyn->next_sz) && (best!=addr)) { if(dyn->next[i]<addr) { // remove the address, it's before current address - memmove(dyn->next+i, dyn->next+i+1, (dyn->next_sz-i-1)*sizeof(uintptr_t)); - --dyn->next_sz; + dyn->next[i] = 0; } else { if((dyn->next[i]<best) || !best) best = dyn->next[i]; - ++i; } + ++i; } return best; } |