#include "profiler.h" profiler_cfg prof; void prof_init() { memset(&prof,0,sizeof(prof)); prof.enable=false; } struct regacc { Sh4RegType reg; u32 sum; u32 r; u32 w; u32 rw; void print() { printf("%02d: %d || %d %d %d\n",reg,sum,r,w,rw); } bool operator< (const regacc& rhs) const { return sum>rhs.sum; } }; #include "hw/sh4/sh4_opcode_list.h" int stuffcmp(const void* p1,const void* p2) { sh4_opcodelistentry* a=(sh4_opcodelistentry*)p1; sh4_opcodelistentry* b=(sh4_opcodelistentry*)p2; return b->fallbacks-a->fallbacks; } extern u32 ret_hit,ret_all,ret_stc; extern u32 bm_gc_luc,bm_gcf_luc,cvld; extern u32 rdmt[6]; u32 SQW,DMAW; u32 TA_VTXC,TA_SPRC,TA_EOSC,TA_PPC,TA_SPC,TA_EOLC,TA_V64HC; u32 TA_VTX_O; u32 PVR_VTXC; u32 stati; u32 memops_t,memops_l; u32 rmls,rmlu; u32 srmls,srmlu,srmlc; u32 wmls,wmlu; u32 flsh; u32 vrd; u32 vrml_431; extern u32 nfb,ffb,bfb,mfb; u32 ralst[4]; extern u32 samples_gen; void print_blocks(); #ifndef HOST_NO_REC //called every emulated second void prof_periodical() { #if defined(HAS_PROFILE) #if 0 printf("SQW %d,DMAW %d\n",SQW,DMAW); DMAW=SQW=0; #endif #if !defined(HOST_NO_REC) print_blocks(); #endif return; printf("TA_VTXC %d,TA_SPRC %d,TA_EOSC %d,TA_PPC %d,TA_SPC %d,TA_EOLC %d,TA_V64HC %d\n", TA_VTXC,TA_SPRC,TA_EOSC,TA_PPC,TA_SPC,TA_EOLC,TA_V64HC); TA_VTXC=TA_SPRC=TA_EOSC=TA_PPC=TA_SPC=TA_EOLC=TA_V64HC=0; //for (u32 i=0;i0.05) printf("%s: %.2fM\n",shil_opcode_name(i),v); } if (prof.counters.shil.readm_reg!=0) { printf("***PROFILE REPORT***\n"); prof.counters.print(); } printf("opcode fallbacks:\n"); vector stuff; for (u32 i=0;opcodes[i].oph;i++) { if (opcodes[i].fallbacks) stuff.push_back(opcodes[i]); } if (stuff.size()) { qsort(&stuff[0],stuff.size(),sizeof(stuff[0]),stuffcmp); for (u32 i=0;i<10 && i