2 * $Id: sh4stat.c,v 1.2 2007-11-08 11:37:49 nkeynes Exp $
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( uint32_t pc )
187 uint16_t ir = sh4_read_word(pc);
188 #define UNDEF() sh4_stats[0]++
189 switch( (ir&0xF000) >> 12 ) {
193 switch( (ir&0x80) >> 7 ) {
195 switch( (ir&0x70) >> 4 ) {
198 uint32_t Rn = ((ir>>8)&0xF);
199 sh4_stats[I_STCSR]++;
204 uint32_t Rn = ((ir>>8)&0xF);
210 uint32_t Rn = ((ir>>8)&0xF);
216 uint32_t Rn = ((ir>>8)&0xF);
222 uint32_t Rn = ((ir>>8)&0xF);
232 { /* STC Rm_BANK, Rn */
233 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
240 switch( (ir&0xF0) >> 4 ) {
243 uint32_t Rn = ((ir>>8)&0xF);
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);
274 sh4_stats[I_OCBWB]++;
278 { /* MOVCA.L R0, @Rn */
279 uint32_t Rn = ((ir>>8)&0xF);
280 sh4_stats[I_MOVCA]++;
289 { /* MOV.B Rm, @(R0, Rn) */
290 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
295 { /* MOV.W Rm, @(R0, Rn) */
296 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
301 { /* MOV.L Rm, @(R0, Rn) */
302 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
308 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
313 switch( (ir&0xFF0) >> 4 ) {
326 sh4_stats[I_CLRMAC]++;
331 sh4_stats[I_LDTLB]++;
350 switch( (ir&0xF0) >> 4 ) {
358 sh4_stats[I_DIV0U]++;
363 uint32_t Rn = ((ir>>8)&0xF);
373 switch( (ir&0xF0) >> 4 ) {
376 uint32_t Rn = ((ir>>8)&0xF);
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);
405 { /* STS FPSCR, Rn */
406 uint32_t Rn = ((ir>>8)&0xF);
412 uint32_t Rn = ((ir>>8)&0xF);
422 switch( (ir&0xFF0) >> 4 ) {
430 sh4_stats[I_SLEEP]++;
444 { /* MOV.B @(R0, Rm), Rn */
445 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
450 { /* MOV.W @(R0, Rm), Rn */
451 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
456 { /* MOV.L @(R0, Rm), Rn */
457 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
462 { /* MAC.L @Rm+, @Rn+ */
463 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
473 { /* MOV.L Rm, @(disp, Rn) */
474 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
481 { /* MOV.B Rm, @Rn */
482 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
487 { /* MOV.W Rm, @Rn */
488 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
493 { /* MOV.L Rm, @Rn */
494 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
499 { /* MOV.B Rm, @-Rn */
500 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
505 { /* MOV.W Rm, @-Rn */
506 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
511 { /* MOV.L Rm, @-Rn */
512 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
518 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
519 sh4_stats[I_DIV0S]++;
524 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
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);
547 { /* CMP/STR Rm, Rn */
548 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
549 sh4_stats[I_CMPSTR]++;
554 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
555 sh4_stats[I_XTRCT]++;
559 { /* MULU.W Rm, Rn */
560 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
561 sh4_stats[I_MULUW]++;
565 { /* MULS.W Rm, Rn */
566 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
567 sh4_stats[I_MULSW]++;
578 { /* CMP/EQ Rm, Rn */
579 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
580 sh4_stats[I_CMPEQ]++;
584 { /* CMP/HS Rm, Rn */
585 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
586 sh4_stats[I_CMPHS]++;
590 { /* CMP/GE Rm, Rn */
591 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
592 sh4_stats[I_CMPGE]++;
597 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
602 { /* DMULU.L Rm, Rn */
603 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
604 sh4_stats[I_DMULU]++;
608 { /* CMP/HI Rm, Rn */
609 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
610 sh4_stats[I_CMPHI]++;
614 { /* CMP/GT Rm, Rn */
615 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
616 sh4_stats[I_CMPGT]++;
621 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
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);
644 { /* DMULS.L Rm, Rn */
645 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
646 sh4_stats[I_DMULS]++;
651 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
657 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
669 switch( (ir&0xF0) >> 4 ) {
672 uint32_t Rn = ((ir>>8)&0xF);
678 uint32_t Rn = ((ir>>8)&0xF);
684 uint32_t Rn = ((ir>>8)&0xF);
694 switch( (ir&0xF0) >> 4 ) {
697 uint32_t Rn = ((ir>>8)&0xF);
703 uint32_t Rn = ((ir>>8)&0xF);
704 sh4_stats[I_CMPPZ]++;
709 uint32_t Rn = ((ir>>8)&0xF);
719 switch( (ir&0xF0) >> 4 ) {
721 { /* STS.L MACH, @-Rn */
722 uint32_t Rn = ((ir>>8)&0xF);
727 { /* STS.L MACL, @-Rn */
728 uint32_t Rn = ((ir>>8)&0xF);
733 { /* STS.L PR, @-Rn */
734 uint32_t Rn = ((ir>>8)&0xF);
739 { /* STC.L SGR, @-Rn */
740 uint32_t Rn = ((ir>>8)&0xF);
745 { /* STS.L FPUL, @-Rn */
746 uint32_t Rn = ((ir>>8)&0xF);
751 { /* STS.L FPSCR, @-Rn */
752 uint32_t Rn = ((ir>>8)&0xF);
757 { /* STC.L DBR, @-Rn */
758 uint32_t Rn = ((ir>>8)&0xF);
768 switch( (ir&0x80) >> 7 ) {
770 switch( (ir&0x70) >> 4 ) {
772 { /* STC.L SR, @-Rn */
773 uint32_t Rn = ((ir>>8)&0xF);
774 sh4_stats[I_STCSRM]++;
778 { /* STC.L GBR, @-Rn */
779 uint32_t Rn = ((ir>>8)&0xF);
784 { /* STC.L VBR, @-Rn */
785 uint32_t Rn = ((ir>>8)&0xF);
790 { /* STC.L SSR, @-Rn */
791 uint32_t Rn = ((ir>>8)&0xF);
796 { /* STC.L SPC, @-Rn */
797 uint32_t Rn = ((ir>>8)&0xF);
807 { /* STC.L Rm_BANK, @-Rn */
808 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
815 switch( (ir&0xF0) >> 4 ) {
818 uint32_t Rn = ((ir>>8)&0xF);
824 uint32_t Rn = ((ir>>8)&0xF);
825 sh4_stats[I_ROTCL]++;
834 switch( (ir&0xF0) >> 4 ) {
837 uint32_t Rn = ((ir>>8)&0xF);
843 uint32_t Rn = ((ir>>8)&0xF);
844 sh4_stats[I_CMPPL]++;
849 uint32_t Rn = ((ir>>8)&0xF);
850 sh4_stats[I_ROTCR]++;
859 switch( (ir&0xF0) >> 4 ) {
861 { /* LDS.L @Rm+, MACH */
862 uint32_t Rm = ((ir>>8)&0xF);
867 { /* LDS.L @Rm+, MACL */
868 uint32_t Rm = ((ir>>8)&0xF);
873 { /* LDS.L @Rm+, PR */
874 uint32_t Rm = ((ir>>8)&0xF);
879 { /* LDC.L @Rm+, SGR */
880 uint32_t Rm = ((ir>>8)&0xF);
885 { /* LDS.L @Rm+, FPUL */
886 uint32_t Rm = ((ir>>8)&0xF);
891 { /* LDS.L @Rm+, FPSCR */
892 uint32_t Rm = ((ir>>8)&0xF);
897 { /* LDC.L @Rm+, DBR */
898 uint32_t Rm = ((ir>>8)&0xF);
908 switch( (ir&0x80) >> 7 ) {
910 switch( (ir&0x70) >> 4 ) {
912 { /* LDC.L @Rm+, SR */
913 uint32_t Rm = ((ir>>8)&0xF);
914 sh4_stats[I_LDCSRM]++;
918 { /* LDC.L @Rm+, GBR */
919 uint32_t Rm = ((ir>>8)&0xF);
924 { /* LDC.L @Rm+, VBR */
925 uint32_t Rm = ((ir>>8)&0xF);
930 { /* LDC.L @Rm+, SSR */
931 uint32_t Rm = ((ir>>8)&0xF);
936 { /* LDC.L @Rm+, SPC */
937 uint32_t Rm = ((ir>>8)&0xF);
947 { /* LDC.L @Rm+, Rn_BANK */
948 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
955 switch( (ir&0xF0) >> 4 ) {
958 uint32_t Rn = ((ir>>8)&0xF);
964 uint32_t Rn = ((ir>>8)&0xF);
970 uint32_t Rn = ((ir>>8)&0xF);
980 switch( (ir&0xF0) >> 4 ) {
983 uint32_t Rn = ((ir>>8)&0xF);
989 uint32_t Rn = ((ir>>8)&0xF);
995 uint32_t Rn = ((ir>>8)&0xF);
1005 switch( (ir&0xF0) >> 4 ) {
1007 { /* LDS Rm, MACH */
1008 uint32_t Rm = ((ir>>8)&0xF);
1013 { /* LDS Rm, MACL */
1014 uint32_t Rm = ((ir>>8)&0xF);
1020 uint32_t Rm = ((ir>>8)&0xF);
1026 uint32_t Rm = ((ir>>8)&0xF);
1031 { /* LDS Rm, FPUL */
1032 uint32_t Rm = ((ir>>8)&0xF);
1037 { /* LDS Rm, FPSCR */
1038 uint32_t Rm = ((ir>>8)&0xF);
1044 uint32_t Rm = ((ir>>8)&0xF);
1054 switch( (ir&0xF0) >> 4 ) {
1057 uint32_t Rn = ((ir>>8)&0xF);
1063 uint32_t Rn = ((ir>>8)&0xF);
1064 sh4_stats[I_TASB]++;
1069 uint32_t Rn = ((ir>>8)&0xF);
1080 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1081 sh4_stats[I_SHAD]++;
1086 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1087 sh4_stats[I_SHLD]++;
1091 switch( (ir&0x80) >> 7 ) {
1093 switch( (ir&0x70) >> 4 ) {
1096 uint32_t Rm = ((ir>>8)&0xF);
1097 sh4_stats[I_LDCSR]++;
1102 uint32_t Rm = ((ir>>8)&0xF);
1108 uint32_t Rm = ((ir>>8)&0xF);
1114 uint32_t Rm = ((ir>>8)&0xF);
1120 uint32_t Rm = ((ir>>8)&0xF);
1130 { /* LDC Rm, Rn_BANK */
1131 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
1138 { /* MAC.W @Rm+, @Rn+ */
1139 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1140 sh4_stats[I_MACW]++;
1146 { /* MOV.L @(disp, Rm), Rn */
1147 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
1148 sh4_stats[I_MOVL]++;
1154 { /* MOV.B @Rm, Rn */
1155 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1156 sh4_stats[I_MOVB]++;
1160 { /* MOV.W @Rm, Rn */
1161 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1162 sh4_stats[I_MOVW]++;
1166 { /* MOV.L @Rm, Rn */
1167 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1168 sh4_stats[I_MOVL]++;
1173 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1178 { /* MOV.B @Rm+, Rn */
1179 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1180 sh4_stats[I_MOVB]++;
1184 { /* MOV.W @Rm+, Rn */
1185 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1186 sh4_stats[I_MOVW]++;
1190 { /* MOV.L @Rm+, Rn */
1191 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1192 sh4_stats[I_MOVL]++;
1197 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1202 { /* SWAP.B Rm, Rn */
1203 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1204 sh4_stats[I_SWAPB]++;
1208 { /* SWAP.W Rm, Rn */
1209 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1210 sh4_stats[I_SWAPW]++;
1215 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1216 sh4_stats[I_NEGC]++;
1221 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1226 { /* EXTU.B Rm, Rn */
1227 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1228 sh4_stats[I_EXTUB]++;
1232 { /* EXTU.W Rm, Rn */
1233 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1234 sh4_stats[I_EXTUW]++;
1238 { /* EXTS.B Rm, Rn */
1239 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1240 sh4_stats[I_EXTSB]++;
1244 { /* EXTS.W Rm, Rn */
1245 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1246 sh4_stats[I_EXTSW]++;
1252 { /* ADD #imm, Rn */
1253 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1254 sh4_stats[I_ADDI]++;
1258 switch( (ir&0xF00) >> 8 ) {
1260 { /* MOV.B R0, @(disp, Rn) */
1261 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1262 sh4_stats[I_MOVB]++;
1266 { /* MOV.W R0, @(disp, Rn) */
1267 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1268 sh4_stats[I_MOVW]++;
1272 { /* MOV.B @(disp, Rm), R0 */
1273 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1274 sh4_stats[I_MOVB]++;
1278 { /* MOV.W @(disp, Rm), R0 */
1279 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1280 sh4_stats[I_MOVW]++;
1284 { /* CMP/EQ #imm, R0 */
1285 int32_t imm = SIGNEXT8(ir&0xFF);
1286 sh4_stats[I_CMPEQI]++;
1291 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1297 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1303 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1309 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1319 { /* MOV.W @(disp, PC), Rn */
1320 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1;
1321 sh4_stats[I_MOVW]++;
1326 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1332 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1337 switch( (ir&0xF00) >> 8 ) {
1339 { /* MOV.B R0, @(disp, GBR) */
1340 uint32_t disp = (ir&0xFF);
1341 sh4_stats[I_MOVB]++;
1345 { /* MOV.W R0, @(disp, GBR) */
1346 uint32_t disp = (ir&0xFF)<<1;
1347 sh4_stats[I_MOVW]++;
1351 { /* MOV.L R0, @(disp, GBR) */
1352 uint32_t disp = (ir&0xFF)<<2;
1353 sh4_stats[I_MOVL]++;
1358 uint32_t imm = (ir&0xFF);
1359 sh4_stats[I_TRAPA]++;
1363 { /* MOV.B @(disp, GBR), R0 */
1364 uint32_t disp = (ir&0xFF);
1365 sh4_stats[I_MOVB]++;
1369 { /* MOV.W @(disp, GBR), R0 */
1370 uint32_t disp = (ir&0xFF)<<1;
1371 sh4_stats[I_MOVW]++;
1375 { /* MOV.L @(disp, GBR), R0 */
1376 uint32_t disp = (ir&0xFF)<<2;
1377 sh4_stats[I_MOVL]++;
1381 { /* MOVA @(disp, PC), R0 */
1382 uint32_t disp = (ir&0xFF)<<2;
1383 sh4_stats[I_MOVA]++;
1387 { /* TST #imm, R0 */
1388 uint32_t imm = (ir&0xFF);
1389 sh4_stats[I_TSTI]++;
1393 { /* AND #imm, R0 */
1394 uint32_t imm = (ir&0xFF);
1395 sh4_stats[I_ANDI]++;
1399 { /* XOR #imm, R0 */
1400 uint32_t imm = (ir&0xFF);
1401 sh4_stats[I_XORI]++;
1406 uint32_t imm = (ir&0xFF);
1411 { /* TST.B #imm, @(R0, GBR) */
1412 uint32_t imm = (ir&0xFF);
1413 sh4_stats[I_TSTB]++;
1417 { /* AND.B #imm, @(R0, GBR) */
1418 uint32_t imm = (ir&0xFF);
1419 sh4_stats[I_ANDB]++;
1423 { /* XOR.B #imm, @(R0, GBR) */
1424 uint32_t imm = (ir&0xFF);
1425 sh4_stats[I_XORB]++;
1429 { /* OR.B #imm, @(R0, GBR) */
1430 uint32_t imm = (ir&0xFF);
1437 { /* MOV.L @(disp, PC), Rn */
1438 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2;
1439 sh4_stats[I_MOVLPC]++;
1443 { /* MOV #imm, Rn */
1444 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1445 sh4_stats[I_MOVI]++;
1451 { /* FADD FRm, FRn */
1452 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1453 sh4_stats[I_FADD]++;
1457 { /* FSUB FRm, FRn */
1458 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1459 sh4_stats[I_FSUB]++;
1463 { /* FMUL FRm, FRn */
1464 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1465 sh4_stats[I_FMUL]++;
1469 { /* FDIV FRm, FRn */
1470 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1471 sh4_stats[I_FDIV]++;
1475 { /* FCMP/EQ FRm, FRn */
1476 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1477 sh4_stats[I_FCMPEQ]++;
1481 { /* FCMP/GT FRm, FRn */
1482 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1483 sh4_stats[I_FCMPGT]++;
1487 { /* FMOV @(R0, Rm), FRn */
1488 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1489 sh4_stats[I_FMOV7]++;
1493 { /* FMOV FRm, @(R0, Rn) */
1494 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1495 sh4_stats[I_FMOV4]++;
1499 { /* FMOV @Rm, FRn */
1500 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1501 sh4_stats[I_FMOV5]++;
1505 { /* FMOV @Rm+, FRn */
1506 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1507 sh4_stats[I_FMOV6]++;
1511 { /* FMOV FRm, @Rn */
1512 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1513 sh4_stats[I_FMOV2]++;
1517 { /* FMOV FRm, @-Rn */
1518 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1519 sh4_stats[I_FMOV3]++;
1523 { /* FMOV FRm, FRn */
1524 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1525 sh4_stats[I_FMOV1]++;
1529 switch( (ir&0xF0) >> 4 ) {
1531 { /* FSTS FPUL, FRn */
1532 uint32_t FRn = ((ir>>8)&0xF);
1533 sh4_stats[I_FSTS]++;
1537 { /* FLDS FRm, FPUL */
1538 uint32_t FRm = ((ir>>8)&0xF);
1539 sh4_stats[I_FLDS]++;
1543 { /* FLOAT FPUL, FRn */
1544 uint32_t FRn = ((ir>>8)&0xF);
1545 sh4_stats[I_FLOAT]++;
1549 { /* FTRC FRm, FPUL */
1550 uint32_t FRm = ((ir>>8)&0xF);
1551 sh4_stats[I_FTRC]++;
1556 uint32_t FRn = ((ir>>8)&0xF);
1557 sh4_stats[I_FNEG]++;
1562 uint32_t FRn = ((ir>>8)&0xF);
1563 sh4_stats[I_FABS]++;
1568 uint32_t FRn = ((ir>>8)&0xF);
1569 sh4_stats[I_FSQRT]++;
1574 uint32_t FRn = ((ir>>8)&0xF);
1575 sh4_stats[I_FSRRA]++;
1580 uint32_t FRn = ((ir>>8)&0xF);
1581 sh4_stats[I_FLDI0]++;
1586 uint32_t FRn = ((ir>>8)&0xF);
1587 sh4_stats[I_FLDI1]++;
1591 { /* FCNVSD FPUL, FRn */
1592 uint32_t FRn = ((ir>>8)&0xF);
1593 sh4_stats[I_FCNVSD]++;
1597 { /* FCNVDS FRm, FPUL */
1598 uint32_t FRm = ((ir>>8)&0xF);
1599 sh4_stats[I_FCNVDS]++;
1603 { /* FIPR FVm, FVn */
1604 uint32_t FVn = ((ir>>10)&0x3); uint32_t FVm = ((ir>>8)&0x3);
1605 sh4_stats[I_FIPR]++;
1609 switch( (ir&0x100) >> 8 ) {
1611 { /* FSCA FPUL, FRn */
1612 uint32_t FRn = ((ir>>9)&0x7)<<1;
1613 sh4_stats[I_FSCA]++;
1617 switch( (ir&0x200) >> 9 ) {
1619 { /* FTRV XMTRX, FVn */
1620 uint32_t FVn = ((ir>>10)&0x3);
1621 sh4_stats[I_FTRV]++;
1625 switch( (ir&0xC00) >> 10 ) {
1628 sh4_stats[I_FSCHG]++;
1633 sh4_stats[I_FRCHG]++;
1638 sh4_stats[I_UNDEF]++;
1656 { /* FMAC FR0, FRm, FRn */
1657 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1658 sh4_stats[I_FMAC]++;
.