Cog/Frameworks/lazyusf2/lazyusf2/r4300/instr_counters.c

105 lines
4.8 KiB
C

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Mupen64plus - instr_counters.c *
* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
* Copyright (C) 2002 Hacktarux *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#if defined(COUNT_INSTR)
#include <stdio.h>
#include <string.h>
#include "usf/usf.h"
#include "usf/usf_internal.h"
#include "api/m64p_types.h"
#include "api/callbacks.h"
/* various constants */
static char instr_name[][10] =
{
"reserved", "NI", "J", "JAL", "BEQ", "BNE", "BLEZ", "BGTZ",
"ADDI", "ADDIU", "SLTI", "SLTIU", "ANDI", "ORI", "XORI", "LUI",
"BEQL", "BNEL", "BLEZL", "BGTZL", "DADDI", "DADDIU", "LDL", "LDR",
"LB", "LH", "LW", "LWL", "LBU", "LHU", "LWU", "LWR",
"SB", "SH", "SW", "SWL", "SWR", "SDL", "SDR", "LWC1",
"LDC1", "LD", "LL", "SWC1", "SDC1", "SD", "SC", "BLTZ",
"BGEZ", "BLTZL", "BGEZL", "BLTZAL", "BGEZAL", "BLTZALL", "BGEZALL", "SLL",
"SRL", "SRA", "SLLV", "SRLV", "SRAV", "JR", "JALR", "SYSCALL",
"MFHI", "MTHI", "MFLO", "MTLO", "DSLLV", "DSRLV", "DSRAV", "MULT",
"MULTU", "DIV", "DIVU", "DMULT", "DMULTU", "DDIV", "DDIVU", "ADD",
"ADDU", "SUB", "SUBU", "AND", "OR", "XOR", "NOR", "SLT",
"SLTU", "DADD", "DADDU", "DSUB", "DSUBU", "DSLL", "DSRL", "DSRA",
"TEQ", "DSLL32", "DSRL32", "DSRA32", "BC1F", "BC1T", "BC1FL", "BC1TL",
"TLBWI", "TLBP", "TLBR", "TLBWR", "ERET", "MFC0", "MTC0", "MFC1",
"DMFC1", "CFC1", "MTC1", "DMTC1", "CTC1", "f.CVT", "f.CMP", "f.ADD",
"f.SUB", "f.MUL", "f.DIV", "f.SQRT", "f.ABS", "f.MOV", "f.NEG", "f.ROUND",
"f.TRUNC", "f.CEIL", "f.FLOOR"
};
static unsigned int instr_type[131] =
{
9, 10, 6, 6, 7, 7, 7, 7, 3, 3, 4, 4, 3, 4, 4, 0,
7, 7, 7, 7, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 7,
7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 6, 6, 10,
2, 2, 2, 2, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3,
3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
8, 4, 4, 4, 7, 7, 7, 7, 10, 10, 10, 10, 8, 2, 2, 2,
2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5,
5, 5, 5
};
static char instr_typename[][20] =
{
"Load", "Store", "Data move/convert",
"32-bit math", "64-bit math", "Float Math",
"Jump", "Branch", "Exceptions",
"Reserved", "Other"
};
/* global function */
void instr_counters_print(usf_state_t * state)
{
size_t i;
unsigned int iTypeCount[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned int iTotal = 0;
char line[128], param[24];
DebugMessage(state, M64MSG_INFO, "Instruction counters:");
line[0] = 0;
for (i = 0; i < 131; i++)
{
sprintf(param, "%8s: %08i ", instr_name[i], state->instr_count[i]);
strcat(line, param);
if (i % 5 == 4)
{
DebugMessage(state, M64MSG_INFO, "%s", line);
line[0] = 0;
}
iTypeCount[instr_type[i]] += state->instr_count[i];
iTotal += state->instr_count[i];
}
DebugMessage(state, M64MSG_INFO, "Instruction type summary (total instructions = %i)", iTotal);
for (i = 0; i < 11; i++)
{
DebugMessage(state, M64MSG_INFO, "%20s: %04.1f%% (%i)", instr_typename[i], (float) iTypeCount[i] * 100.0 / iTotal, iTypeCount[i]);
}
}
#endif /* COUNT_INSTR */