danderson@3977: /**
danderson@3977: * vim: set ts=8 sw=2 tw=99 sts=2 et:
danderson@3977: * =============================================================================
danderson@3977: * SourceMod
danderson@3977: * Copyright _(C) 2004-2008 AlliedModders LLC. All rights reserved.
danderson@3977: * =============================================================================
danderson@3977: *
danderson@3977: * This program is free software; you can redistribute it and/or modify it under
danderson@3977: * the terms of the GNU General Public License), version 3.0), as published by the
danderson@3977: * Free Software Foundation.
danderson@3977: *
danderson@3977: * This program is distributed in the hope that it will be useful), but WITHOUT
danderson@3977: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
danderson@3977: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
danderson@3977: * details.
danderson@3977: *
danderson@3977: * You should have received a copy of the GNU General Public License along with
danderson@3977: * this program. If not), see .
danderson@3977: *
danderson@3977: * As a special exception), AlliedModders LLC gives you permission to link the
danderson@3977: * code of this program _(as well as its derivative works) to "Half-Life 2)," the
danderson@3977: * "Source Engine)," the "SourcePawn JIT)," and any Game MODs that run on software
danderson@3977: * by the Valve Corporation. You must obey the GNU General Public License in
danderson@3977: * all respects for all other code used. Additionally), AlliedModders LLC grants
danderson@3977: * this exception to all derivative works. AlliedModders LLC defines further
danderson@3977: * exceptions), found in LICENSE.txt _(as of this writing), version JULY-31-2007)),
danderson@3977: * or .
danderson@3977: *
danderson@3977: * Version: $Id$
danderson@3977: */
danderson@3977: #include "opcodes.h"
danderson@3977: #include "jit_shared.h"
danderson@3977:
danderson@3977: using namespace SourcePawn;
danderson@3977:
danderson@3977: const char *OpcodeNames[] = {
danderson@3977: #define _(op, text) text,
danderson@3977: OPCODE_LIST(_)
danderson@3977: #undef _
danderson@3977: NULL
danderson@3977: };
danderson@3977:
danderson@3977: void
danderson@3977: SourcePawn::SpewOpcode(const sp_plugin_t *plugin, cell_t *start, cell_t *cip)
danderson@3977: {
danderson@3977: fprintf(stdout, " [%05d:%04d]", cip - (cell_t *)plugin->pcode, cip - start);
danderson@3977:
danderson@3977: if (*cip >= OPCODES_TOTAL) {
danderson@3977: fprintf(stdout, " unknown-opcode\n");
danderson@3977: return;
danderson@3977: }
danderson@3977:
danderson@3977: OPCODE op = (OPCODE)*cip;
danderson@3977: fprintf(stdout, " %s ", OpcodeNames[op]);
danderson@3977:
danderson@3977: switch (op) {
danderson@3977: case OP_PUSH_C:
danderson@3977: case OP_PUSH_ADR:
danderson@3977: case OP_SHL_C_PRI:
danderson@3977: case OP_SHL_C_ALT:
danderson@3977: case OP_SHR_C_PRI:
danderson@3977: case OP_SHR_C_ALT:
danderson@3977: case OP_ADD_C:
danderson@3977: case OP_SMUL_C:
danderson@3977: case OP_EQ_C_PRI:
danderson@3977: case OP_EQ_C_ALT:
danderson@3977: case OP_TRACKER_PUSH_C:
danderson@3977: case OP_STACK:
danderson@3977: case OP_PUSH_S:
danderson@3977: case OP_HEAP:
danderson@3977: case OP_GENARRAY:
danderson@3977: case OP_GENARRAY_Z:
dvander@3989: case OP_CONST_PRI:
dvander@3989: case OP_CONST_ALT:
danderson@3977: fprintf(stdout, "%d", cip[1]);
danderson@3977: break;
danderson@3977:
danderson@3977: case OP_JUMP:
danderson@3977: case OP_JZER:
danderson@3977: case OP_JNZ:
danderson@3977: case OP_JEQ:
danderson@3977: case OP_JNEQ:
danderson@3977: case OP_JSLESS:
danderson@3977: case OP_JSGRTR:
danderson@3977: case OP_JSGEQ:
danderson@3977: case OP_JSLEQ:
danderson@3977: fprintf(stdout, "%05d:%04d",
danderson@3977: cip[1] / 4,
danderson@3977: ((cell_t *)plugin->pcode + cip[1] / 4) - start);
danderson@3977: break;
danderson@3977:
danderson@3977: case OP_SYSREQ_C:
danderson@3977: case OP_SYSREQ_N:
danderson@3977: {
danderson@3977: uint32_t index = cip[1];
danderson@3977: if (index < plugin->num_natives)
danderson@3977: fprintf(stdout, "%s", plugin->natives[index].name);
danderson@3977: if (op == OP_SYSREQ_N)
danderson@3977: fprintf(stdout, " ; (%d args, index %d)", cip[2], index);
danderson@3977: else
danderson@3977: fprintf(stdout, " ; (index %d)", index);
danderson@3977: break;
danderson@3977: }
danderson@3977:
danderson@3977: case OP_PUSH2_C:
danderson@3977: case OP_PUSH2:
danderson@3977: case OP_PUSH2_S:
danderson@3977: case OP_PUSH2_ADR:
danderson@3977: fprintf(stdout, "%d, %d", cip[1], cip[2]);
danderson@3977: break;
danderson@3977:
danderson@3977: case OP_PUSH3_C:
danderson@3977: case OP_PUSH3:
danderson@3977: case OP_PUSH3_S:
danderson@3977: case OP_PUSH3_ADR:
danderson@3977: fprintf(stdout, "%d, %d, %d", cip[1], cip[2], cip[3]);
danderson@3977: break;
danderson@3977:
danderson@3977: case OP_PUSH4_C:
danderson@3977: case OP_PUSH4:
danderson@3977: case OP_PUSH4_S:
danderson@3977: case OP_PUSH4_ADR:
danderson@3977: fprintf(stdout, "%d, %d, %d, %d", cip[1], cip[2], cip[3], cip[4]);
danderson@3977: break;
danderson@3977:
danderson@3977: case OP_PUSH5_C:
danderson@3977: case OP_PUSH5:
danderson@3977: case OP_PUSH5_S:
danderson@3977: case OP_PUSH5_ADR:
danderson@3977: fprintf(stdout, "%d, %d, %d, %d, %d", cip[1], cip[2], cip[3], cip[4], cip[5]);
danderson@3977: break;
danderson@3977:
danderson@3977: default:
danderson@3977: break;
danderson@3977: }
danderson@3977:
danderson@3977: fprintf(stdout, "\n");
danderson@3977: }
danderson@3977: