diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-07-02 10:34:37 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-07-02 10:34:37 +0200 |
| commit | 4b0b3fc98ae4a1e848765e0cd48f958a13fc683d (patch) | |
| tree | 8f6be5a089600eb79972f340f01491189e512ec1 /src/dynarec/dynarec_native.c | |
| parent | c6afd44c1c91485c278376622871975d6d20f176 (diff) | |
| download | box64-4b0b3fc98ae4a1e848765e0cd48f958a13fc683d.tar.gz box64-4b0b3fc98ae4a1e848765e0cd48f958a13fc683d.zip | |
[DYNAREC] Improved cache coherency and internal jump handling, [ARM64_DYNAREC] Improved YMM register tracking
Diffstat (limited to 'src/dynarec/dynarec_native.c')
| -rw-r--r-- | src/dynarec/dynarec_native.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index 0bfa80ee..15ecdce8 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -101,6 +101,11 @@ void add_jump(dynarec_native_t *dyn, int ninst) { dyn->jmps[dyn->jmp_sz++] = ninst; } int get_first_jump(dynarec_native_t *dyn, int next) { + if(next<0 || next>dyn->size) + return -2; + return get_first_jump_addr(dyn, dyn->insts[next].x64.addr); +} +int get_first_jump_addr(dynarec_native_t *dyn, uintptr_t next) { for(int i=0; i<dyn->jmp_sz; ++i) if(dyn->insts[dyn->jmps[i]].x64.jmp == next) return dyn->jmps[i]; @@ -612,6 +617,17 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit } i = ii; } + // remove trailling dead code + while(helper.size && !helper.insts[helper.size-1].x64.alive) { + helper.isize-=helper.insts[helper.size-1].x64.size; + --helper.size; + } + if(!helper.size) { + // NULL block after removing dead code, how is that possible? + dynarec_log(LOG_INFO, "Warning, null-sized dynarec block after trimming dead code (%p)\n", (void*)addr); + CancelBlock64(0); + return CreateEmptyBlock(block, addr); + } pos = 0; while(pos<helper.size) pos = updateYmm0(&helper, pos); |