/* src/vm/jit/alpha/disass.c - primitive disassembler for Alpha machine code
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ 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
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Andreas Krall
- Reinhard Grafl
-
- Changes: Christian Thalinger
-
- $Id: disass.c 4357 2006-01-22 23:33:38Z twisti $
-
*/
+#include "config.h"
+
#include <stdio.h>
#include "vm/types.h"
+#include "vm/global.h"
+
+#include "vm/jit/abi.h"
+#include "vm/jit/disass.h"
+
/* The disassembler uses two tables for decoding the instructions. The first
table (ops) is used to classify the instructions based on the op code and
};
-/* name table for 32 integer registers */
-
-char *regs[] = {
- /* 0x00 */ "v0", /* "$0", */
- /* 0x01 */ "t0", /* "$1", */
- /* 0x02 */ "t1", /* "$2", */
- /* 0x03 */ "t2", /* "$3", */
- /* 0x04 */ "t3", /* "$4", */
- /* 0x05 */ "t4", /* "$5", */
- /* 0x06 */ "t5", /* "$6", */
- /* 0x07 */ "t6", /* "$7", */
-
- /* 0x08 */ "t7", /* "$8", */
- /* 0x09 */ "s0", /* "$9", */
- /* 0x0a */ "s1", /* "$10", */
- /* 0x0b */ "s2", /* "$11", */
- /* 0x0c */ "s3", /* "$12", */
- /* 0x0d */ "s4", /* "$13", */
- /* 0x0e */ "s5", /* "$14", */
- /* 0x0f */ "s6", /* "$15", */
-
- /* 0x10 */ "a0", /* "$16", */
- /* 0x11 */ "a1", /* "$17", */
- /* 0x12 */ "a2", /* "$18", */
- /* 0x13 */ "a3", /* "$19", */
- /* 0x14 */ "a4", /* "$20", */
- /* 0x15 */ "a5", /* "$21", */
- /* 0x16 */ "t8", /* "$22", */
- /* 0x17 */ "t9", /* "$23", */
-
- /* 0x18 */ "t10", /* "$24", */
- /* 0x19 */ "t11", /* "$25", */
- /* 0x1a */ "ra", /* "$26", */
- /* 0x1b */ "pv", /* "$27", */
- /* 0x1c */ "at", /* "$28", */
- /* 0x1d */ "gp", /* "$29", */
- /* 0x1e */ "sp", /* "$30", */
- /* 0x1f */ "zero" /* "$31" */
-};
-
-
/* disassinstr *****************************************************************
Outputs a disassembler listing of one machine code instruction on
switch ((c >> 14) & 3) { /* branch hint */
case 0:
if (ra == 31) {
- printf("jmp (%s)\n", regs[rb]);
+ printf("jmp (%s)\n", abi_registers_integer_name[rb]);
goto _return;
}
printf("jmp ");
break;
case 1:
if (ra == 26) {
- printf("jsr (%s)\n", regs[rb]);
+ printf("jsr (%s)\n", abi_registers_integer_name[rb]);
goto _return;
}
printf("jsr ");
goto _return;
}
if (ra == 31) {
- printf("ret (%s)\n", regs[rb]);
+ printf("ret (%s)\n", abi_registers_integer_name[rb]);
goto _return;
}
printf("ret ");
printf("jsr_co ");
break;
}
- printf("%s,(%s)\n", regs[ra], regs[rb]);
+ printf("%s,(%s)\n", abi_registers_integer_name[ra],
+ abi_registers_integer_name[rb]);
break;
case ITYPE_MEM: {
if (op == 0x18 && ra == 0 && ra == 0 && disp == 0)
printf("trapb\n");
else
- printf("%s %s,%d(%s)\n", ops[op].name, regs[ra], disp, regs[rb]);
+ printf("%s %s,%d(%s)\n", ops[op].name,
+ abi_registers_integer_name[ra], disp,
+ abi_registers_integer_name[rb]);
break;
}
case ITYPE_FMEM:
- printf("%s $f%d,%d(%s)\n", ops[op].name, ra, (c << 16) >> 16, regs[rb]);
+ printf("%s $f%d,%d(%s)\n", ops[op].name, ra, (c << 16) >> 16,
+ abi_registers_integer_name[rb]);
break;
case ITYPE_BRA: /* 21 bit signed branch offset */
else if (op == 0x34 && ra == 26)
printf("brs 0x%016lx\n", (u8) code + 4 + ((c << 11) >> 9));
else
- printf("%s %s,0x%016lx\n",
- ops[op].name, regs[ra], (u8) code + 4 + ((c << 11) >> 9));
+ printf("%s %s,0x%016lx\n", ops[op].name,
+ abi_registers_integer_name[ra],
+ (u8) code + 4 + ((c << 11) >> 9));
break;
case ITYPE_FOP: {
if (ra == 31 && rc == 31)
printf("nop\n");
else if (ra == 31)
- printf("clr %s\n", regs[rc]);
+ printf("clr %s\n", abi_registers_integer_name[rc]);
else
- printf("mov %s,%s\n", regs[ra], regs[rc]);
+ printf("mov %s,%s\n", abi_registers_integer_name[ra],
+ abi_registers_integer_name[rc]);
goto _return;
}
for (i = 0; op3s[i].name; i++) {
if (op3s[i].op == op && op3s[i].fun == opfun) {
if (c & 0x1000) /* immediate instruction */
- printf("%s %s,%d,%s\n",
- op3s[i].name, regs[ra], lit, regs[rc]);
+ printf("%s %s,%d,%s\n", op3s[i].name,
+ abi_registers_integer_name[ra], lit,
+ abi_registers_integer_name[rc]);
else
- printf("%s %s,%s,%s\n",
- op3s[i].name, regs[ra], regs[rb], regs[rc]);
+ printf("%s %s,%s,%s\n", op3s[i].name,
+ abi_registers_integer_name[ra],
+ abi_registers_integer_name[rb],
+ abi_registers_integer_name[rc]);
goto _return;
}
}