nkeynes@387: /** nkeynes@561: * $Id$ nkeynes@387: * nkeynes@387: * Support module for collecting instruction stats nkeynes@387: * nkeynes@387: * Copyright (c) 2005 Nathan Keynes. nkeynes@387: * nkeynes@387: * This program is free software; you can redistribute it and/or modify nkeynes@387: * it under the terms of the GNU General Public License as published by nkeynes@387: * the Free Software Foundation; either version 2 of the License, or nkeynes@387: * (at your option) any later version. nkeynes@387: * nkeynes@387: * This program is distributed in the hope that it will be useful, nkeynes@387: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@387: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@387: * GNU General Public License for more details. nkeynes@387: */ nkeynes@387: nkeynes@387: #include "dream.h" nkeynes@387: #include "sh4stat.h" nkeynes@387: #include "sh4core.h" nkeynes@387: nkeynes@387: static uint64_t sh4_stats[SH4_INSTRUCTION_COUNT+1]; nkeynes@387: static uint64_t sh4_stats_total; nkeynes@387: static const char *sh4_stats_names[] = { nkeynes@387: "???", nkeynes@387: "ADD Rm, Rn", nkeynes@387: "ADD #imm, Rn", nkeynes@387: "ADDC Rm, Rn", nkeynes@387: "ADDV Rm, Rn", nkeynes@387: "AND Rm, Rn", nkeynes@387: "AND #imm, R0", nkeynes@387: "AND.B #imm, @(R0, GBR)", nkeynes@387: "BF disp", nkeynes@387: "BF/S disp", nkeynes@387: "BRA disp", nkeynes@387: "BRAF Rn", nkeynes@387: "BSR disp", nkeynes@387: "BSRF Rn", nkeynes@387: "BT disp", nkeynes@387: "BT/S disp", nkeynes@387: "CLRMAC", nkeynes@387: "CLRS", nkeynes@387: "CLRT", nkeynes@387: "CMP/EQ Rm, Rn", nkeynes@387: "CMP/EQ #imm, R0", nkeynes@387: "CMP/GE Rm, Rn", nkeynes@387: "CMP/GT Rm, Rn", nkeynes@387: "CMP/HI Rm, Rn", nkeynes@387: "CMP/HS Rm, Rn", nkeynes@387: "CMP/PL Rn", nkeynes@387: "CMP/PZ Rn", nkeynes@387: "CMP/STR Rm, Rn", nkeynes@387: "DIV0S Rm, Rn", nkeynes@387: "DIV0U", nkeynes@387: "DIV1 Rm, Rn", nkeynes@387: "DMULS.L Rm, Rn", nkeynes@387: "DMULU.L Rm, Rn", nkeynes@387: "DT Rn", nkeynes@387: "EXTS.B Rm, Rn", nkeynes@387: "EXTS.W Rm, Rn", nkeynes@387: "EXTU.B Rm, Rn", nkeynes@387: "EXTU.W Rm, Rn", nkeynes@387: "FABS FRn", nkeynes@387: "FADD FRm, FRn", nkeynes@387: "FCMP/EQ FRm, FRn", nkeynes@387: "FCMP/GT FRm, FRn", nkeynes@387: "FCNVDS FRm, FPUL", nkeynes@387: "FCNVSD FPUL, FRn", nkeynes@387: "FDIV FRm, FRn", nkeynes@387: "FIPR FVm, FVn", nkeynes@387: "FLDS FRm, FPUL", nkeynes@387: "FLDI0 FRn", nkeynes@387: "FLDI1 FRn", nkeynes@387: "FLOAT FPUL, FRn", nkeynes@387: "FMAC FR0, FRm, FRn", nkeynes@387: "FMOV FRm, FRn", nkeynes@387: "FMOV FRm, @Rn", nkeynes@387: "FMOV FRm, @-Rn", nkeynes@387: "FMOV FRm, @(R0, Rn)", nkeynes@387: "FMOV @Rm, FRn", nkeynes@387: "FMOV @Rm+, FRn", nkeynes@387: "FMOV @(R0, Rm), FRn", nkeynes@387: "FMUL FRm, FRn", nkeynes@387: "FNEG FRn", nkeynes@387: "FRCHG", nkeynes@387: "FSCA FPUL, FRn", nkeynes@387: "FSCHG", nkeynes@387: "FSQRT FRn", nkeynes@387: "FSRRA FRn", nkeynes@387: "FSTS FPUL, FRn", nkeynes@387: "FSUB FRm, FRn", nkeynes@387: "FTRC FRm, FPUL", nkeynes@387: "FTRV XMTRX, FVn", nkeynes@387: "JMP @Rn", nkeynes@387: "JSR @Rn", nkeynes@387: "LDC Rm, SR", nkeynes@387: "LDC Rm, *", nkeynes@387: "LDC.L @Rm+, SR", nkeynes@387: "LDC.L @Rm+, *", nkeynes@387: "LDS Rm, *", nkeynes@387: "LDS.L @Rm+, *", nkeynes@387: "LDTLB", nkeynes@387: "MAC.L @Rm+, @Rn+", nkeynes@387: "MAC.W @Rm+, @Rn+", nkeynes@387: "MOV Rm, Rn", nkeynes@387: "MOV #imm, Rn", nkeynes@387: "MOV.B ...", nkeynes@387: "MOV.L ...", nkeynes@387: "MOV.L @(disp, PC)", nkeynes@387: "MOV.W ...", nkeynes@387: "MOVA @(disp, PC), R0", nkeynes@387: "MOVCA.L R0, @Rn", nkeynes@387: "MOVT Rn", nkeynes@387: "MUL.L Rm, Rn", nkeynes@387: "MULS.W Rm, Rn", nkeynes@387: "MULU.W Rm, Rn", nkeynes@387: "NEG Rm, Rn", nkeynes@387: "NEGC Rm, Rn", nkeynes@387: "NOP", nkeynes@387: "NOT Rm, Rn", nkeynes@387: "OCBI @Rn", nkeynes@387: "OCBP @Rn", nkeynes@387: "OCBWB @Rn", nkeynes@387: "OR Rm, Rn", nkeynes@387: "OR #imm, R0", nkeynes@387: "OR.B #imm, @(R0, GBR)", nkeynes@387: "PREF @Rn", nkeynes@387: "ROTCL Rn", nkeynes@387: "ROTCR Rn", nkeynes@387: "ROTL Rn", nkeynes@387: "ROTR Rn", nkeynes@387: "RTE", nkeynes@387: "RTS", nkeynes@387: "SETS", nkeynes@387: "SETT", nkeynes@387: "SHAD Rm, Rn", nkeynes@387: "SHAL Rn", nkeynes@387: "SHAR Rn", nkeynes@387: "SHLD Rm, Rn", nkeynes@387: "SHLL* Rn", nkeynes@387: "SHLR* Rn", nkeynes@387: "SLEEP", nkeynes@387: "STC SR, Rn", nkeynes@387: "STC *, Rn", nkeynes@387: "STC.L SR, @-Rn", nkeynes@387: "STC.L *, @-Rn", nkeynes@387: "STS *, Rn", nkeynes@387: "STS.L *, @-Rn", nkeynes@387: "SUB Rm, Rn", nkeynes@387: "SUBC Rm, Rn", nkeynes@387: "SUBV Rm, Rn", nkeynes@387: "SWAP.B Rm, Rn", nkeynes@387: "SWAP.W Rm, Rn", nkeynes@387: "TAS.B @Rn", nkeynes@387: "TRAPA #imm", nkeynes@387: "TST Rm, Rn", nkeynes@387: "TST #imm, R0", nkeynes@387: "TST.B #imm, @(R0, GBR)", nkeynes@387: "XOR Rm, Rn", nkeynes@387: "XOR #imm, R0", nkeynes@387: "XOR.B #imm, @(R0, GBR)", nkeynes@387: "XTRCT Rm, Rn", nkeynes@387: "UNDEF" nkeynes@387: }; nkeynes@387: nkeynes@387: void sh4_stats_reset( void ) nkeynes@387: { nkeynes@387: int i; nkeynes@387: for( i=0; i<= I_UNDEF; i++ ) { nkeynes@387: sh4_stats[i] = 0; nkeynes@387: } nkeynes@387: sh4_stats_total = 0; nkeynes@387: } nkeynes@387: nkeynes@387: void sh4_stats_print( FILE *out ) nkeynes@387: { nkeynes@387: int i; nkeynes@387: for( i=0; i<= I_UNDEF; i++ ) { nkeynes@500: 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 ); nkeynes@387: } nkeynes@500: fprintf( out, "Total: %lld\n", sh4_stats_total ); nkeynes@387: } nkeynes@387: nkeynes@387: void sh4_stats_add( uint32_t pc ) nkeynes@387: { nkeynes@387: uint16_t ir = sh4_read_word(pc); nkeynes@387: #define UNDEF() sh4_stats[0]++ nkeynes@387: %% nkeynes@387: ADD Rm, Rn {: sh4_stats[I_ADD]++; :} nkeynes@387: ADD #imm, Rn {: sh4_stats[I_ADDI]++; :} nkeynes@387: ADDC Rm, Rn {: sh4_stats[I_ADDC]++; :} nkeynes@387: ADDV Rm, Rn {: sh4_stats[I_ADDV]++; :} nkeynes@387: AND Rm, Rn {: sh4_stats[I_AND]++; :} nkeynes@387: AND #imm, R0 {: sh4_stats[I_ANDI]++; :} nkeynes@387: AND.B #imm, @(R0, GBR) {: sh4_stats[I_ANDB]++; :} nkeynes@387: BF disp {: sh4_stats[I_BF]++; :} nkeynes@387: BF/S disp {: sh4_stats[I_BFS]++; :} nkeynes@387: BRA disp {: sh4_stats[I_BRA]++; :} nkeynes@387: BRAF Rn {: sh4_stats[I_BRAF]++; :} nkeynes@387: BSR disp {: sh4_stats[I_BSR]++; :} nkeynes@387: BSRF Rn {: sh4_stats[I_BSRF]++; :} nkeynes@387: BT disp {: sh4_stats[I_BT]++; :} nkeynes@387: BT/S disp {: sh4_stats[I_BTS]++; :} nkeynes@387: CLRMAC {: sh4_stats[I_CLRMAC]++; :} nkeynes@387: CLRS {: sh4_stats[I_CLRS]++; :} nkeynes@387: CLRT {: sh4_stats[I_CLRT]++; :} nkeynes@387: CMP/EQ Rm, Rn {: sh4_stats[I_CMPEQ]++; :} nkeynes@387: CMP/EQ #imm, R0 {: sh4_stats[I_CMPEQI]++; :} nkeynes@387: CMP/GE Rm, Rn {: sh4_stats[I_CMPGE]++; :} nkeynes@387: CMP/GT Rm, Rn {: sh4_stats[I_CMPGT]++; :} nkeynes@387: CMP/HI Rm, Rn {: sh4_stats[I_CMPHI]++; :} nkeynes@387: CMP/HS Rm, Rn {: sh4_stats[I_CMPHS]++; :} nkeynes@387: CMP/PL Rn {: sh4_stats[I_CMPPL]++; :} nkeynes@387: CMP/PZ Rn {: sh4_stats[I_CMPPZ]++; :} nkeynes@387: CMP/STR Rm, Rn {: sh4_stats[I_CMPSTR]++; :} nkeynes@387: DIV0S Rm, Rn {: sh4_stats[I_DIV0S]++; :} nkeynes@387: DIV0U {: sh4_stats[I_DIV0U]++; :} nkeynes@387: DIV1 Rm, Rn {: sh4_stats[I_DIV1]++; :} nkeynes@387: DMULS.L Rm, Rn {: sh4_stats[I_DMULS]++; :} nkeynes@387: DMULU.L Rm, Rn {: sh4_stats[I_DMULU]++; :} nkeynes@387: DT Rn {: sh4_stats[I_DT]++; :} nkeynes@387: EXTS.B Rm, Rn {: sh4_stats[I_EXTSB]++; :} nkeynes@387: EXTS.W Rm, Rn {: sh4_stats[I_EXTSW]++; :} nkeynes@387: EXTU.B Rm, Rn {: sh4_stats[I_EXTUB]++; :} nkeynes@387: EXTU.W Rm, Rn {: sh4_stats[I_EXTUW]++; :} nkeynes@387: FABS FRn {: sh4_stats[I_FABS]++; :} nkeynes@387: FADD FRm, FRn {: sh4_stats[I_FADD]++; :} nkeynes@387: FCMP/EQ FRm, FRn {: sh4_stats[I_FCMPEQ]++; :} nkeynes@387: FCMP/GT FRm, FRn {: sh4_stats[I_FCMPGT]++; :} nkeynes@387: FCNVDS FRm, FPUL {: sh4_stats[I_FCNVDS]++; :} nkeynes@387: FCNVSD FPUL, FRn {: sh4_stats[I_FCNVSD]++; :} nkeynes@387: FDIV FRm, FRn {: sh4_stats[I_FDIV]++; :} nkeynes@387: FIPR FVm, FVn {: sh4_stats[I_FIPR]++; :} nkeynes@387: FLDS FRm, FPUL {: sh4_stats[I_FLDS]++; :} nkeynes@387: FLDI0 FRn {: sh4_stats[I_FLDI0]++; :} nkeynes@387: FLDI1 FRn {: sh4_stats[I_FLDI1]++; :} nkeynes@387: FLOAT FPUL, FRn {: sh4_stats[I_FLOAT]++; :} nkeynes@387: FMAC FR0, FRm, FRn {: sh4_stats[I_FMAC]++; :} nkeynes@387: FMOV FRm, FRn {: sh4_stats[I_FMOV1]++; :} nkeynes@387: FMOV FRm, @Rn {: sh4_stats[I_FMOV2]++; :} nkeynes@387: FMOV FRm, @-Rn {: sh4_stats[I_FMOV3]++; :} nkeynes@387: FMOV FRm, @(R0, Rn) {: sh4_stats[I_FMOV4]++; :} nkeynes@387: FMOV @Rm, FRn {: sh4_stats[I_FMOV5]++; :} nkeynes@387: FMOV @Rm+, FRn {: sh4_stats[I_FMOV6]++; :} nkeynes@387: FMOV @(R0, Rm), FRn {: sh4_stats[I_FMOV7]++; :} nkeynes@387: FMUL FRm, FRn {: sh4_stats[I_FMUL]++; :} nkeynes@387: FNEG FRn {: sh4_stats[I_FNEG]++; :} nkeynes@387: FRCHG {: sh4_stats[I_FRCHG]++; :} nkeynes@387: FSCA FPUL, FRn {: sh4_stats[I_FSCA]++; :} nkeynes@387: FSCHG {: sh4_stats[I_FSCHG]++; :} nkeynes@387: FSQRT FRn {: sh4_stats[I_FSQRT]++; :} nkeynes@387: FSRRA FRn {: sh4_stats[I_FSRRA]++; :} nkeynes@387: FSTS FPUL, FRn {: sh4_stats[I_FSTS]++; :} nkeynes@387: FSUB FRm, FRn {: sh4_stats[I_FSUB]++; :} nkeynes@387: FTRC FRm, FPUL {: sh4_stats[I_FTRC]++; :} nkeynes@387: FTRV XMTRX, FVn {: sh4_stats[I_FTRV]++; :} nkeynes@387: JMP @Rn {: sh4_stats[I_JMP]++; :} nkeynes@387: JSR @Rn {: sh4_stats[I_JSR]++; :} nkeynes@387: LDC Rm, GBR {: sh4_stats[I_LDC]++; :} nkeynes@387: LDC Rm, SR {: sh4_stats[I_LDCSR]++; :} nkeynes@387: LDC Rm, VBR {: sh4_stats[I_LDC]++; :} nkeynes@387: LDC Rm, SSR {: sh4_stats[I_LDC]++; :} nkeynes@387: LDC Rm, SGR {: sh4_stats[I_LDC]++; :} nkeynes@387: LDC Rm, SPC {: sh4_stats[I_LDC]++; :} nkeynes@387: LDC Rm, DBR {: sh4_stats[I_LDC]++; :} nkeynes@387: LDC Rm, Rn_BANK {: sh4_stats[I_LDC]++; :} nkeynes@387: LDC.L @Rm+, GBR {: sh4_stats[I_LDCM]++; :} nkeynes@387: LDC.L @Rm+, SR {: sh4_stats[I_LDCSRM]++; :} nkeynes@387: LDC.L @Rm+, VBR {: sh4_stats[I_LDCM]++; :} nkeynes@387: LDC.L @Rm+, SSR {: sh4_stats[I_LDCM]++; :} nkeynes@387: LDC.L @Rm+, SGR {: sh4_stats[I_LDCM]++; :} nkeynes@387: LDC.L @Rm+, SPC {: sh4_stats[I_LDCM]++; :} nkeynes@387: LDC.L @Rm+, DBR {: sh4_stats[I_LDCM]++; :} nkeynes@387: LDC.L @Rm+, Rn_BANK {: sh4_stats[I_LDCM]++; :} nkeynes@387: LDS Rm, FPSCR {: sh4_stats[I_LDS]++; :} nkeynes@387: LDS.L @Rm+, FPSCR {: sh4_stats[I_LDSM]++; :} nkeynes@387: LDS Rm, FPUL {: sh4_stats[I_LDS]++; :} nkeynes@387: LDS.L @Rm+, FPUL {: sh4_stats[I_LDSM]++; :} nkeynes@387: LDS Rm, MACH {: sh4_stats[I_LDS]++; :} nkeynes@387: LDS.L @Rm+, MACH {: sh4_stats[I_LDSM]++; :} nkeynes@387: LDS Rm, MACL {: sh4_stats[I_LDS]++; :} nkeynes@387: LDS.L @Rm+, MACL {: sh4_stats[I_LDSM]++; :} nkeynes@387: LDS Rm, PR {: sh4_stats[I_LDS]++; :} nkeynes@387: LDS.L @Rm+, PR {: sh4_stats[I_LDSM]++; :} nkeynes@387: LDTLB {: sh4_stats[I_LDTLB]++; :} nkeynes@387: MAC.L @Rm+, @Rn+ {: sh4_stats[I_MACL]++; :} nkeynes@387: MAC.W @Rm+, @Rn+ {: sh4_stats[I_MACW]++; :} nkeynes@387: MOV Rm, Rn {: sh4_stats[I_MOV]++; :} nkeynes@387: MOV #imm, Rn {: sh4_stats[I_MOVI]++; :} nkeynes@387: MOV.B Rm, @Rn {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B Rm, @-Rn {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B Rm, @(R0, Rn) {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B R0, @(disp, GBR) {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B R0, @(disp, Rn) {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B @Rm, Rn {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B @Rm+, Rn {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B @(R0, Rm), Rn {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B @(disp, GBR), R0 {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.B @(disp, Rm), R0 {: sh4_stats[I_MOVB]++; :} nkeynes@387: MOV.L Rm, @Rn {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L Rm, @-Rn {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L Rm, @(R0, Rn) {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L R0, @(disp, GBR) {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L Rm, @(disp, Rn) {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L @Rm, Rn {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L @Rm+, Rn {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L @(R0, Rm), Rn {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L @(disp, GBR), R0 {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.L @(disp, PC), Rn {: sh4_stats[I_MOVLPC]++; :} nkeynes@387: MOV.L @(disp, Rm), Rn {: sh4_stats[I_MOVL]++; :} nkeynes@387: MOV.W Rm, @Rn {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W Rm, @-Rn {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W Rm, @(R0, Rn) {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W R0, @(disp, GBR) {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W R0, @(disp, Rn) {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W @Rm, Rn {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W @Rm+, Rn {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W @(R0, Rm), Rn {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W @(disp, GBR), R0 {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W @(disp, PC), Rn {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOV.W @(disp, Rm), R0 {: sh4_stats[I_MOVW]++; :} nkeynes@387: MOVA @(disp, PC), R0 {: sh4_stats[I_MOVA]++; :} nkeynes@387: MOVCA.L R0, @Rn {: sh4_stats[I_MOVCA]++; :} nkeynes@387: MOVT Rn {: sh4_stats[I_MOVT]++; :} nkeynes@387: MUL.L Rm, Rn {: sh4_stats[I_MULL]++; :} nkeynes@387: MULS.W Rm, Rn {: sh4_stats[I_MULSW]++; :} nkeynes@387: MULU.W Rm, Rn {: sh4_stats[I_MULUW]++; :} nkeynes@387: NEG Rm, Rn {: sh4_stats[I_NEG]++; :} nkeynes@387: NEGC Rm, Rn {: sh4_stats[I_NEGC]++; :} nkeynes@387: NOP {: sh4_stats[I_NOP]++; :} nkeynes@387: NOT Rm, Rn {: sh4_stats[I_NOT]++; :} nkeynes@387: OCBI @Rn {: sh4_stats[I_OCBI]++; :} nkeynes@387: OCBP @Rn {: sh4_stats[I_OCBP]++; :} nkeynes@387: OCBWB @Rn {: sh4_stats[I_OCBWB]++; :} nkeynes@387: OR Rm, Rn {: sh4_stats[I_OR]++; :} nkeynes@387: OR #imm, R0 {: sh4_stats[I_ORI]++; :} nkeynes@387: OR.B #imm, @(R0, GBR) {: sh4_stats[I_ORB]++; :} nkeynes@387: PREF @Rn {: sh4_stats[I_PREF]++; :} nkeynes@387: ROTCL Rn {: sh4_stats[I_ROTCL]++; :} nkeynes@387: ROTCR Rn {: sh4_stats[I_ROTCR]++; :} nkeynes@387: ROTL Rn {: sh4_stats[I_ROTL]++; :} nkeynes@387: ROTR Rn {: sh4_stats[I_ROTR]++; :} nkeynes@387: RTE {: sh4_stats[I_RTE]++; :} nkeynes@387: RTS {: sh4_stats[I_RTS]++; :} nkeynes@387: SETS {: sh4_stats[I_SETS]++; :} nkeynes@387: SETT {: sh4_stats[I_SETT]++; :} nkeynes@387: SHAD Rm, Rn {: sh4_stats[I_SHAD]++; :} nkeynes@387: SHAL Rn {: sh4_stats[I_SHAL]++; :} nkeynes@387: SHAR Rn {: sh4_stats[I_SHAR]++; :} nkeynes@387: SHLD Rm, Rn {: sh4_stats[I_SHLD]++; :} nkeynes@387: SHLL Rn {: sh4_stats[I_SHLL]++; :} nkeynes@387: SHLL2 Rn {: sh4_stats[I_SHLL]++; :} nkeynes@387: SHLL8 Rn {: sh4_stats[I_SHLL]++; :} nkeynes@387: SHLL16 Rn {: sh4_stats[I_SHLL]++; :} nkeynes@387: SHLR Rn {: sh4_stats[I_SHLR]++; :} nkeynes@387: SHLR2 Rn {: sh4_stats[I_SHLR]++; :} nkeynes@387: SHLR8 Rn {: sh4_stats[I_SHLR]++; :} nkeynes@387: SHLR16 Rn {: sh4_stats[I_SHLR]++; :} nkeynes@387: SLEEP {: sh4_stats[I_SLEEP]++; :} nkeynes@387: STC SR, Rn {: sh4_stats[I_STCSR]++; :} nkeynes@387: STC GBR, Rn {: sh4_stats[I_STC]++; :} nkeynes@387: STC VBR, Rn {: sh4_stats[I_STC]++; :} nkeynes@387: STC SSR, Rn {: sh4_stats[I_STC]++; :} nkeynes@387: STC SPC, Rn {: sh4_stats[I_STC]++; :} nkeynes@387: STC SGR, Rn {: sh4_stats[I_STC]++; :} nkeynes@387: STC DBR, Rn {: sh4_stats[I_STC]++; :} nkeynes@387: STC Rm_BANK, Rn {: sh4_stats[I_STC]++; :} nkeynes@387: STC.L SR, @-Rn {: sh4_stats[I_STCSRM]++; :} nkeynes@387: STC.L VBR, @-Rn {: sh4_stats[I_STCM]++; :} nkeynes@387: STC.L SSR, @-Rn {: sh4_stats[I_STCM]++; :} nkeynes@387: STC.L SPC, @-Rn {: sh4_stats[I_STCM]++; :} nkeynes@387: STC.L SGR, @-Rn {: sh4_stats[I_STCM]++; :} nkeynes@387: STC.L DBR, @-Rn {: sh4_stats[I_STCM]++; :} nkeynes@387: STC.L Rm_BANK, @-Rn {: sh4_stats[I_STCM]++; :} nkeynes@387: STC.L GBR, @-Rn {: sh4_stats[I_STCM]++; :} nkeynes@387: STS FPSCR, Rn {: sh4_stats[I_STS]++; :} nkeynes@387: STS.L FPSCR, @-Rn {: sh4_stats[I_STSM]++; :} nkeynes@387: STS FPUL, Rn {: sh4_stats[I_STS]++; :} nkeynes@387: STS.L FPUL, @-Rn {: sh4_stats[I_STSM]++; :} nkeynes@387: STS MACH, Rn {: sh4_stats[I_STS]++; :} nkeynes@387: STS.L MACH, @-Rn {: sh4_stats[I_STSM]++; :} nkeynes@387: STS MACL, Rn {: sh4_stats[I_STS]++; :} nkeynes@387: STS.L MACL, @-Rn {: sh4_stats[I_STSM]++; :} nkeynes@387: STS PR, Rn {: sh4_stats[I_STS]++; :} nkeynes@387: STS.L PR, @-Rn {: sh4_stats[I_STSM]++; :} nkeynes@387: SUB Rm, Rn {: sh4_stats[I_SUB]++; :} nkeynes@387: SUBC Rm, Rn {: sh4_stats[I_SUBC]++; :} nkeynes@387: SUBV Rm, Rn {: sh4_stats[I_SUBV]++; :} nkeynes@387: SWAP.B Rm, Rn {: sh4_stats[I_SWAPB]++; :} nkeynes@387: SWAP.W Rm, Rn {: sh4_stats[I_SWAPW]++; :} nkeynes@387: TAS.B @Rn {: sh4_stats[I_TASB]++; :} nkeynes@387: TRAPA #imm {: sh4_stats[I_TRAPA]++; :} nkeynes@387: TST Rm, Rn {: sh4_stats[I_TST]++; :} nkeynes@387: TST #imm, R0 {: sh4_stats[I_TSTI]++; :} nkeynes@387: TST.B #imm, @(R0, GBR) {: sh4_stats[I_TSTB]++; :} nkeynes@387: XOR Rm, Rn {: sh4_stats[I_XOR]++; :} nkeynes@387: XOR #imm, R0 {: sh4_stats[I_XORI]++; :} nkeynes@387: XOR.B #imm, @(R0, GBR) {: sh4_stats[I_XORB]++; :} nkeynes@387: XTRCT Rm, Rn {: sh4_stats[I_XTRCT]++; :} nkeynes@387: UNDEF {: sh4_stats[I_UNDEF]++; :} nkeynes@387: %% nkeynes@387: nkeynes@387: sh4_stats_total++; nkeynes@387: }