diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-15 07:04:40 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-15 07:04:40 +0000 |
| commit | 4dbb1f6101b12a189a9c61c153c328b29889c6cf (patch) | |
| tree | f1c7d732f041148dec949b9761421082d7c3740e /src | |
| parent | ced38e86c4a6b1135d250e18aebd561e2451b689 (diff) | |
| download | box64-4dbb1f6101b12a189a9c61c153c328b29889c6cf.tar.gz box64-4dbb1f6101b12a189a9c61c153c328b29889c6cf.zip | |
[RV64_DYNAREC] Reorganized pass3 to reduce size of box binary and lower compilation time
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 65 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.h | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass3.h | 61 |
3 files changed, 73 insertions, 57 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c index 1bd0bbc3..dade3016 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.c +++ b/src/dynarec/rv64/dynarec_rv64_functions.c @@ -483,3 +483,68 @@ 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].e.extcache[ii].t) { + case EXT_CACHE_ST_D: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_ST_F: dynarec_log(LOG_NONE, " S%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_MM: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_SS: dynarec_log(LOG_NONE, " S%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_SD: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_SCR: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; + case EXT_CACHE_NONE: + default: break; + } + } + if(dyn->e.stack || dyn->insts[ninst].e.stack_next || dyn->insts[ninst].e.x87stack) + dynarec_log(LOG_NONE, " X87:%d/%d(+%d/-%d)%d", dyn->e.stack, dyn->insts[ninst].e.stack_next, dyn->insts[ninst].e.stack_push, dyn->insts[ninst].e.stack_pop, dyn->insts[ninst].e.x87stack); + if(dyn->insts[ninst].e.combined1 || dyn->insts[ninst].e.combined2) + dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].e.swapped?"SWP":"CMB", dyn->insts[ninst].e.combined1, dyn->insts[ninst].e.combined2); + dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":""); + } +} + +void print_opcode(dynarec_native_t* dyn, int ninst, uint32_t opcode) +{ + dynarec_log(LOG_NONE, "\t%08x\t%s\n", opcode, rv64_print(opcode, (uintptr_t)dyn->block)); +} + +void print_newinst(dynarec_native_t* dyn, int ninst) +{ + dynarec_log(LOG_NONE, "%sNew instruction %d, native=%p (0x%x)%s\n", + (box64_dynarec_dump>1)?"\e[4;32m":"", + ninst, dyn->block, dyn->native_size, + (box64_dynarec_dump>1)?"\e[m":"" + ); +} \ No newline at end of file diff --git a/src/dynarec/rv64/dynarec_rv64_functions.h b/src/dynarec/rv64/dynarec_rv64_functions.h index ce66827b..fc53dcd7 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.h +++ b/src/dynarec/rv64/dynarec_rv64_functions.h @@ -45,4 +45,8 @@ void extcacheUnwind(extcache_t* cache); const char* getCacheName(int t, int n); +void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name); +void print_opcode(dynarec_native_t* dyn, int ninst, uint32_t opcode); +void print_newinst(dynarec_native_t* dyn, int ninst); + #endif //__DYNAREC_RV64_FUNCTIONS_H__ diff --git a/src/dynarec/rv64/dynarec_rv64_pass3.h b/src/dynarec/rv64/dynarec_rv64_pass3.h index b3ee449c..24ab0dfa 100644 --- a/src/dynarec/rv64/dynarec_rv64_pass3.h +++ b/src/dynarec/rv64/dynarec_rv64_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), rv64_print(A, (uintptr_t)dyn->block));} \ + if(box64_dynarec_dump) print_opcode(dyn, ninst, (uint32_t)A); \ *(uint32_t*)(dyn->block) = (uint32_t)(A); \ dyn->block += 4; dyn->native_size += 4; \ dyn->insts[ninst].size2 += 4; \ @@ -13,64 +13,11 @@ #define MESSAGE(A, ...) if(box64_dynarec_dump) dynarec_log(LOG_NONE, __VA_ARGS__) #define NEW_INST \ - if(box64_dynarec_dump) {\ - dynarec_log(LOG_NONE, "%sNew instruction %d, native=%p (0x%x)%s\n", \ - (box64_dynarec_dump>1)?"\e[4;32m":"", \ - ninst, dyn->block, dyn->native_size, \ - (box64_dynarec_dump>1)?"\e[m":"" \ - );\ - }\ - if(ninst) \ + if(box64_dynarec_dump) print_newinst(dyn, ninst); \ + 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].e.extcache[ii].t) { \ - case EXT_CACHE_ST_D: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; \ - case EXT_CACHE_ST_F: dynarec_log(LOG_NONE, " S%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; \ - case EXT_CACHE_MM: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; \ - case EXT_CACHE_SS: dynarec_log(LOG_NONE, " S%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; \ - case EXT_CACHE_SD: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; \ - case EXT_CACHE_SCR: dynarec_log(LOG_NONE, " D%d:%s", EXTREG(ii), getCacheName(dyn->insts[ninst].e.extcache[ii].t, dyn->insts[ninst].e.extcache[ii].n)); break; \ - case EXT_CACHE_NONE: \ - default: break; \ - } \ - } \ - if(dyn->e.stack || dyn->insts[ninst].e.stack_next || dyn->insts[ninst].e.x87stack) \ - dynarec_log(LOG_NONE, " X87:%d/%d(+%d/-%d)%d", dyn->e.stack, dyn->insts[ninst].e.stack_next, dyn->insts[ninst].e.stack_push, dyn->insts[ninst].e.stack_pop, dyn->insts[ninst].e.x87stack); \ - if(dyn->insts[ninst].e.combined1 || dyn->insts[ninst].e.combined2) \ - dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].e.swapped?"SWP":"CMB", dyn->insts[ninst].e.combined1, dyn->insts[ninst].e.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)); AUIPC(A, SPLIT20(val64offset)); LD(A, A, SPLIT12(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); AUIPC(x1, SPLIT20(val64offset)); FLD(A, x1, SPLIT12(val64offset));} |