* Removed all Id tags.
[cacao.git] / src / vm / jit / alpha / disass.c
index 966bc5976a735c010e7ac2406efffecfcb5d5c97..b47846b62ea6d14ccb78b9895f332163474acf7a 100644 (file)
@@ -1,6 +1,6 @@
 /* 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
@@ -243,47 +241,6 @@ static struct { u2 op, fun; char *name; }  op3s[] = {
 };
 
 
-/* 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
@@ -318,14 +275,14 @@ u1 *disassinstr(u1 *code)
                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     "); 
@@ -336,7 +293,7 @@ u1 *disassinstr(u1 *code)
                                goto _return;
                        }
                        if (ra == 31) {
-                               printf("ret     (%s)\n", regs[rb]); 
+                               printf("ret     (%s)\n", abi_registers_integer_name[rb]); 
                                goto _return;
                        }
                        printf("ret     ");
@@ -345,7 +302,8 @@ u1 *disassinstr(u1 *code)
                        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: {
@@ -354,12 +312,15 @@ u1 *disassinstr(u1 *code)
                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 */
@@ -368,8 +329,9 @@ u1 *disassinstr(u1 *code)
                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: {
@@ -396,19 +358,23 @@ u1 *disassinstr(u1 *code)
                        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;
                        }
                }