diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-04-02 23:21:14 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-04-02 23:21:21 +0200 |
| commit | a8866c3f416a68e829d92ece0279a747270afa09 (patch) | |
| tree | 6e0f56aaa1be5f6840c21e73b15262c70cac0894 /src | |
| parent | f64eca5d9bf5b87c34c9bb2ded8b0a0ab424a9db (diff) | |
| download | box64-a8866c3f416a68e829d92ece0279a747270afa09.tar.gz box64-a8866c3f416a68e829d92ece0279a747270afa09.zip | |
[ARM64_DYNAREC] Better fix for #1366, that should help #1383)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass0.h | 1 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 4 |
4 files changed, 5 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index 9e3748ed..73946f88 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -212,15 +212,13 @@ static void neoncache_promote_double_combined(dynarec_arm_t* dyn, int ninst, int neoncache_promote_double_internal(dyn, ninst-1, maxinst, a-dyn->insts[ninst].n.stack_push); // go forward is combined is not pop'd if(a-dyn->insts[ninst].n.stack_pop>=0) - if(!dyn->insts[ninst+1].n.barrier) + if(!((ninst+1<dyn->size) && dyn->insts[ninst+1].n.barrier)) neoncache_promote_double_forward(dyn, ninst+1, maxinst, a-dyn->insts[ninst].n.stack_pop); } } } static void neoncache_promote_double_internal(dynarec_arm_t* dyn, int ninst, int maxinst, int a) { - if(dyn->insts[ninst+1].n.barrier) - return; while(ninst>=0) { a+=dyn->insts[ninst].n.stack_pop; // adjust Stack depth: add pop'd ST (going backward) int i = neoncache_get_st_f_i64(dyn, ninst, a); diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h index a335c6c5..d86981b3 100644 --- a/src/dynarec/arm64/dynarec_arm64_pass0.h +++ b/src/dynarec/arm64/dynarec_arm64_pass0.h @@ -22,7 +22,6 @@ #define SET_HASCALLRET() dyn->insts[ninst].x64.has_callret = 1 #define NEW_INST \ ++dyn->size; \ - memset(&dyn->insts[ninst], 0, sizeof(instruction_native_t)); \ dyn->insts[ninst].x64.addr = ip; \ dyn->n.combined1 = dyn->n.combined2 = 0;\ dyn->n.swapped = 0; dyn->n.barrier = 0; \ diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index f3af8d88..d53861ec 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -405,7 +405,6 @@ void CancelBlock64(int need_lock) mutex_lock(&my_context->mutex_dyndump); dynarec_native_t* helper = (dynarec_native_t*)current_helper; if(helper) { - memset(static_insts, 0, sizeof(static_insts)); if(helper->dynablock && helper->dynablock->actual_block) { FreeDynarecMap((uintptr_t)helper->dynablock->actual_block); helper->dynablock->actual_block = NULL; @@ -674,7 +673,6 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit } // ok, free the helper now //dynaFree(helper.insts); - memset(static_insts, 0, sizeof(static_insts)); helper.insts = NULL; if(insts_rsize/sizeof(instsize_t)<helper.insts_size) { printf_log(LOG_NONE, "BOX64: Warning, insts_size difference in block between pass2 (%zu) and pass3 (%zu), allocated: %zu\n", oldinstsize, helper.insts_size, insts_rsize/sizeof(instsize_t)); diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 67d78ff6..11689307 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -49,6 +49,9 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int dyn->forward_to = 0; dyn->forward_size = 0; dyn->forward_ninst = 0; + #if STEP == 0 + memset(&dyn->insts[ninst], 0, sizeof(instruction_native_t)); + #endif fpu_reset(dyn); ARCH_INIT(); int reset_n = -1; @@ -294,6 +297,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int } ++ninst; #if STEP == 0 + memset(&dyn->insts[ninst], 0, sizeof(instruction_native_t)); if(ok && (((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)addr)) || (addr>=box64_nodynarec_start && addr<box64_nodynarec_end))) #else |