4 * Support module for collecting instruction stats
6 * Copyright (c) 2005 Nathan Keynes.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
23 static uint64_t sh4_stats[SH4_INSTRUCTION_COUNT+1];
24 static uint64_t sh4_stats_total;
25 static const char *sh4_stats_names[] = {
33 "AND.B #imm, @(R0, GBR)",
80 "FMOV FRm, @(R0, Rn)",
83 "FMOV @(R0, Rm), FRn",
112 "MOVA @(disp, PC), R0",
127 "OR.B #imm, @(R0, GBR)",
159 "TST.B #imm, @(R0, GBR)",
162 "XOR.B #imm, @(R0, GBR)",
167 void sh4_stats_reset( void )
170 for( i=0; i<= I_UNDEF; i++ ) {
176 void sh4_stats_print( FILE *out )
179 for( i=0; i<= I_UNDEF; i++ ) {
180 fprintf( out, "%-20s\t%d\t%.2f%%\n", sh4_stats_names[i], (uint32_t)sh4_stats[i], ((double)sh4_stats[i])*100.0/(double)sh4_stats_total );
182 fprintf( out, "Total: %lld\n", sh4_stats_total );
185 void sh4_stats_add( sh4_inst_id item )
191 void sh4_stats_add_by_pc( uint32_t pc )
193 uint16_t ir = sh4_read_word(pc);
194 #define UNDEF() sh4_stats[0]++
195 switch( (ir&0xF000) >> 12 ) {
199 switch( (ir&0x80) >> 7 ) {
201 switch( (ir&0x70) >> 4 ) {
204 uint32_t Rn = ((ir>>8)&0xF);
205 sh4_stats[I_STCSR]++;
210 uint32_t Rn = ((ir>>8)&0xF);
216 uint32_t Rn = ((ir>>8)&0xF);
222 uint32_t Rn = ((ir>>8)&0xF);
228 uint32_t Rn = ((ir>>8)&0xF);
238 { /* STC Rm_BANK, Rn */
239 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
246 switch( (ir&0xF0) >> 4 ) {
249 uint32_t Rn = ((ir>>8)&0xF);
255 uint32_t Rn = ((ir>>8)&0xF);
261 uint32_t Rn = ((ir>>8)&0xF);
267 uint32_t Rn = ((ir>>8)&0xF);
273 uint32_t Rn = ((ir>>8)&0xF);
279 uint32_t Rn = ((ir>>8)&0xF);
280 sh4_stats[I_OCBWB]++;
284 { /* MOVCA.L R0, @Rn */
285 uint32_t Rn = ((ir>>8)&0xF);
286 sh4_stats[I_MOVCA]++;
295 { /* MOV.B Rm, @(R0, Rn) */
296 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
301 { /* MOV.W Rm, @(R0, Rn) */
302 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
307 { /* MOV.L Rm, @(R0, Rn) */
308 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
314 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
319 switch( (ir&0xFF0) >> 4 ) {
332 sh4_stats[I_CLRMAC]++;
337 sh4_stats[I_LDTLB]++;
356 switch( (ir&0xF0) >> 4 ) {
364 sh4_stats[I_DIV0U]++;
369 uint32_t Rn = ((ir>>8)&0xF);
379 switch( (ir&0xF0) >> 4 ) {
382 uint32_t Rn = ((ir>>8)&0xF);
388 uint32_t Rn = ((ir>>8)&0xF);
394 uint32_t Rn = ((ir>>8)&0xF);
400 uint32_t Rn = ((ir>>8)&0xF);
406 uint32_t Rn = ((ir>>8)&0xF);
411 { /* STS FPSCR, Rn */
412 uint32_t Rn = ((ir>>8)&0xF);
418 uint32_t Rn = ((ir>>8)&0xF);
428 switch( (ir&0xFF0) >> 4 ) {
436 sh4_stats[I_SLEEP]++;
450 { /* MOV.B @(R0, Rm), Rn */
451 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
456 { /* MOV.W @(R0, Rm), Rn */
457 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
462 { /* MOV.L @(R0, Rm), Rn */
463 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
468 { /* MAC.L @Rm+, @Rn+ */
469 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
479 { /* MOV.L Rm, @(disp, Rn) */
480 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
487 { /* MOV.B Rm, @Rn */
488 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
493 { /* MOV.W Rm, @Rn */
494 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
499 { /* MOV.L Rm, @Rn */
500 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
505 { /* MOV.B Rm, @-Rn */
506 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
511 { /* MOV.W Rm, @-Rn */
512 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
517 { /* MOV.L Rm, @-Rn */
518 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
524 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
525 sh4_stats[I_DIV0S]++;
530 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
536 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
542 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
548 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
553 { /* CMP/STR Rm, Rn */
554 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
555 sh4_stats[I_CMPSTR]++;
560 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
561 sh4_stats[I_XTRCT]++;
565 { /* MULU.W Rm, Rn */
566 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
567 sh4_stats[I_MULUW]++;
571 { /* MULS.W Rm, Rn */
572 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
573 sh4_stats[I_MULSW]++;
584 { /* CMP/EQ Rm, Rn */
585 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
586 sh4_stats[I_CMPEQ]++;
590 { /* CMP/HS Rm, Rn */
591 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
592 sh4_stats[I_CMPHS]++;
596 { /* CMP/GE Rm, Rn */
597 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
598 sh4_stats[I_CMPGE]++;
603 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
608 { /* DMULU.L Rm, Rn */
609 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
610 sh4_stats[I_DMULU]++;
614 { /* CMP/HI Rm, Rn */
615 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
616 sh4_stats[I_CMPHI]++;
620 { /* CMP/GT Rm, Rn */
621 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
622 sh4_stats[I_CMPGT]++;
627 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
633 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
639 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
645 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
650 { /* DMULS.L Rm, Rn */
651 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
652 sh4_stats[I_DMULS]++;
657 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
663 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
675 switch( (ir&0xF0) >> 4 ) {
678 uint32_t Rn = ((ir>>8)&0xF);
684 uint32_t Rn = ((ir>>8)&0xF);
690 uint32_t Rn = ((ir>>8)&0xF);
700 switch( (ir&0xF0) >> 4 ) {
703 uint32_t Rn = ((ir>>8)&0xF);
709 uint32_t Rn = ((ir>>8)&0xF);
710 sh4_stats[I_CMPPZ]++;
715 uint32_t Rn = ((ir>>8)&0xF);
725 switch( (ir&0xF0) >> 4 ) {
727 { /* STS.L MACH, @-Rn */
728 uint32_t Rn = ((ir>>8)&0xF);
733 { /* STS.L MACL, @-Rn */
734 uint32_t Rn = ((ir>>8)&0xF);
739 { /* STS.L PR, @-Rn */
740 uint32_t Rn = ((ir>>8)&0xF);
745 { /* STC.L SGR, @-Rn */
746 uint32_t Rn = ((ir>>8)&0xF);
751 { /* STS.L FPUL, @-Rn */
752 uint32_t Rn = ((ir>>8)&0xF);
757 { /* STS.L FPSCR, @-Rn */
758 uint32_t Rn = ((ir>>8)&0xF);
763 { /* STC.L DBR, @-Rn */
764 uint32_t Rn = ((ir>>8)&0xF);
774 switch( (ir&0x80) >> 7 ) {
776 switch( (ir&0x70) >> 4 ) {
778 { /* STC.L SR, @-Rn */
779 uint32_t Rn = ((ir>>8)&0xF);
780 sh4_stats[I_STCSRM]++;
784 { /* STC.L GBR, @-Rn */
785 uint32_t Rn = ((ir>>8)&0xF);
790 { /* STC.L VBR, @-Rn */
791 uint32_t Rn = ((ir>>8)&0xF);
796 { /* STC.L SSR, @-Rn */
797 uint32_t Rn = ((ir>>8)&0xF);
802 { /* STC.L SPC, @-Rn */
803 uint32_t Rn = ((ir>>8)&0xF);
813 { /* STC.L Rm_BANK, @-Rn */
814 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
821 switch( (ir&0xF0) >> 4 ) {
824 uint32_t Rn = ((ir>>8)&0xF);
830 uint32_t Rn = ((ir>>8)&0xF);
831 sh4_stats[I_ROTCL]++;
840 switch( (ir&0xF0) >> 4 ) {
843 uint32_t Rn = ((ir>>8)&0xF);
849 uint32_t Rn = ((ir>>8)&0xF);
850 sh4_stats[I_CMPPL]++;
855 uint32_t Rn = ((ir>>8)&0xF);
856 sh4_stats[I_ROTCR]++;
865 switch( (ir&0xF0) >> 4 ) {
867 { /* LDS.L @Rm+, MACH */
868 uint32_t Rm = ((ir>>8)&0xF);
873 { /* LDS.L @Rm+, MACL */
874 uint32_t Rm = ((ir>>8)&0xF);
879 { /* LDS.L @Rm+, PR */
880 uint32_t Rm = ((ir>>8)&0xF);
885 { /* LDC.L @Rm+, SGR */
886 uint32_t Rm = ((ir>>8)&0xF);
891 { /* LDS.L @Rm+, FPUL */
892 uint32_t Rm = ((ir>>8)&0xF);
897 { /* LDS.L @Rm+, FPSCR */
898 uint32_t Rm = ((ir>>8)&0xF);
903 { /* LDC.L @Rm+, DBR */
904 uint32_t Rm = ((ir>>8)&0xF);
914 switch( (ir&0x80) >> 7 ) {
916 switch( (ir&0x70) >> 4 ) {
918 { /* LDC.L @Rm+, SR */
919 uint32_t Rm = ((ir>>8)&0xF);
920 sh4_stats[I_LDCSRM]++;
924 { /* LDC.L @Rm+, GBR */
925 uint32_t Rm = ((ir>>8)&0xF);
930 { /* LDC.L @Rm+, VBR */
931 uint32_t Rm = ((ir>>8)&0xF);
936 { /* LDC.L @Rm+, SSR */
937 uint32_t Rm = ((ir>>8)&0xF);
942 { /* LDC.L @Rm+, SPC */
943 uint32_t Rm = ((ir>>8)&0xF);
953 { /* LDC.L @Rm+, Rn_BANK */
954 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
961 switch( (ir&0xF0) >> 4 ) {
964 uint32_t Rn = ((ir>>8)&0xF);
970 uint32_t Rn = ((ir>>8)&0xF);
976 uint32_t Rn = ((ir>>8)&0xF);
986 switch( (ir&0xF0) >> 4 ) {
989 uint32_t Rn = ((ir>>8)&0xF);
995 uint32_t Rn = ((ir>>8)&0xF);
1001 uint32_t Rn = ((ir>>8)&0xF);
1002 sh4_stats[I_SHLR]++;
1011 switch( (ir&0xF0) >> 4 ) {
1013 { /* LDS Rm, MACH */
1014 uint32_t Rm = ((ir>>8)&0xF);
1019 { /* LDS Rm, MACL */
1020 uint32_t Rm = ((ir>>8)&0xF);
1026 uint32_t Rm = ((ir>>8)&0xF);
1032 uint32_t Rm = ((ir>>8)&0xF);
1037 { /* LDS Rm, FPUL */
1038 uint32_t Rm = ((ir>>8)&0xF);
1043 { /* LDS Rm, FPSCR */
1044 uint32_t Rm = ((ir>>8)&0xF);
1050 uint32_t Rm = ((ir>>8)&0xF);
1060 switch( (ir&0xF0) >> 4 ) {
1063 uint32_t Rn = ((ir>>8)&0xF);
1069 uint32_t Rn = ((ir>>8)&0xF);
1070 sh4_stats[I_TASB]++;
1075 uint32_t Rn = ((ir>>8)&0xF);
1086 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1087 sh4_stats[I_SHAD]++;
1092 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1093 sh4_stats[I_SHLD]++;
1097 switch( (ir&0x80) >> 7 ) {
1099 switch( (ir&0x70) >> 4 ) {
1102 uint32_t Rm = ((ir>>8)&0xF);
1103 sh4_stats[I_LDCSR]++;
1108 uint32_t Rm = ((ir>>8)&0xF);
1114 uint32_t Rm = ((ir>>8)&0xF);
1120 uint32_t Rm = ((ir>>8)&0xF);
1126 uint32_t Rm = ((ir>>8)&0xF);
1136 { /* LDC Rm, Rn_BANK */
1137 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
1144 { /* MAC.W @Rm+, @Rn+ */
1145 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1146 sh4_stats[I_MACW]++;
1152 { /* MOV.L @(disp, Rm), Rn */
1153 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
1154 sh4_stats[I_MOVL]++;
1160 { /* MOV.B @Rm, Rn */
1161 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1162 sh4_stats[I_MOVB]++;
1166 { /* MOV.W @Rm, Rn */
1167 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1168 sh4_stats[I_MOVW]++;
1172 { /* MOV.L @Rm, Rn */
1173 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1174 sh4_stats[I_MOVL]++;
1179 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1184 { /* MOV.B @Rm+, Rn */
1185 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1186 sh4_stats[I_MOVB]++;
1190 { /* MOV.W @Rm+, Rn */
1191 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1192 sh4_stats[I_MOVW]++;
1196 { /* MOV.L @Rm+, Rn */
1197 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1198 sh4_stats[I_MOVL]++;
1203 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1208 { /* SWAP.B Rm, Rn */
1209 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1210 sh4_stats[I_SWAPB]++;
1214 { /* SWAP.W Rm, Rn */
1215 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1216 sh4_stats[I_SWAPW]++;
1221 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1222 sh4_stats[I_NEGC]++;
1227 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1232 { /* EXTU.B Rm, Rn */
1233 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1234 sh4_stats[I_EXTUB]++;
1238 { /* EXTU.W Rm, Rn */
1239 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1240 sh4_stats[I_EXTUW]++;
1244 { /* EXTS.B Rm, Rn */
1245 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1246 sh4_stats[I_EXTSB]++;
1250 { /* EXTS.W Rm, Rn */
1251 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1252 sh4_stats[I_EXTSW]++;
1258 { /* ADD #imm, Rn */
1259 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1260 sh4_stats[I_ADDI]++;
1264 switch( (ir&0xF00) >> 8 ) {
1266 { /* MOV.B R0, @(disp, Rn) */
1267 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1268 sh4_stats[I_MOVB]++;
1272 { /* MOV.W R0, @(disp, Rn) */
1273 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1274 sh4_stats[I_MOVW]++;
1278 { /* MOV.B @(disp, Rm), R0 */
1279 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1280 sh4_stats[I_MOVB]++;
1284 { /* MOV.W @(disp, Rm), R0 */
1285 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1286 sh4_stats[I_MOVW]++;
1290 { /* CMP/EQ #imm, R0 */
1291 int32_t imm = SIGNEXT8(ir&0xFF);
1292 sh4_stats[I_CMPEQI]++;
1297 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1303 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1309 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1315 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1325 { /* MOV.W @(disp, PC), Rn */
1326 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1;
1327 sh4_stats[I_MOVW]++;
1332 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1338 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1343 switch( (ir&0xF00) >> 8 ) {
1345 { /* MOV.B R0, @(disp, GBR) */
1346 uint32_t disp = (ir&0xFF);
1347 sh4_stats[I_MOVB]++;
1351 { /* MOV.W R0, @(disp, GBR) */
1352 uint32_t disp = (ir&0xFF)<<1;
1353 sh4_stats[I_MOVW]++;
1357 { /* MOV.L R0, @(disp, GBR) */
1358 uint32_t disp = (ir&0xFF)<<2;
1359 sh4_stats[I_MOVL]++;
1364 uint32_t imm = (ir&0xFF);
1365 sh4_stats[I_TRAPA]++;
1369 { /* MOV.B @(disp, GBR), R0 */
1370 uint32_t disp = (ir&0xFF);
1371 sh4_stats[I_MOVB]++;
1375 { /* MOV.W @(disp, GBR), R0 */
1376 uint32_t disp = (ir&0xFF)<<1;
1377 sh4_stats[I_MOVW]++;
1381 { /* MOV.L @(disp, GBR), R0 */
1382 uint32_t disp = (ir&0xFF)<<2;
1383 sh4_stats[I_MOVL]++;
1387 { /* MOVA @(disp, PC), R0 */
1388 uint32_t disp = (ir&0xFF)<<2;
1389 sh4_stats[I_MOVA]++;
1393 { /* TST #imm, R0 */
1394 uint32_t imm = (ir&0xFF);
1395 sh4_stats[I_TSTI]++;
1399 { /* AND #imm, R0 */
1400 uint32_t imm = (ir&0xFF);
1401 sh4_stats[I_ANDI]++;
1405 { /* XOR #imm, R0 */
1406 uint32_t imm = (ir&0xFF);
1407 sh4_stats[I_XORI]++;
1412 uint32_t imm = (ir&0xFF);
1417 { /* TST.B #imm, @(R0, GBR) */
1418 uint32_t imm = (ir&0xFF);
1419 sh4_stats[I_TSTB]++;
1423 { /* AND.B #imm, @(R0, GBR) */
1424 uint32_t imm = (ir&0xFF);
1425 sh4_stats[I_ANDB]++;
1429 { /* XOR.B #imm, @(R0, GBR) */
1430 uint32_t imm = (ir&0xFF);
1431 sh4_stats[I_XORB]++;
1435 { /* OR.B #imm, @(R0, GBR) */
1436 uint32_t imm = (ir&0xFF);
1443 { /* MOV.L @(disp, PC), Rn */
1444 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2;
1445 sh4_stats[I_MOVLPC]++;
1449 { /* MOV #imm, Rn */
1450 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1451 sh4_stats[I_MOVI]++;
1457 { /* FADD FRm, FRn */
1458 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1459 sh4_stats[I_FADD]++;
1463 { /* FSUB FRm, FRn */
1464 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1465 sh4_stats[I_FSUB]++;
1469 { /* FMUL FRm, FRn */
1470 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1471 sh4_stats[I_FMUL]++;
1475 { /* FDIV FRm, FRn */
1476 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1477 sh4_stats[I_FDIV]++;
1481 { /* FCMP/EQ FRm, FRn */
1482 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1483 sh4_stats[I_FCMPEQ]++;
1487 { /* FCMP/GT FRm, FRn */
1488 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1489 sh4_stats[I_FCMPGT]++;
1493 { /* FMOV @(R0, Rm), FRn */
1494 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1495 sh4_stats[I_FMOV7]++;
1499 { /* FMOV FRm, @(R0, Rn) */
1500 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1501 sh4_stats[I_FMOV4]++;
1505 { /* FMOV @Rm, FRn */
1506 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1507 sh4_stats[I_FMOV5]++;
1511 { /* FMOV @Rm+, FRn */
1512 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1513 sh4_stats[I_FMOV6]++;
1517 { /* FMOV FRm, @Rn */
1518 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1519 sh4_stats[I_FMOV2]++;
1523 { /* FMOV FRm, @-Rn */
1524 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1525 sh4_stats[I_FMOV3]++;
1529 { /* FMOV FRm, FRn */
1530 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1531 sh4_stats[I_FMOV1]++;
1535 switch( (ir&0xF0) >> 4 ) {
1537 { /* FSTS FPUL, FRn */
1538 uint32_t FRn = ((ir>>8)&0xF);
1539 sh4_stats[I_FSTS]++;
1543 { /* FLDS FRm, FPUL */
1544 uint32_t FRm = ((ir>>8)&0xF);
1545 sh4_stats[I_FLDS]++;
1549 { /* FLOAT FPUL, FRn */
1550 uint32_t FRn = ((ir>>8)&0xF);
1551 sh4_stats[I_FLOAT]++;
1555 { /* FTRC FRm, FPUL */
1556 uint32_t FRm = ((ir>>8)&0xF);
1557 sh4_stats[I_FTRC]++;
1562 uint32_t FRn = ((ir>>8)&0xF);
1563 sh4_stats[I_FNEG]++;
1568 uint32_t FRn = ((ir>>8)&0xF);
1569 sh4_stats[I_FABS]++;
1574 uint32_t FRn = ((ir>>8)&0xF);
1575 sh4_stats[I_FSQRT]++;
1580 uint32_t FRn = ((ir>>8)&0xF);
1581 sh4_stats[I_FSRRA]++;
1586 uint32_t FRn = ((ir>>8)&0xF);
1587 sh4_stats[I_FLDI0]++;
1592 uint32_t FRn = ((ir>>8)&0xF);
1593 sh4_stats[I_FLDI1]++;
1597 { /* FCNVSD FPUL, FRn */
1598 uint32_t FRn = ((ir>>8)&0xF);
1599 sh4_stats[I_FCNVSD]++;
1603 { /* FCNVDS FRm, FPUL */
1604 uint32_t FRm = ((ir>>8)&0xF);
1605 sh4_stats[I_FCNVDS]++;
1609 { /* FIPR FVm, FVn */
1610 uint32_t FVn = ((ir>>10)&0x3); uint32_t FVm = ((ir>>8)&0x3);
1611 sh4_stats[I_FIPR]++;
1615 switch( (ir&0x100) >> 8 ) {
1617 { /* FSCA FPUL, FRn */
1618 uint32_t FRn = ((ir>>9)&0x7)<<1;
1619 sh4_stats[I_FSCA]++;
1623 switch( (ir&0x200) >> 9 ) {
1625 { /* FTRV XMTRX, FVn */
1626 uint32_t FVn = ((ir>>10)&0x3);
1627 sh4_stats[I_FTRV]++;
1631 switch( (ir&0xC00) >> 10 ) {
1634 sh4_stats[I_FSCHG]++;
1639 sh4_stats[I_FRCHG]++;
1644 sh4_stats[I_UNDEF]++;
1662 { /* FMAC FR0, FRm, FRn */
1663 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1664 sh4_stats[I_FMAC]++;
.