diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index e61a44452c..64fbeb4c08 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -1590,6 +1590,8 @@ void addSSEPreload(dynarec_arm_t* dyn, int ninst, int i2, uint32_t preload) has_host_call = 1; } uint16_t ymm_mask = 0; + uint16_t ymm_preload = 0; + uint16_t xmm_mask = 0; for(int i=0; i<16; ++i) { if(preload&(1<insts[i3].n.ssecache[i].reg = v; dyn->insts[i3].n.neoncache[v].t = NEON_CACHE_XMMR; dyn->insts[i3].n.neoncache[v].n = i; + if (i3 == i2) xmm_mask |= 1 << i; ++i3; } } } if(preload&(1<<(16+i))) { int v = ymm_preload_reg(dyn, i2?(i2-1):0, ninst, i); - if(v!=-1) { - ymm_mask |= 1<insts[i3].n.neoncache[v].t = NEON_CACHE_YMMR; dyn->insts[i3].n.neoncache[v].n = i; + if (i3 == i2) ymm_mask |= 1 << i; ++i3; } } } } } - preload = (preload&0xffff) | (ymm_mask<<16); // update ymm_mask + preload = (preload & 0xffff) | (ymm_preload << 16); // update ymm_mask dyn->insts[i2].preload_xmmymm = preload; dyn->insts[i2].preload_from = ninst; dyn->insts[i2].preload_host_call = has_host_call; - dyn->insts[i2].n.xmm_unneeded |= preload&0xffff; + dyn->insts[i2].n.xmm_unneeded |= xmm_mask; dyn->insts[i2].n.ymm_unneeded |= ymm_mask; } diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 3ed5deb797..ba27d97067 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -2815,7 +2815,7 @@ int fpu_get_reg_ymm(dynarec_arm_t* dyn, int ninst, int t, int ymm, int k1, int k if(!dyn->n.fpuused[i+j]) { // should a test be done to check if ymm is already in the purge list? if(!is_ymm_to_keep(dyn, i+j, k1, k2, k3) && (dyn->n.neoncache[i+j].t==NEON_CACHE_YMMR)) { - dyn->n.neoncache[i+j].v = 0; + fpu_free_reg(dyn, i+j); int ret = internal_mark_ymm(dyn, t, ymm, i+j); if(ret>=0) return ret; } @@ -2824,7 +2824,7 @@ int fpu_get_reg_ymm(dynarec_arm_t* dyn, int ninst, int t, int ymm, int k1, int k i = SCRATCH0; for(int j=dyn->n.fpu_scratch; j<8; ++j) { if(!is_ymm_to_keep(dyn, i+j, k1, k2, k3) && (dyn->n.neoncache[i+j].t==NEON_CACHE_YMMR)) { - dyn->n.neoncache[i+j].v = 0; + fpu_free_reg(dyn, i+j); int ret = internal_mark_ymm(dyn, t, ymm, i+j); if(ret>=0) return ret; } @@ -2836,7 +2836,7 @@ int fpu_get_reg_ymm(dynarec_arm_t* dyn, int ninst, int t, int ymm, int k1, int k // Save the reg and recycle it dyn->n.ymm_used|=(1<n.neoncache[i+j].n); VSTR128_U12(i+j, xEmu, offsetof(x64emu_t, ymm[dyn->n.neoncache[i+j].n])); - dyn->n.neoncache[i+j].v = 0; + fpu_free_reg(dyn, i+j); int ret = internal_mark_ymm(dyn, t, ymm, i+j); if(ret>=0) return ret; } @@ -2849,7 +2849,7 @@ int fpu_get_reg_ymm(dynarec_arm_t* dyn, int ninst, int t, int ymm, int k1, int k if((dyn->n.neoncache[i+j].t==NEON_CACHE_YMMW) && !is_ymm_to_keep(dyn, i+j, k1, k2, k3)) { dyn->n.ymm_used|=(1<n.neoncache[i+j].n); VSTR128_U12(i+j, xEmu, offsetof(x64emu_t, ymm[dyn->n.neoncache[i+j].n])); - dyn->n.neoncache[i+j].v = 0; + fpu_free_reg(dyn, i+j); int ret = internal_mark_ymm(dyn, t, ymm, i+j); if(ret>=0) return ret; }