diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-07-07 10:37:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-07-07 10:37:51 +0200 |
| commit | 14b0323bf64ba28b081effb78ef7d3897fd5d64d (patch) | |
| tree | 724d37afadc393dc6ffd994449cafa8f57212f86 /src/dynarec/arm64 | |
| parent | b4828477794a8e69a96f0ca7991ad0e619d1b2a3 (diff) | |
| download | box64-14b0323bf64ba28b081effb78ef7d3897fd5d64d.tar.gz box64-14b0323bf64ba28b081effb78ef7d3897fd5d64d.zip | |
[ARM64_DYNAREC] Reworked ymm0 propagation
Diffstat (limited to 'src/dynarec/arm64')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 10 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.h | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 8 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass0.h | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass1.h | 2 |
5 files changed, 10 insertions, 13 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index afb1ed6b..8fd0929e 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -688,6 +688,8 @@ void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t r dynarec_log(LOG_NONE, ", jmp=%d", dyn->insts[ninst].x64.jmp_insts); if(dyn->insts[ninst].x64.jmp && dyn->insts[ninst].x64.jmp_insts==-1) dynarec_log(LOG_NONE, ", jmp=out"); + if(dyn->insts[ninst].x64.has_callret) + dynarec_log(LOG_NONE, ", callret"); if(dyn->last_ip) dynarec_log(LOG_NONE, ", last_ip=%p", (void*)dyn->last_ip); for(int ii=0; ii<32; ++ii) { @@ -789,14 +791,6 @@ void fpu_reset_ninst(dynarec_native_t* dyn, int ninst) } -void arm64_fpu_reset(dynarec_native_t* dyn, int ninst, int step) -{ - if(step<2) { - dyn->insts[ninst].ymm0_in = 0; - dyn->insts[ninst].ymm0_out = 0; - } -} - int fpu_is_st_freed(dynarec_native_t* dyn, int ninst, int st) { return (dyn->n.tags&(0b11<<(st*2)))?1:0; diff --git a/src/dynarec/arm64/dynarec_arm64_functions.h b/src/dynarec/arm64/dynarec_arm64_functions.h index 0af490e4..b6c95904 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.h +++ b/src/dynarec/arm64/dynarec_arm64_functions.h @@ -69,7 +69,6 @@ void print_opcode(dynarec_native_t* dyn, int ninst, uint32_t opcode); // reset the cache void fpu_reset(dynarec_native_t* dyn); void fpu_reset_ninst(dynarec_native_t* dyn, int ninst); -void arm64_fpu_reset(dynarec_native_t* dyn, int ninst, int step); // is st freed int fpu_is_st_freed(dynarec_native_t* dyn, int ninst, int st); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 136c0f8c..04fa97f6 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -1806,6 +1806,8 @@ int ymm_get_reg(dynarec_arm_t* dyn, int ninst, int s1, int a, int forwrite, int return i; } // nope, grab a new one + if(dyn->ymm_zero&(1<<a)) + forwrite = 1; // if the reg was zero, then it will need to be write back int ret = fpu_get_reg_ymm(dyn, ninst, forwrite?NEON_CACHE_YMMW:NEON_CACHE_YMMR, a, k1, k2, k3); if(dyn->ymm_zero&(1<<a)) { VEORQ(ret, ret, ret); @@ -2365,6 +2367,12 @@ void fpu_reflectcache(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3) x87_reflectcache(dyn, ninst, s1, s2, s3); mmx_reflectcache(dyn, ninst, s1); //sse_reflectcache(dyn, ninst, s1); // no need, it's pushed/unpushed during call + // but ymm0 needs to be pushed + if(dyn->ymm_zero) { + ADDx_U12(s1, xEmu, offsetof(x64emu_t, ymm[0])); + for(int i=0; i<16; ++i) + STPx_S7_offset(xZR, xZR, s1, 16*i); + } } void fpu_unreflectcache(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3) diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h index 510dd4ab..7d4c0c2d 100644 --- a/src/dynarec/arm64/dynarec_arm64_pass0.h +++ b/src/dynarec/arm64/dynarec_arm64_pass0.h @@ -26,13 +26,11 @@ dyn->n.combined1 = dyn->n.combined2 = 0;\ dyn->n.swapped = 0; dyn->n.barrier = 0; \ dyn->insts[ninst].f_entry = dyn->f; \ - dyn->insts[ninst].ymm0_in = dyn->ymm_zero;\ if(ninst) {dyn->insts[ninst-1].x64.size = dyn->insts[ninst].x64.addr - dyn->insts[ninst-1].x64.addr;} #define INST_EPILOG \ dyn->insts[ninst].f_exit = dyn->f; \ dyn->insts[ninst].n = dyn->n; \ - dyn->insts[ninst].ymm0_out = dyn->ymm_zero;\ dyn->insts[ninst].x64.has_next = (ok>0)?1:0; #define INST_NAME(name) #define DEFAULT \ diff --git a/src/dynarec/arm64/dynarec_arm64_pass1.h b/src/dynarec/arm64/dynarec_arm64_pass1.h index ab1f5fc4..6cf92feb 100644 --- a/src/dynarec/arm64/dynarec_arm64_pass1.h +++ b/src/dynarec/arm64/dynarec_arm64_pass1.h @@ -5,12 +5,10 @@ #define NEW_INST \ dyn->insts[ninst].f_entry = dyn->f; \ dyn->n.combined1 = dyn->n.combined2 = 0;\ - dyn->insts[ninst].ymm0_in = dyn->ymm_zero;\ dyn->n.swapped = 0; dyn->n.barrier = 0 #define INST_EPILOG \ dyn->insts[ninst].n = dyn->n; \ - dyn->insts[ninst].ymm0_out = dyn->ymm_zero;\ dyn->insts[ninst].f_exit = dyn->f #define INST_NAME(name) |