diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-15 08:50:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-15 08:50:51 +0200 |
| commit | 927b804684397ad3948f5289b3448e94478b2af9 (patch) | |
| tree | f82995c20441b0725a4048aa3f7c410a1b1affae /src | |
| parent | 27de834abc8bb3b3d9b9268cc847037deb90ea8e (diff) | |
| download | box64-927b804684397ad3948f5289b3448e94478b2af9.tar.gz box64-927b804684397ad3948f5289b3448e94478b2af9.zip | |
[ARM64_DYNAREC] Reorganized pass3 to reduce size of box binary and lower compilation time
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_660f.c | 2 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_functions.c | 56 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_functions.h | 2 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_pass3.h | 52 |
4 files changed, 61 insertions, 51 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 1bb2a389..d81ca9f2 100755 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -2510,7 +2510,7 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VMOVeD(q0, 1, d1, 0); break; case 0xF7: - INST_NAME("MASKMOVDQU Gx, Ex") + INST_NAME("MASKMOVDQU Gx, Ex"); nextop = F8; GETGX(q0, 1); GETEX(q1, 0, 0); diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index b04fd96d..10390205 100755 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -487,3 +487,59 @@ const char* getCacheName(int t, int n) } return buff; } + +void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name) +{ + if(box64_dynarec_dump) { + printf_x64_instruction(my_context->dec, &dyn->insts[ninst].x64, name); + dynarec_log(LOG_NONE, "%s%p: %d emitted opcodes, inst=%d, barrier=%d state=%d/%d(%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d/%d", + (box64_dynarec_dump>1)?"\e[32m":"", + (void*)(dyn->native_start+dyn->insts[ninst].address), + dyn->insts[ninst].size/4, + ninst, + dyn->insts[ninst].x64.barrier, + dyn->insts[ninst].x64.state_flags, + dyn->f.pending, + dyn->f.dfnone, + dyn->insts[ninst].x64.may_set?"may":"set", + dyn->insts[ninst].x64.set_flags, + dyn->insts[ninst].x64.gen_flags, + dyn->insts[ninst].x64.use_flags, + dyn->insts[ninst].x64.need_before, + dyn->insts[ninst].x64.need_after, + dyn->smread, dyn->smwrite); + if(dyn->insts[ninst].pred_sz) { + dynarec_log(LOG_NONE, ", pred="); + for(int ii=0; ii<dyn->insts[ninst].pred_sz; ++ii) + dynarec_log(LOG_NONE, "%s%d", ii?"/":"", dyn->insts[ninst].pred[ii]); + } + if(dyn->insts[ninst].x64.jmp && dyn->insts[ninst].x64.jmp_insts>=0) + 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->last_ip) + dynarec_log(LOG_NONE, ", last_ip=%p", (void*)dyn->last_ip); + for(int ii=0; ii<24; ++ii) { + switch(dyn->insts[ninst].n.neoncache[ii].t) { + case NEON_CACHE_ST_D: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; + case NEON_CACHE_ST_F: dynarec_log(LOG_NONE, " S%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; + case NEON_CACHE_MM: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; + case NEON_CACHE_XMMW: dynarec_log(LOG_NONE, " Q%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; + case NEON_CACHE_XMMR: dynarec_log(LOG_NONE, " Q%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; + case NEON_CACHE_SCR: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; + case NEON_CACHE_NONE: + default: break; + } + } + if(dyn->n.stack || dyn->insts[ninst].n.stack_next || dyn->insts[ninst].n.x87stack) + dynarec_log(LOG_NONE, " X87:%d/%d(+%d/-%d)%d", dyn->n.stack, dyn->insts[ninst].n.stack_next, dyn->insts[ninst].n.stack_push, dyn->insts[ninst].n.stack_pop, dyn->insts[ninst].n.x87stack); + if(dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2) + dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].n.swapped?"SWP":"CMB", dyn->insts[ninst].n.combined1, dyn->insts[ninst].n.combined2); + dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":""); + } +} + +void print_arm64(dynarec_native_t* dyn, int ninst, uint32_t opcode) +{ + dynarec_log(LOG_NONE, "\t%08x\t%s\n", opcode, arm64_print(opcode, (uintptr_t)dyn->block)); +} \ No newline at end of file diff --git a/src/dynarec/arm64/dynarec_arm64_functions.h b/src/dynarec/arm64/dynarec_arm64_functions.h index 7fd12627..8ba81bc3 100755 --- a/src/dynarec/arm64/dynarec_arm64_functions.h +++ b/src/dynarec/arm64/dynarec_arm64_functions.h @@ -43,4 +43,6 @@ int getedparity(dynarec_native_t* dyn, int ninst, uintptr_t addr, uint8_t nextop const char* getCacheName(int t, int n); +void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name); +void print_arm64(dynarec_native_t* dyn, int ninst, uint32_t opcode); #endif //__DYNAREC_ARM_FUNCTIONS_H__ diff --git a/src/dynarec/arm64/dynarec_arm64_pass3.h b/src/dynarec/arm64/dynarec_arm64_pass3.h index a83d6d0a..7cdff56b 100755 --- a/src/dynarec/arm64/dynarec_arm64_pass3.h +++ b/src/dynarec/arm64/dynarec_arm64_pass3.h @@ -5,7 +5,7 @@ addInst(dyn->instsize, &dyn->insts_size, 0, 0); #define EMIT(A) \ do{ \ - if(box64_dynarec_dump) {dynarec_log(LOG_NONE, "\t%08x\t%s\n", (uint32_t)(A), arm64_print(A, (uintptr_t)dyn->block));} \ + if(box64_dynarec_dump) print_arm64(dyn, ninst, (uint32_t)(A)); \ *(uint32_t*)(dyn->block) = (uint32_t)(A); \ dyn->block += 4; dyn->native_size += 4; \ dyn->insts[ninst].size2 += 4; \ @@ -16,54 +16,6 @@ if(ninst) \ addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); #define INST_EPILOG -#define INST_NAME(name) \ - if(box64_dynarec_dump) {\ - printf_x64_instruction(my_context->dec, &dyn->insts[ninst].x64, name); \ - dynarec_log(LOG_NONE, "%s%p: %d emitted opcodes, inst=%d, barrier=%d state=%d/%d(%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d/%d", \ - (box64_dynarec_dump>1)?"\e[32m":"", \ - (void*)(dyn->native_start+dyn->insts[ninst].address), \ - dyn->insts[ninst].size/4, \ - ninst, \ - dyn->insts[ninst].x64.barrier, \ - dyn->insts[ninst].x64.state_flags, \ - dyn->f.pending, \ - dyn->f.dfnone, \ - dyn->insts[ninst].x64.may_set?"may":"set", \ - dyn->insts[ninst].x64.set_flags, \ - dyn->insts[ninst].x64.gen_flags, \ - dyn->insts[ninst].x64.use_flags, \ - dyn->insts[ninst].x64.need_before, \ - dyn->insts[ninst].x64.need_after, \ - dyn->smread, dyn->smwrite); \ - if(dyn->insts[ninst].pred_sz) { \ - dynarec_log(LOG_NONE, ", pred="); \ - for(int ii=0; ii<dyn->insts[ninst].pred_sz; ++ii)\ - dynarec_log(LOG_NONE, "%s%d", ii?"/":"", dyn->insts[ninst].pred[ii]);\ - } \ - if(dyn->insts[ninst].x64.jmp && dyn->insts[ninst].x64.jmp_insts>=0)\ - 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->last_ip) \ - dynarec_log(LOG_NONE, ", last_ip=%p", (void*)dyn->last_ip);\ - for(int ii=0; ii<24; ++ii) { \ - switch(dyn->insts[ninst].n.neoncache[ii].t) { \ - case NEON_CACHE_ST_D: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \ - case NEON_CACHE_ST_F: dynarec_log(LOG_NONE, " S%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \ - case NEON_CACHE_MM: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \ - case NEON_CACHE_XMMW: dynarec_log(LOG_NONE, " Q%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \ - case NEON_CACHE_XMMR: dynarec_log(LOG_NONE, " Q%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \ - case NEON_CACHE_SCR: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \ - case NEON_CACHE_NONE: \ - default: break; \ - } \ - } \ - if(dyn->n.stack || dyn->insts[ninst].n.stack_next || dyn->insts[ninst].n.x87stack) \ - dynarec_log(LOG_NONE, " X87:%d/%d(+%d/-%d)%d", dyn->n.stack, dyn->insts[ninst].n.stack_next, dyn->insts[ninst].n.stack_push, dyn->insts[ninst].n.stack_pop, dyn->insts[ninst].n.x87stack); \ - if(dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2) \ - dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].n.swapped?"SWP":"CMB", dyn->insts[ninst].n.combined1, dyn->insts[ninst].n.combined2); \ - dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":""); \ - } - +#define INST_NAME(name) inst_name_pass3(dyn, ninst, name) #define TABLE64(A, V) {int val64offset = Table64(dyn, (V)); MESSAGE(LOG_DUMP, " Table64: 0x%lx\n", (V)); LDRx_literal(A, val64offset);} #define FTABLE64(A, V) {mmx87_regs_t v = {.d = V}; int val64offset = Table64(dyn, v.q); MESSAGE(LOG_DUMP, " FTable64: %g\n", v.d); VLDR64_literal(A, val64offset);} |