about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-04-02 23:21:14 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-04-02 23:21:21 +0200
commita8866c3f416a68e829d92ece0279a747270afa09 (patch)
tree6e0f56aaa1be5f6840c21e73b15262c70cac0894 /src
parentf64eca5d9bf5b87c34c9bb2ded8b0a0ab424a9db (diff)
downloadbox64-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.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass0.h1
-rw-r--r--src/dynarec/dynarec_native.c2
-rw-r--r--src/dynarec/dynarec_native_pass.c4
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