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.
20 #include "sh4/sh4stat.h"
21 #include "sh4/sh4core.h"
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",
114 "MOVA @(disp, PC), R0",
129 "OR.B #imm, @(R0, GBR)",
163 "TST.B #imm, @(R0, GBR)",
166 "XOR.B #imm, @(R0, GBR)",
171 void sh4_stats_reset( void )
174 for( i=0; i<= I_UNDEF; i++ ) {
180 void sh4_stats_print( FILE *out )
183 for( i=0; i<= I_UNDEF; i++ ) {
184 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 );
186 fprintf( out, "Total: %lld\n", sh4_stats_total );
189 void sh4_stats_add( sh4_inst_id item )
195 void sh4_stats_add_by_pc( uint32_t pc )
197 uint16_t ir = sh4_read_word(pc);
198 #define UNDEF() sh4_stats[0]++
199 switch( (ir&0xF000) >> 12 ) {
203 switch( (ir&0x80) >> 7 ) {
205 switch( (ir&0x70) >> 4 ) {
208 uint32_t Rn = ((ir>>8)&0xF);
209 sh4_stats[I_STCSR]++;
214 uint32_t Rn = ((ir>>8)&0xF);
220 uint32_t Rn = ((ir>>8)&0xF);
226 uint32_t Rn = ((ir>>8)&0xF);
232 uint32_t Rn = ((ir>>8)&0xF);
242 { /* STC Rm_BANK, Rn */
243 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
250 switch( (ir&0xF0) >> 4 ) {
253 uint32_t Rn = ((ir>>8)&0xF);
259 uint32_t Rn = ((ir>>8)&0xF);
265 uint32_t Rn = ((ir>>8)&0xF);
271 uint32_t Rn = ((ir>>8)&0xF);
277 uint32_t Rn = ((ir>>8)&0xF);
283 uint32_t Rn = ((ir>>8)&0xF);
284 sh4_stats[I_OCBWB]++;
288 { /* MOVCA.L R0, @Rn */
289 uint32_t Rn = ((ir>>8)&0xF);
290 sh4_stats[I_MOVCA]++;
299 { /* MOV.B Rm, @(R0, Rn) */
300 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
305 { /* MOV.W Rm, @(R0, Rn) */
306 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
311 { /* MOV.L Rm, @(R0, Rn) */
312 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
318 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
323 switch( (ir&0xFF0) >> 4 ) {
336 sh4_stats[I_CLRMAC]++;
341 sh4_stats[I_LDTLB]++;
360 switch( (ir&0xF0) >> 4 ) {
368 sh4_stats[I_DIV0U]++;
373 uint32_t Rn = ((ir>>8)&0xF);
383 switch( (ir&0xF0) >> 4 ) {
386 uint32_t Rn = ((ir>>8)&0xF);
392 uint32_t Rn = ((ir>>8)&0xF);
398 uint32_t Rn = ((ir>>8)&0xF);
404 uint32_t Rn = ((ir>>8)&0xF);
410 uint32_t Rn = ((ir>>8)&0xF);
415 { /* STS FPSCR, Rn */
416 uint32_t Rn = ((ir>>8)&0xF);
417 sh4_stats[I_STSFPSCR]++;
422 uint32_t Rn = ((ir>>8)&0xF);
432 switch( (ir&0xFF0) >> 4 ) {
440 sh4_stats[I_SLEEP]++;
454 { /* MOV.B @(R0, Rm), Rn */
455 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
460 { /* MOV.W @(R0, Rm), Rn */
461 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
466 { /* MOV.L @(R0, Rm), Rn */
467 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
472 { /* MAC.L @Rm+, @Rn+ */
473 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
483 { /* MOV.L Rm, @(disp, Rn) */
484 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
491 { /* MOV.B Rm, @Rn */
492 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
497 { /* MOV.W Rm, @Rn */
498 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
503 { /* MOV.L Rm, @Rn */
504 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
509 { /* MOV.B Rm, @-Rn */
510 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
515 { /* MOV.W Rm, @-Rn */
516 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
521 { /* MOV.L Rm, @-Rn */
522 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
528 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
529 sh4_stats[I_DIV0S]++;
534 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
540 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
546 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
552 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
557 { /* CMP/STR Rm, Rn */
558 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
559 sh4_stats[I_CMPSTR]++;
564 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
565 sh4_stats[I_XTRCT]++;
569 { /* MULU.W Rm, Rn */
570 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
571 sh4_stats[I_MULUW]++;
575 { /* MULS.W Rm, Rn */
576 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
577 sh4_stats[I_MULSW]++;
588 { /* CMP/EQ Rm, Rn */
589 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
590 sh4_stats[I_CMPEQ]++;
594 { /* CMP/HS Rm, Rn */
595 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
596 sh4_stats[I_CMPHS]++;
600 { /* CMP/GE Rm, Rn */
601 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
602 sh4_stats[I_CMPGE]++;
607 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
612 { /* DMULU.L Rm, Rn */
613 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
614 sh4_stats[I_DMULU]++;
618 { /* CMP/HI Rm, Rn */
619 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
620 sh4_stats[I_CMPHI]++;
624 { /* CMP/GT Rm, Rn */
625 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
626 sh4_stats[I_CMPGT]++;
631 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
637 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
643 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
649 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
654 { /* DMULS.L Rm, Rn */
655 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
656 sh4_stats[I_DMULS]++;
661 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
667 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
679 switch( (ir&0xF0) >> 4 ) {
682 uint32_t Rn = ((ir>>8)&0xF);
688 uint32_t Rn = ((ir>>8)&0xF);
694 uint32_t Rn = ((ir>>8)&0xF);
704 switch( (ir&0xF0) >> 4 ) {
707 uint32_t Rn = ((ir>>8)&0xF);
713 uint32_t Rn = ((ir>>8)&0xF);
714 sh4_stats[I_CMPPZ]++;
719 uint32_t Rn = ((ir>>8)&0xF);
729 switch( (ir&0xF0) >> 4 ) {
731 { /* STS.L MACH, @-Rn */
732 uint32_t Rn = ((ir>>8)&0xF);
737 { /* STS.L MACL, @-Rn */
738 uint32_t Rn = ((ir>>8)&0xF);
743 { /* STS.L PR, @-Rn */
744 uint32_t Rn = ((ir>>8)&0xF);
749 { /* STC.L SGR, @-Rn */
750 uint32_t Rn = ((ir>>8)&0xF);
755 { /* STS.L FPUL, @-Rn */
756 uint32_t Rn = ((ir>>8)&0xF);
761 { /* STS.L FPSCR, @-Rn */
762 uint32_t Rn = ((ir>>8)&0xF);
763 sh4_stats[I_STSFPSCRM]++;
767 { /* STC.L DBR, @-Rn */
768 uint32_t Rn = ((ir>>8)&0xF);
778 switch( (ir&0x80) >> 7 ) {
780 switch( (ir&0x70) >> 4 ) {
782 { /* STC.L SR, @-Rn */
783 uint32_t Rn = ((ir>>8)&0xF);
784 sh4_stats[I_STCSRM]++;
788 { /* STC.L GBR, @-Rn */
789 uint32_t Rn = ((ir>>8)&0xF);
794 { /* STC.L VBR, @-Rn */
795 uint32_t Rn = ((ir>>8)&0xF);
800 { /* STC.L SSR, @-Rn */
801 uint32_t Rn = ((ir>>8)&0xF);
806 { /* STC.L SPC, @-Rn */
807 uint32_t Rn = ((ir>>8)&0xF);
817 { /* STC.L Rm_BANK, @-Rn */
818 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
825 switch( (ir&0xF0) >> 4 ) {
828 uint32_t Rn = ((ir>>8)&0xF);
834 uint32_t Rn = ((ir>>8)&0xF);
835 sh4_stats[I_ROTCL]++;
844 switch( (ir&0xF0) >> 4 ) {
847 uint32_t Rn = ((ir>>8)&0xF);
853 uint32_t Rn = ((ir>>8)&0xF);
854 sh4_stats[I_CMPPL]++;
859 uint32_t Rn = ((ir>>8)&0xF);
860 sh4_stats[I_ROTCR]++;
869 switch( (ir&0xF0) >> 4 ) {
871 { /* LDS.L @Rm+, MACH */
872 uint32_t Rm = ((ir>>8)&0xF);
877 { /* LDS.L @Rm+, MACL */
878 uint32_t Rm = ((ir>>8)&0xF);
883 { /* LDS.L @Rm+, PR */
884 uint32_t Rm = ((ir>>8)&0xF);
889 { /* LDC.L @Rm+, SGR */
890 uint32_t Rm = ((ir>>8)&0xF);
895 { /* LDS.L @Rm+, FPUL */
896 uint32_t Rm = ((ir>>8)&0xF);
901 { /* LDS.L @Rm+, FPSCR */
902 uint32_t Rm = ((ir>>8)&0xF);
903 sh4_stats[I_LDSFPSCRM]++;
907 { /* LDC.L @Rm+, DBR */
908 uint32_t Rm = ((ir>>8)&0xF);
918 switch( (ir&0x80) >> 7 ) {
920 switch( (ir&0x70) >> 4 ) {
922 { /* LDC.L @Rm+, SR */
923 uint32_t Rm = ((ir>>8)&0xF);
924 sh4_stats[I_LDCSRM]++;
928 { /* LDC.L @Rm+, GBR */
929 uint32_t Rm = ((ir>>8)&0xF);
934 { /* LDC.L @Rm+, VBR */
935 uint32_t Rm = ((ir>>8)&0xF);
940 { /* LDC.L @Rm+, SSR */
941 uint32_t Rm = ((ir>>8)&0xF);
946 { /* LDC.L @Rm+, SPC */
947 uint32_t Rm = ((ir>>8)&0xF);
957 { /* LDC.L @Rm+, Rn_BANK */
958 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
965 switch( (ir&0xF0) >> 4 ) {
968 uint32_t Rn = ((ir>>8)&0xF);
974 uint32_t Rn = ((ir>>8)&0xF);
980 uint32_t Rn = ((ir>>8)&0xF);
990 switch( (ir&0xF0) >> 4 ) {
993 uint32_t Rn = ((ir>>8)&0xF);
999 uint32_t Rn = ((ir>>8)&0xF);
1000 sh4_stats[I_SHLR]++;
1005 uint32_t Rn = ((ir>>8)&0xF);
1006 sh4_stats[I_SHLR]++;
1015 switch( (ir&0xF0) >> 4 ) {
1017 { /* LDS Rm, MACH */
1018 uint32_t Rm = ((ir>>8)&0xF);
1023 { /* LDS Rm, MACL */
1024 uint32_t Rm = ((ir>>8)&0xF);
1030 uint32_t Rm = ((ir>>8)&0xF);
1036 uint32_t Rm = ((ir>>8)&0xF);
1041 { /* LDS Rm, FPUL */
1042 uint32_t Rm = ((ir>>8)&0xF);
1047 { /* LDS Rm, FPSCR */
1048 uint32_t Rm = ((ir>>8)&0xF);
1049 sh4_stats[I_LDSFPSCR]++;
1054 uint32_t Rm = ((ir>>8)&0xF);
1064 switch( (ir&0xF0) >> 4 ) {
1067 uint32_t Rn = ((ir>>8)&0xF);
1073 uint32_t Rn = ((ir>>8)&0xF);
1074 sh4_stats[I_TASB]++;
1079 uint32_t Rn = ((ir>>8)&0xF);
1090 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1091 sh4_stats[I_SHAD]++;
1096 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1097 sh4_stats[I_SHLD]++;
1101 switch( (ir&0x80) >> 7 ) {
1103 switch( (ir&0x70) >> 4 ) {
1106 uint32_t Rm = ((ir>>8)&0xF);
1107 sh4_stats[I_LDCSR]++;
1112 uint32_t Rm = ((ir>>8)&0xF);
1118 uint32_t Rm = ((ir>>8)&0xF);
1124 uint32_t Rm = ((ir>>8)&0xF);
1130 uint32_t Rm = ((ir>>8)&0xF);
1140 { /* LDC Rm, Rn_BANK */
1141 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
1148 { /* MAC.W @Rm+, @Rn+ */
1149 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1150 sh4_stats[I_MACW]++;
1156 { /* MOV.L @(disp, Rm), Rn */
1157 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
1158 sh4_stats[I_MOVL]++;
1164 { /* MOV.B @Rm, Rn */
1165 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1166 sh4_stats[I_MOVB]++;
1170 { /* MOV.W @Rm, Rn */
1171 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1172 sh4_stats[I_MOVW]++;
1176 { /* MOV.L @Rm, Rn */
1177 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1178 sh4_stats[I_MOVL]++;
1183 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1188 { /* MOV.B @Rm+, Rn */
1189 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1190 sh4_stats[I_MOVB]++;
1194 { /* MOV.W @Rm+, Rn */
1195 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1196 sh4_stats[I_MOVW]++;
1200 { /* MOV.L @Rm+, Rn */
1201 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1202 sh4_stats[I_MOVL]++;
1207 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1212 { /* SWAP.B Rm, Rn */
1213 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1214 sh4_stats[I_SWAPB]++;
1218 { /* SWAP.W Rm, Rn */
1219 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1220 sh4_stats[I_SWAPW]++;
1225 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1226 sh4_stats[I_NEGC]++;
1231 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1236 { /* EXTU.B Rm, Rn */
1237 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1238 sh4_stats[I_EXTUB]++;
1242 { /* EXTU.W Rm, Rn */
1243 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1244 sh4_stats[I_EXTUW]++;
1248 { /* EXTS.B Rm, Rn */
1249 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1250 sh4_stats[I_EXTSB]++;
1254 { /* EXTS.W Rm, Rn */
1255 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1256 sh4_stats[I_EXTSW]++;
1262 { /* ADD #imm, Rn */
1263 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1264 sh4_stats[I_ADDI]++;
1268 switch( (ir&0xF00) >> 8 ) {
1270 { /* MOV.B R0, @(disp, Rn) */
1271 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1272 sh4_stats[I_MOVB]++;
1276 { /* MOV.W R0, @(disp, Rn) */
1277 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1278 sh4_stats[I_MOVW]++;
1282 { /* MOV.B @(disp, Rm), R0 */
1283 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1284 sh4_stats[I_MOVB]++;
1288 { /* MOV.W @(disp, Rm), R0 */
1289 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1290 sh4_stats[I_MOVW]++;
1294 { /* CMP/EQ #imm, R0 */
1295 int32_t imm = SIGNEXT8(ir&0xFF);
1296 sh4_stats[I_CMPEQI]++;
1301 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1307 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1313 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1319 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1329 { /* MOV.W @(disp, PC), Rn */
1330 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1;
1331 sh4_stats[I_MOVW]++;
1336 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1342 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1347 switch( (ir&0xF00) >> 8 ) {
1349 { /* MOV.B R0, @(disp, GBR) */
1350 uint32_t disp = (ir&0xFF);
1351 sh4_stats[I_MOVB]++;
1355 { /* MOV.W R0, @(disp, GBR) */
1356 uint32_t disp = (ir&0xFF)<<1;
1357 sh4_stats[I_MOVW]++;
1361 { /* MOV.L R0, @(disp, GBR) */
1362 uint32_t disp = (ir&0xFF)<<2;
1363 sh4_stats[I_MOVL]++;
1368 uint32_t imm = (ir&0xFF);
1369 sh4_stats[I_TRAPA]++;
1373 { /* MOV.B @(disp, GBR), R0 */
1374 uint32_t disp = (ir&0xFF);
1375 sh4_stats[I_MOVB]++;
1379 { /* MOV.W @(disp, GBR), R0 */
1380 uint32_t disp = (ir&0xFF)<<1;
1381 sh4_stats[I_MOVW]++;
1385 { /* MOV.L @(disp, GBR), R0 */
1386 uint32_t disp = (ir&0xFF)<<2;
1387 sh4_stats[I_MOVL]++;
1391 { /* MOVA @(disp, PC), R0 */
1392 uint32_t disp = (ir&0xFF)<<2;
1393 sh4_stats[I_MOVA]++;
1397 { /* TST #imm, R0 */
1398 uint32_t imm = (ir&0xFF);
1399 sh4_stats[I_TSTI]++;
1403 { /* AND #imm, R0 */
1404 uint32_t imm = (ir&0xFF);
1405 sh4_stats[I_ANDI]++;
1409 { /* XOR #imm, R0 */
1410 uint32_t imm = (ir&0xFF);
1411 sh4_stats[I_XORI]++;
1416 uint32_t imm = (ir&0xFF);
1421 { /* TST.B #imm, @(R0, GBR) */
1422 uint32_t imm = (ir&0xFF);
1423 sh4_stats[I_TSTB]++;
1427 { /* AND.B #imm, @(R0, GBR) */
1428 uint32_t imm = (ir&0xFF);
1429 sh4_stats[I_ANDB]++;
1433 { /* XOR.B #imm, @(R0, GBR) */
1434 uint32_t imm = (ir&0xFF);
1435 sh4_stats[I_XORB]++;
1439 { /* OR.B #imm, @(R0, GBR) */
1440 uint32_t imm = (ir&0xFF);
1447 { /* MOV.L @(disp, PC), Rn */
1448 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2;
1449 sh4_stats[I_MOVLPC]++;
1453 { /* MOV #imm, Rn */
1454 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1455 sh4_stats[I_MOVI]++;
1461 { /* FADD FRm, FRn */
1462 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1463 sh4_stats[I_FADD]++;
1467 { /* FSUB FRm, FRn */
1468 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1469 sh4_stats[I_FSUB]++;
1473 { /* FMUL FRm, FRn */
1474 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1475 sh4_stats[I_FMUL]++;
1479 { /* FDIV FRm, FRn */
1480 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1481 sh4_stats[I_FDIV]++;
1485 { /* FCMP/EQ FRm, FRn */
1486 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1487 sh4_stats[I_FCMPEQ]++;
1491 { /* FCMP/GT FRm, FRn */
1492 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1493 sh4_stats[I_FCMPGT]++;
1497 { /* FMOV @(R0, Rm), FRn */
1498 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1499 sh4_stats[I_FMOV7]++;
1503 { /* FMOV FRm, @(R0, Rn) */
1504 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1505 sh4_stats[I_FMOV4]++;
1509 { /* FMOV @Rm, FRn */
1510 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1511 sh4_stats[I_FMOV5]++;
1515 { /* FMOV @Rm+, FRn */
1516 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1517 sh4_stats[I_FMOV6]++;
1521 { /* FMOV FRm, @Rn */
1522 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1523 sh4_stats[I_FMOV2]++;
1527 { /* FMOV FRm, @-Rn */
1528 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1529 sh4_stats[I_FMOV3]++;
1533 { /* FMOV FRm, FRn */
1534 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1535 sh4_stats[I_FMOV1]++;
1539 switch( (ir&0xF0) >> 4 ) {
1541 { /* FSTS FPUL, FRn */
1542 uint32_t FRn = ((ir>>8)&0xF);
1543 sh4_stats[I_FSTS]++;
1547 { /* FLDS FRm, FPUL */
1548 uint32_t FRm = ((ir>>8)&0xF);
1549 sh4_stats[I_FLDS]++;
1553 { /* FLOAT FPUL, FRn */
1554 uint32_t FRn = ((ir>>8)&0xF);
1555 sh4_stats[I_FLOAT]++;
1559 { /* FTRC FRm, FPUL */
1560 uint32_t FRm = ((ir>>8)&0xF);
1561 sh4_stats[I_FTRC]++;
1566 uint32_t FRn = ((ir>>8)&0xF);
1567 sh4_stats[I_FNEG]++;
1572 uint32_t FRn = ((ir>>8)&0xF);
1573 sh4_stats[I_FABS]++;
1578 uint32_t FRn = ((ir>>8)&0xF);
1579 sh4_stats[I_FSQRT]++;
1584 uint32_t FRn = ((ir>>8)&0xF);
1585 sh4_stats[I_FSRRA]++;
1590 uint32_t FRn = ((ir>>8)&0xF);
1591 sh4_stats[I_FLDI0]++;
1596 uint32_t FRn = ((ir>>8)&0xF);
1597 sh4_stats[I_FLDI1]++;
1601 { /* FCNVSD FPUL, FRn */
1602 uint32_t FRn = ((ir>>8)&0xF);
1603 sh4_stats[I_FCNVSD]++;
1607 { /* FCNVDS FRm, FPUL */
1608 uint32_t FRm = ((ir>>8)&0xF);
1609 sh4_stats[I_FCNVDS]++;
1613 { /* FIPR FVm, FVn */
1614 uint32_t FVn = ((ir>>10)&0x3); uint32_t FVm = ((ir>>8)&0x3);
1615 sh4_stats[I_FIPR]++;
1619 switch( (ir&0x100) >> 8 ) {
1621 { /* FSCA FPUL, FRn */
1622 uint32_t FRn = ((ir>>9)&0x7)<<1;
1623 sh4_stats[I_FSCA]++;
1627 switch( (ir&0x200) >> 9 ) {
1629 { /* FTRV XMTRX, FVn */
1630 uint32_t FVn = ((ir>>10)&0x3);
1631 sh4_stats[I_FTRV]++;
1635 switch( (ir&0xC00) >> 10 ) {
1638 sh4_stats[I_FSCHG]++;
1643 sh4_stats[I_FRCHG]++;
1648 sh4_stats[I_UNDEF]++;
1666 { /* FMAC FR0, FRm, FRn */
1667 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1668 sh4_stats[I_FMAC]++;
.