* Removed all Id tags.
[cacao.git] / src / vm / jit / mips / disass.c
index f30d0aa0f693fbb40205488ad727393ba24cb072..c70318d8908d09846bc1a3136af07cd8325dd898 100644 (file)
@@ -1,9 +1,9 @@
 /* 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
@@ -365,47 +360,6 @@ static char *fbra[] = {
 };
 
 
-/* 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
@@ -489,17 +443,18 @@ u1 *disassinstr(u1 *code)
                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   */
@@ -512,23 +467,30 @@ u1 *disassinstr(u1 *code)
                        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
@@ -542,43 +504,55 @@ u1 *disassinstr(u1 *code)
                }
                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);
@@ -604,22 +578,22 @@ u1 *disassinstr(u1 *code)
                }
 
                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;
                }