/* src/vm/jit/mips/disass.c - primitive disassembler for MIPS machine code
- Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
- R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
- C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
- Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
+ C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+ E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+ J. Wenninger, Institut f. Computersprachen - TU Wien
This file is part of CACAO.
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., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
-
- Contact: cacao@complang.tuwien.ac.at
-
- Authors: Andreas Krall
-
- Changes: Christian Thalinger
-
- $Id: disass.c 3441 2005-10-18 12:22:22Z twisti $
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
*/
+#include "config.h"
+
#include <stdio.h>
-#include "config.h"
#include "vm/types.h"
+#include "vm/jit/abi.h"
+
/* The disassembler uses four tables for decoding the instructions. The first
table (ops) is used to classify the instructions based on the op code and
};
-/* instruction decode table for 32 integer registers */
-
-char *regs[] = {
- /* 0x00 */ "zero", /* "$0", */
- /* 0x01 */ "at", /* "$1", */
- /* 0x02 */ "v0", /* "$2", */
- /* 0x03 */ "v1", /* "$3", */
- /* 0x04 */ "a0", /* "$4", */
- /* 0x05 */ "a1", /* "$5", */
- /* 0x06 */ "a2", /* "$6", */
- /* 0x07 */ "a3", /* "$7", */
-
- /* 0x08 */ "a4", /* "$8", */
- /* 0x09 */ "a5", /* "$9", */
- /* 0x0a */ "a6", /* "$10", */
- /* 0x0b */ "a7", /* "$11", */
- /* 0x0c */ "t0", /* "$12", */
- /* 0x0d */ "t1", /* "$13", */
- /* 0x0e */ "t2", /* "$14", */
- /* 0x0f */ "t3", /* "$15", */
-
- /* 0x10 */ "s0", /* "$16", */
- /* 0x11 */ "s1", /* "$17", */
- /* 0x12 */ "s2", /* "$18", */
- /* 0x13 */ "s3", /* "$19", */
- /* 0x14 */ "s4", /* "$20", */
- /* 0x15 */ "s5", /* "$21", */
- /* 0x16 */ "s6", /* "$22", */
- /* 0x17 */ "s7", /* "$23", */
-
- /* 0x18 */ "t8", /* "$24", */
- /* 0x19 */ "t9", /* "$25", */
- /* 0x1a */ "k0", /* "$26", */
- /* 0x1b */ "k1", /* "$27", */
- /* 0x1c */ "gp", /* "$28", */
- /* 0x1d */ "sp", /* "$29", */
- /* 0x1e */ "s8", /* "$30", */
- /* 0x1f */ "ra" /* "$31" */
-};
-
-
/* instruction decode table for 32 floating point registers */
#if 0
break;
case ITYPE_IMM: /* 16 bit signed immediate value */
- printf("%s %s,%s,%d\n", ops[op].name, regs[rt],
- regs[rs], (c << 16) >> 16);
+ printf("%s %s,%s,%d\n", ops[op].name, abi_registers_integer_name[rt],
+ abi_registers_integer_name[rs], (c << 16) >> 16);
break;
case ITYPE_MEM: /* 16 bit signed memory offset */
- printf("%s %s,%d(%s)\n", ops[op].name, regs[rt],
- (c << 16) >> 16, regs[rs]);
+ printf("%s %s,%d(%s)\n", ops[op].name, abi_registers_integer_name[rt],
+ (c << 16) >> 16, abi_registers_integer_name[rs]);
break;
case ITYPE_FMEM: /* 16 bit signed memory offset */
- printf("%s $f%d,%d(%s)\n", ops[op].name, rt, (c << 16) >> 16, regs[rs]);
+ printf("%s $f%d,%d(%s)\n", ops[op].name, rt, (c << 16) >> 16,
+ abi_registers_integer_name[rs]);
break;
case ITYPE_BRA: /* 16 bit signed branch offset */
break;
}
#if SIZEOF_VOID_P == 8
- printf("%s %s,%s,0x%016lx\n", ops[op].name, regs[rs], regs[rt],
+ printf("%s %s,%s,0x%016lx\n", ops[op].name,
+ abi_registers_integer_name[rs],
+ abi_registers_integer_name[rt],
(u8) code + 4 + ((c << 16) >> 14));
#else
- printf("%s %s,%s,0x%08x\n", ops[op].name, regs[rs], regs[rt],
+ printf("%s %s,%s,0x%08x\n", ops[op].name,
+ abi_registers_integer_name[rs],
+ abi_registers_integer_name[rt],
(u4) code + 4 + ((c << 16) >> 14));
#endif
break;
case ITYPE_RIMM:
if (regimms[rt].ftype == ITYPE_IMM)
- printf("%s %s,%d\n", regimms[rt].name, regs[rs], (c << 16) >> 16);
+ printf("%s %s,%d\n", regimms[rt].name,
+ abi_registers_integer_name[rs], (c << 16) >> 16);
else if (regimms[rt].ftype == ITYPE_BRA)
#if SIZEOF_VOID_P == 8
- printf("%s %s,0x%016lx\n", regimms[rt].name, regs[rs],
+ printf("%s %s,0x%016lx\n", regimms[rt].name,
+ abi_registers_integer_name[rs],
(u8) code + 4 + ((c << 16) >> 14));
#else
- printf("%s %s,0x%08x\n", regimms[rt].name, regs[rs],
+ printf("%s %s,0x%08x\n", regimms[rt].name,
+ abi_registers_integer_name[rs],
(u4) code + 4 + ((c << 16) >> 14));
#endif
else
}
if (opfun == 0x25 && rt == 0) {
if (rs == 0)
- printf("clr %s\n", regs[rd]);
+ printf("clr %s\n", abi_registers_integer_name[rd]);
else
- printf("move %s,%s\n", regs[rd], regs[rs]);
+ printf("move %s,%s\n", abi_registers_integer_name[rd],
+ abi_registers_integer_name[rs]);
break;
}
switch (regops[opfun].ftype) {
case ITYPE_OP:
- printf("%s %s,%s,%s\n", regops[opfun].name, regs[rd],
- regs[rs], regs[rt]);
+ printf("%s %s,%s,%s\n", regops[opfun].name,
+ abi_registers_integer_name[rd],
+ abi_registers_integer_name[rs],
+ abi_registers_integer_name[rt]);
break;
case ITYPE_IMM: /* immediate instruction */
printf("%s %s,%s,%d\n",
- regops[opfun].name, regs[rd], regs[rt], shift);
+ regops[opfun].name, abi_registers_integer_name[rd],
+ abi_registers_integer_name[rt], shift);
break;
case ITYPE_TRAP:
printf("%s %s,%s,%d\n", regops[opfun].name,
- regs[rs], regs[rt], (c << 16) >> 22);
+ abi_registers_integer_name[rs],
+ abi_registers_integer_name[rt], (c << 16) >> 22);
break;
case ITYPE_DIVMUL: /* div/mul instruction */
- printf("%s %s,%s\n", regops[opfun].name, regs[rs], regs[rt]);
+ printf("%s %s,%s\n", regops[opfun].name,
+ abi_registers_integer_name[rs],
+ abi_registers_integer_name[rt]);
break;
case ITYPE_JMP:
if (rd == 31) {
- printf("%s %s\n", regops[opfun].name, regs[rs]);
+ printf("%s %s\n", regops[opfun].name,
+ abi_registers_integer_name[rs]);
break;
}
- printf("%s %s,%s\n", regops[opfun].name, regs[rd], regs[rs]);
+ printf("%s %s,%s\n", regops[opfun].name,
+ abi_registers_integer_name[rd],
+ abi_registers_integer_name[rs]);
break;
case ITYPE_MTOJR:
if (opfun == 8 && rs == 31) {
printf("ret\n");
break;
}
- printf("%s %s\n", regops[opfun].name, regs[rs]);
+ printf("%s %s\n", regops[opfun].name,
+ abi_registers_integer_name[rs]);
break;
case ITYPE_MFROM:
- printf("%s %s\n", regops[opfun].name, regs[rd]);
+ printf("%s %s\n", regops[opfun].name,
+ abi_registers_integer_name[rd]);
break;
case ITYPE_SYS:
printf("%s\n", regops[opfun].name);
}
if (rs == 0) { /* move from */
- printf("mfc1 %s,$f%d\n", regs[rt], fs);
+ printf("mfc1 %s,$f%d\n", abi_registers_integer_name[rt], fs);
break;
}
if (rs == 1) { /* double move from */
- printf("dmfc1 %s,$f%d\n", regs[rt], fs);
+ printf("dmfc1 %s,$f%d\n", abi_registers_integer_name[rt], fs);
break;
}
if (rs == 4) { /* move to */
- printf("mtc1 %s,$f%d\n", regs[rt], fs);
+ printf("mtc1 %s,$f%d\n", abi_registers_integer_name[rt], fs);
break;
}
if (rs == 5) { /* double move to */
- printf("dmtc1 %s,$f%d\n", regs[rt], fs);
+ printf("dmtc1 %s,$f%d\n", abi_registers_integer_name[rt], fs);
break;
}