sourcepawn/jit/opcodes.cpp
author David Anderson <dvander@alliedmods.net>
Mon Aug 12 00:22:41 2013 +0100 (2013-08-12)
changeset 3989 b73dae36a0da
parent 3977 fca2b54741ca
permissions -rw-r--r--
Eliminate InfoVars::rval (bug 5844 part 6, r=ds).
danderson@3977
     1
/**
danderson@3977
     2
 * vim: set ts=8 sw=2 tw=99 sts=2 et:
danderson@3977
     3
 * =============================================================================
danderson@3977
     4
 * SourceMod
danderson@3977
     5
 * Copyright _(C) 2004-2008 AlliedModders LLC.  All rights reserved.
danderson@3977
     6
 * =============================================================================
danderson@3977
     7
 *
danderson@3977
     8
 * This program is free software; you can redistribute it and/or modify it under
danderson@3977
     9
 * the terms of the GNU General Public License), version 3.0), as published by the
danderson@3977
    10
 * Free Software Foundation.
danderson@3977
    11
 * 
danderson@3977
    12
 * This program is distributed in the hope that it will be useful), but WITHOUT
danderson@3977
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
danderson@3977
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
danderson@3977
    15
 * details.
danderson@3977
    16
 *
danderson@3977
    17
 * You should have received a copy of the GNU General Public License along with
danderson@3977
    18
 * this program.  If not), see <http://www.gnu.org/licenses/>.
danderson@3977
    19
 *
danderson@3977
    20
 * As a special exception), AlliedModders LLC gives you permission to link the
danderson@3977
    21
 * code of this program _(as well as its derivative works) to "Half-Life 2)," the
danderson@3977
    22
 * "Source Engine)," the "SourcePawn JIT)," and any Game MODs that run on software
danderson@3977
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
danderson@3977
    24
 * all respects for all other code used.  Additionally), AlliedModders LLC grants
danderson@3977
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
danderson@3977
    26
 * exceptions), found in LICENSE.txt _(as of this writing), version JULY-31-2007)),
danderson@3977
    27
 * or <http://www.sourcemod.net/license.php>.
danderson@3977
    28
 *
danderson@3977
    29
 * Version: $Id$
danderson@3977
    30
 */
danderson@3977
    31
#include "opcodes.h"
danderson@3977
    32
#include "jit_shared.h"
danderson@3977
    33
danderson@3977
    34
using namespace SourcePawn;
danderson@3977
    35
danderson@3977
    36
const char *OpcodeNames[] = {
danderson@3977
    37
#define _(op, text) text,
danderson@3977
    38
  OPCODE_LIST(_)
danderson@3977
    39
#undef _
danderson@3977
    40
  NULL
danderson@3977
    41
};
danderson@3977
    42
danderson@3977
    43
void
danderson@3977
    44
SourcePawn::SpewOpcode(const sp_plugin_t *plugin, cell_t *start, cell_t *cip)
danderson@3977
    45
{
danderson@3977
    46
  fprintf(stdout, "  [%05d:%04d]", cip - (cell_t *)plugin->pcode, cip - start);
danderson@3977
    47
danderson@3977
    48
  if (*cip >= OPCODES_TOTAL) {
danderson@3977
    49
    fprintf(stdout, " unknown-opcode\n");
danderson@3977
    50
    return;
danderson@3977
    51
  }
danderson@3977
    52
danderson@3977
    53
  OPCODE op = (OPCODE)*cip;
danderson@3977
    54
  fprintf(stdout, " %s ", OpcodeNames[op]);
danderson@3977
    55
danderson@3977
    56
  switch (op) {
danderson@3977
    57
    case OP_PUSH_C:
danderson@3977
    58
    case OP_PUSH_ADR:
danderson@3977
    59
    case OP_SHL_C_PRI:
danderson@3977
    60
    case OP_SHL_C_ALT:
danderson@3977
    61
    case OP_SHR_C_PRI:
danderson@3977
    62
    case OP_SHR_C_ALT:
danderson@3977
    63
    case OP_ADD_C:
danderson@3977
    64
    case OP_SMUL_C:
danderson@3977
    65
    case OP_EQ_C_PRI:
danderson@3977
    66
    case OP_EQ_C_ALT:
danderson@3977
    67
    case OP_TRACKER_PUSH_C:
danderson@3977
    68
    case OP_STACK:
danderson@3977
    69
    case OP_PUSH_S:
danderson@3977
    70
    case OP_HEAP:
danderson@3977
    71
    case OP_GENARRAY:
danderson@3977
    72
    case OP_GENARRAY_Z:
dvander@3989
    73
    case OP_CONST_PRI:
dvander@3989
    74
    case OP_CONST_ALT:
danderson@3977
    75
      fprintf(stdout, "%d", cip[1]);
danderson@3977
    76
      break;
danderson@3977
    77
danderson@3977
    78
    case OP_JUMP:
danderson@3977
    79
    case OP_JZER:
danderson@3977
    80
    case OP_JNZ:
danderson@3977
    81
    case OP_JEQ:
danderson@3977
    82
    case OP_JNEQ:
danderson@3977
    83
    case OP_JSLESS:
danderson@3977
    84
    case OP_JSGRTR:
danderson@3977
    85
    case OP_JSGEQ:
danderson@3977
    86
    case OP_JSLEQ:
danderson@3977
    87
      fprintf(stdout, "%05d:%04d",
danderson@3977
    88
        cip[1] / 4,
danderson@3977
    89
        ((cell_t *)plugin->pcode + cip[1] / 4) - start);
danderson@3977
    90
      break;
danderson@3977
    91
danderson@3977
    92
    case OP_SYSREQ_C:
danderson@3977
    93
    case OP_SYSREQ_N:
danderson@3977
    94
    {
danderson@3977
    95
      uint32_t index = cip[1];
danderson@3977
    96
      if (index < plugin->num_natives)
danderson@3977
    97
        fprintf(stdout, "%s", plugin->natives[index].name); 
danderson@3977
    98
      if (op == OP_SYSREQ_N)
danderson@3977
    99
        fprintf(stdout, " ; (%d args, index %d)", cip[2], index);
danderson@3977
   100
      else
danderson@3977
   101
        fprintf(stdout, " ; (index %d)", index);
danderson@3977
   102
      break;
danderson@3977
   103
    }
danderson@3977
   104
danderson@3977
   105
    case OP_PUSH2_C:
danderson@3977
   106
    case OP_PUSH2:
danderson@3977
   107
    case OP_PUSH2_S:
danderson@3977
   108
    case OP_PUSH2_ADR:
danderson@3977
   109
      fprintf(stdout, "%d, %d", cip[1], cip[2]);
danderson@3977
   110
      break;
danderson@3977
   111
danderson@3977
   112
    case OP_PUSH3_C:
danderson@3977
   113
    case OP_PUSH3:
danderson@3977
   114
    case OP_PUSH3_S:
danderson@3977
   115
    case OP_PUSH3_ADR:
danderson@3977
   116
      fprintf(stdout, "%d, %d, %d", cip[1], cip[2], cip[3]);
danderson@3977
   117
      break;
danderson@3977
   118
danderson@3977
   119
    case OP_PUSH4_C:
danderson@3977
   120
    case OP_PUSH4:
danderson@3977
   121
    case OP_PUSH4_S:
danderson@3977
   122
    case OP_PUSH4_ADR:
danderson@3977
   123
      fprintf(stdout, "%d, %d, %d, %d", cip[1], cip[2], cip[3], cip[4]);
danderson@3977
   124
      break;
danderson@3977
   125
danderson@3977
   126
    case OP_PUSH5_C:
danderson@3977
   127
    case OP_PUSH5:
danderson@3977
   128
    case OP_PUSH5_S:
danderson@3977
   129
    case OP_PUSH5_ADR:
danderson@3977
   130
      fprintf(stdout, "%d, %d, %d, %d, %d", cip[1], cip[2], cip[3], cip[4], cip[5]);
danderson@3977
   131
      break;
danderson@3977
   132
danderson@3977
   133
    default:
danderson@3977
   134
      break;
danderson@3977
   135
  }
danderson@3977
   136
danderson@3977
   137
  fprintf(stdout, "\n");
danderson@3977
   138
}
danderson@3977
   139