diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-11-28 18:55:57 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-11-28 18:55:57 +0100 |
| commit | fa3481ea8ea0d88e6ec4f250df873e806d2cad45 (patch) | |
| tree | c8409bbdf7e28b44307d1613deff69fd6620b876 | |
| parent | ac54eceea5774ef9477153d7a9fcf7869e65da2c (diff) | |
| download | box64-fa3481ea8ea0d88e6ec4f250df873e806d2cad45.tar.gz box64-fa3481ea8ea0d88e6ec4f250df873e806d2cad45.zip | |
[DYNAREC] Optimized cleanDBFromAddressRange, again
| -rw-r--r-- | src/custommem.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/custommem.c b/src/custommem.c index b6cfa043..d8d2d768 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -628,7 +628,7 @@ void FreeDynarecMap(dynablock_t* db, uintptr_t addr, size_t size) ActuallyFreeDynarecMap(db, addr, size); } -uintptr_t getDefaultSize(uintptr_t addr) +uintptr_t getSizeJmpDefault(uintptr_t addr, size_t maxsize) { uintptr_t idx3, idx2, idx1, idx0; idx3 = (((uintptr_t)addr)>>48)&0xffff; @@ -638,10 +638,13 @@ uintptr_t getDefaultSize(uintptr_t addr) if(box64_jmptbl3[idx3][idx2] == box64_jmptbldefault1) return (addr&~((1LL<<32)-1)|0xffffffffLL)-addr + 1; idx1 = (((uintptr_t)addr)>>16)&0xffff; - if(box64_jmptbl3[idx3][idx2][idx1] == box64_jmptbldefault0) + uintptr_t* block = box64_jmptbl3[idx3][idx2][idx1]; + if(block == box64_jmptbldefault0) return (addr&~((1LL<<16)-1)|0xffffLL)-addr + 1; idx0 = addr&0xffff; - while(idx0<0x10000 && box64_jmptbl3[idx3][idx2][idx1][idx0]==(uintptr_t)native_next) + if (maxsize>0x10000) + maxsize = 0x10000; + while(idx0<maxsize && block[idx0]==(uintptr_t)native_next) ++idx0; return idx0 - (addr&0xffff); } @@ -666,7 +669,7 @@ void cleanDBFromAddressRange(uintptr_t addr, size_t size, int destroy) else MarkRangeDynablock(db, addr, size); } else { - uintptr_t next = getDefaultSize(i); + uintptr_t next = getSizeJmpDefault(i, size-i); if(next) i+=next-1; } |