nkeynes@387: /** nkeynes@500: * $Id: sh4stat.c,v 1.2 2007-11-08 11:37:49 nkeynes Exp $ 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: switch( (ir&0xF000) >> 12 ) { nkeynes@387: case 0x0: nkeynes@387: switch( ir&0xF ) { nkeynes@387: case 0x2: nkeynes@387: switch( (ir&0x80) >> 7 ) { nkeynes@387: case 0x0: nkeynes@387: switch( (ir&0x70) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* STC SR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCSR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* STC GBR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* STC VBR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* STC SSR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* STC SPC, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* STC Rm_BANK, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7); nkeynes@387: sh4_stats[I_STC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* BSRF Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_BSRF]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* BRAF Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_BRAF]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* PREF @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_PREF]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* OCBI @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_OCBI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* OCBP @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_OCBP]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* OCBWB @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_OCBWB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* MOVCA.L R0, @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_MOVCA]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* MOV.B Rm, @(R0, Rn) */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* MOV.W Rm, @(R0, Rn) */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* MOV.L Rm, @(R0, Rn) */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* MUL.L Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MULL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: switch( (ir&0xFF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* CLRT */ nkeynes@387: sh4_stats[I_CLRT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* SETT */ nkeynes@387: sh4_stats[I_SETT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* CLRMAC */ nkeynes@387: sh4_stats[I_CLRMAC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* LDTLB */ nkeynes@387: sh4_stats[I_LDTLB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* CLRS */ nkeynes@387: sh4_stats[I_CLRS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* SETS */ nkeynes@387: sh4_stats[I_SETS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* NOP */ nkeynes@387: sh4_stats[I_NOP]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* DIV0U */ nkeynes@387: sh4_stats[I_DIV0U]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* MOVT Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_MOVT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* STS MACH, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* STS MACL, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* STS PR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* STC SGR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* STS FPUL, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* STS FPSCR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* STC DBR, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: switch( (ir&0xFF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* RTS */ nkeynes@387: sh4_stats[I_RTS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* SLEEP */ nkeynes@387: sh4_stats[I_SLEEP]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* RTE */ nkeynes@387: sh4_stats[I_RTE]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* MOV.B @(R0, Rm), Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* MOV.W @(R0, Rm), Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* MOV.L @(R0, Rm), Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* MAC.L @Rm+, @Rn+ */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MACL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* MOV.L Rm, @(disp, Rn) */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2; nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: switch( ir&0xF ) { nkeynes@387: case 0x0: nkeynes@387: { /* MOV.B Rm, @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* MOV.W Rm, @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* MOV.L Rm, @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* MOV.B Rm, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* MOV.W Rm, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* MOV.L Rm, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* DIV0S Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_DIV0S]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* TST Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_TST]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* AND Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_AND]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* XOR Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_XOR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* OR Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_OR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* CMP/STR Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_CMPSTR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* XTRCT Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_XTRCT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* MULU.W Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MULUW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* MULS.W Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MULSW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: switch( ir&0xF ) { nkeynes@387: case 0x0: nkeynes@387: { /* CMP/EQ Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_CMPEQ]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* CMP/HS Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_CMPHS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* CMP/GE Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_CMPGE]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* DIV1 Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_DIV1]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* DMULU.L Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_DMULU]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* CMP/HI Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_CMPHI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* CMP/GT Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_CMPGT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* SUB Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_SUB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* SUBC Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_SUBC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* SUBV Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_SUBV]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* ADD Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_ADD]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* DMULS.L Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_DMULS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* ADDC Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_ADDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* ADDV Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_ADDV]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: switch( ir&0xF ) { nkeynes@387: case 0x0: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* SHLL Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* DT Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_DT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* SHAL Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHAL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* SHLR Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* CMP/PZ Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_CMPPZ]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* SHAR Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHAR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* STS.L MACH, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* STS.L MACL, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* STS.L PR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* STC.L SGR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* STS.L FPUL, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* STS.L FPSCR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* STC.L DBR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: switch( (ir&0x80) >> 7 ) { nkeynes@387: case 0x0: nkeynes@387: switch( (ir&0x70) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* STC.L SR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCSRM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* STC.L GBR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* STC.L VBR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* STC.L SSR, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* STC.L SPC, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_STCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* STC.L Rm_BANK, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7); nkeynes@387: sh4_stats[I_STCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* ROTL Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_ROTL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* ROTCL Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_ROTCL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* ROTR Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_ROTR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* CMP/PL Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_CMPPL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* ROTCR Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_ROTCR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* LDS.L @Rm+, MACH */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* LDS.L @Rm+, MACL */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* LDS.L @Rm+, PR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* LDC.L @Rm+, SGR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* LDS.L @Rm+, FPUL */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* LDS.L @Rm+, FPSCR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDSM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* LDC.L @Rm+, DBR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: switch( (ir&0x80) >> 7 ) { nkeynes@387: case 0x0: nkeynes@387: switch( (ir&0x70) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* LDC.L @Rm+, SR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCSRM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* LDC.L @Rm+, GBR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* LDC.L @Rm+, VBR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* LDC.L @Rm+, SSR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* LDC.L @Rm+, SPC */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* LDC.L @Rm+, Rn_BANK */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7); nkeynes@387: sh4_stats[I_LDCM]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* SHLL2 Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* SHLL8 Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* SHLL16 Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* SHLR2 Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* SHLR8 Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* SHLR16 Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_SHLR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* LDS Rm, MACH */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* LDS Rm, MACL */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* LDS Rm, PR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* LDC Rm, SGR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* LDS Rm, FPUL */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* LDS Rm, FPSCR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* LDC Rm, DBR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* JSR @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_JSR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* TAS.B @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_TASB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* JMP @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_JMP]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* SHAD Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_SHAD]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* SHLD Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_SHLD]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: switch( (ir&0x80) >> 7 ) { nkeynes@387: case 0x0: nkeynes@387: switch( (ir&0x70) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* LDC Rm, SR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDCSR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* LDC Rm, GBR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* LDC Rm, VBR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* LDC Rm, SSR */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* LDC Rm, SPC */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_LDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* LDC Rm, Rn_BANK */ nkeynes@387: uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7); nkeynes@387: sh4_stats[I_LDC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* MAC.W @Rm+, @Rn+ */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MACW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* MOV.L @(disp, Rm), Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2; nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: switch( ir&0xF ) { nkeynes@387: case 0x0: nkeynes@387: { /* MOV.B @Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* MOV.W @Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* MOV.L @Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* MOV Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOV]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* MOV.B @Rm+, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* MOV.W @Rm+, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* MOV.L @Rm+, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* NOT Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_NOT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* SWAP.B Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_SWAPB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* SWAP.W Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_SWAPW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* NEGC Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_NEGC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* NEG Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_NEG]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* EXTU.B Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_EXTUB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* EXTU.W Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_EXTUW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* EXTS.B Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_EXTSB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* EXTS.W Rm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_EXTSW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* ADD #imm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF); nkeynes@387: sh4_stats[I_ADDI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: switch( (ir&0xF00) >> 8 ) { nkeynes@387: case 0x0: nkeynes@387: { /* MOV.B R0, @(disp, Rn) */ nkeynes@387: uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* MOV.W R0, @(disp, Rn) */ nkeynes@387: uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1; nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* MOV.B @(disp, Rm), R0 */ nkeynes@387: uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* MOV.W @(disp, Rm), R0 */ nkeynes@387: uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1; nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* CMP/EQ #imm, R0 */ nkeynes@387: int32_t imm = SIGNEXT8(ir&0xFF); nkeynes@387: sh4_stats[I_CMPEQI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* BT disp */ nkeynes@387: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@387: sh4_stats[I_BT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* BF disp */ nkeynes@387: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@387: sh4_stats[I_BF]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* BT/S disp */ nkeynes@387: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@387: sh4_stats[I_BTS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* BF/S disp */ nkeynes@387: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@387: sh4_stats[I_BFS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* MOV.W @(disp, PC), Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1; nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* BRA disp */ nkeynes@387: int32_t disp = SIGNEXT12(ir&0xFFF)<<1; nkeynes@387: sh4_stats[I_BRA]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* BSR disp */ nkeynes@387: int32_t disp = SIGNEXT12(ir&0xFFF)<<1; nkeynes@387: sh4_stats[I_BSR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: switch( (ir&0xF00) >> 8 ) { nkeynes@387: case 0x0: nkeynes@387: { /* MOV.B R0, @(disp, GBR) */ nkeynes@387: uint32_t disp = (ir&0xFF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* MOV.W R0, @(disp, GBR) */ nkeynes@387: uint32_t disp = (ir&0xFF)<<1; nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* MOV.L R0, @(disp, GBR) */ nkeynes@387: uint32_t disp = (ir&0xFF)<<2; nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* TRAPA #imm */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_TRAPA]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* MOV.B @(disp, GBR), R0 */ nkeynes@387: uint32_t disp = (ir&0xFF); nkeynes@387: sh4_stats[I_MOVB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* MOV.W @(disp, GBR), R0 */ nkeynes@387: uint32_t disp = (ir&0xFF)<<1; nkeynes@387: sh4_stats[I_MOVW]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* MOV.L @(disp, GBR), R0 */ nkeynes@387: uint32_t disp = (ir&0xFF)<<2; nkeynes@387: sh4_stats[I_MOVL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* MOVA @(disp, PC), R0 */ nkeynes@387: uint32_t disp = (ir&0xFF)<<2; nkeynes@387: sh4_stats[I_MOVA]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* TST #imm, R0 */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_TSTI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* AND #imm, R0 */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_ANDI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* XOR #imm, R0 */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_XORI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* OR #imm, R0 */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_ORI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* TST.B #imm, @(R0, GBR) */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_TSTB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* AND.B #imm, @(R0, GBR) */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_ANDB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* XOR.B #imm, @(R0, GBR) */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_XORB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: { /* OR.B #imm, @(R0, GBR) */ nkeynes@387: uint32_t imm = (ir&0xFF); nkeynes@387: sh4_stats[I_ORB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: { /* MOV.L @(disp, PC), Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2; nkeynes@387: sh4_stats[I_MOVLPC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* MOV #imm, Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF); nkeynes@387: sh4_stats[I_MOVI]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: switch( ir&0xF ) { nkeynes@387: case 0x0: nkeynes@387: { /* FADD FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FADD]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* FSUB FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FSUB]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* FMUL FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMUL]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* FDIV FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FDIV]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* FCMP/EQ FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FCMPEQ]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* FCMP/GT FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FCMPGT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* FMOV @(R0, Rm), FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMOV7]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* FMOV FRm, @(R0, Rn) */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMOV4]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* FMOV @Rm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMOV5]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* FMOV @Rm+, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMOV6]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* FMOV FRm, @Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMOV2]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* FMOV FRm, @-Rn */ nkeynes@387: uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMOV3]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xC: nkeynes@387: { /* FMOV FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMOV1]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xD: nkeynes@387: switch( (ir&0xF0) >> 4 ) { nkeynes@387: case 0x0: nkeynes@387: { /* FSTS FPUL, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FSTS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: { /* FLDS FRm, FPUL */ nkeynes@387: uint32_t FRm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FLDS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* FLOAT FPUL, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FLOAT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* FTRC FRm, FPUL */ nkeynes@387: uint32_t FRm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FTRC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x4: nkeynes@387: { /* FNEG FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FNEG]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x5: nkeynes@387: { /* FABS FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FABS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x6: nkeynes@387: { /* FSQRT FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FSQRT]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x7: nkeynes@387: { /* FSRRA FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FSRRA]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x8: nkeynes@387: { /* FLDI0 FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FLDI0]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x9: nkeynes@387: { /* FLDI1 FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FLDI1]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xA: nkeynes@387: { /* FCNVSD FPUL, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FCNVSD]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xB: nkeynes@387: { /* FCNVDS FRm, FPUL */ nkeynes@387: uint32_t FRm = ((ir>>8)&0xF); nkeynes@387: sh4_stats[I_FCNVDS]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* FIPR FVm, FVn */ nkeynes@387: uint32_t FVn = ((ir>>10)&0x3); uint32_t FVm = ((ir>>8)&0x3); nkeynes@387: sh4_stats[I_FIPR]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xF: nkeynes@387: switch( (ir&0x100) >> 8 ) { nkeynes@387: case 0x0: nkeynes@387: { /* FSCA FPUL, FRn */ nkeynes@387: uint32_t FRn = ((ir>>9)&0x7)<<1; nkeynes@387: sh4_stats[I_FSCA]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: switch( (ir&0x200) >> 9 ) { nkeynes@387: case 0x0: nkeynes@387: { /* FTRV XMTRX, FVn */ nkeynes@387: uint32_t FVn = ((ir>>10)&0x3); nkeynes@387: sh4_stats[I_FTRV]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x1: nkeynes@387: switch( (ir&0xC00) >> 10 ) { nkeynes@387: case 0x0: nkeynes@387: { /* FSCHG */ nkeynes@387: sh4_stats[I_FSCHG]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x2: nkeynes@387: { /* FRCHG */ nkeynes@387: sh4_stats[I_FRCHG]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0x3: nkeynes@387: { /* UNDEF */ nkeynes@387: sh4_stats[I_UNDEF]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: case 0xE: nkeynes@387: { /* FMAC FR0, FRm, FRn */ nkeynes@387: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@387: sh4_stats[I_FMAC]++; nkeynes@387: } nkeynes@387: break; nkeynes@387: default: nkeynes@387: UNDEF(); nkeynes@387: break; nkeynes@387: } nkeynes@387: break; nkeynes@387: } nkeynes@387: nkeynes@387: nkeynes@387: sh4_stats_total++; nkeynes@387: }