- include options.h/statistics.h instead of main.h
[cacao.git] / jit / stack.c
index e33fd85bc37c2818c5fa97dec1e93092a3d229e2..d05cc51bb975cdf453616ff7a7482ee565ccd1ea 100644 (file)
 
    Changes: Edwin Steiner
 
-   $Id: stack.c 1112 2004-05-31 15:47:20Z jowenn $
+   $Id: stack.c 1232 2004-06-30 19:47:43Z twisti $
 
 */
 
 
 #include <stdio.h>
 #include <string.h>
-#include "stack.h"
 #include "global.h"
-#include "main.h"
 #include "native.h"
-#include "jit.h"
 #include "builtin.h"
 #include "disass.h"
-#include "reg.h"
 #include "tables.h"
 #include "types.h"
+#include "options.h"
+#include "statistics.h"
+#include "jit/jit.h"
+#include "jit/stack.h"
+#include "jit/reg.h"
 #include "toolbox/logging.h"
 #include "toolbox/memory.h"
 
@@ -70,7 +71,7 @@ extern int dseglen;
 /* SIGNALING ERRORS                                 */
 /*--------------------------------------------------*/
 
-#define TYPEPANIC  {show_icmd_method();panic("Stack type mismatch");}
+#define TYPEPANIC  {panic("Stack type mismatch");}
 
 
 /*--------------------------------------------------*/
@@ -109,7 +110,7 @@ extern int dseglen;
 
 #define CHECKOVERFLOW \
        do { \
-               if (stackdepth > maxstack) { \
+               if (stackdepth > m->maxstack) { \
                        if (iptr[0].opc != ICMD_ACONST \
                 || iptr[0].op1 == 0) { \
                 sprintf(msg, "(class: "); \
@@ -271,17 +272,17 @@ extern int dseglen;
                        copy->varkind = STACKVAR; \
                        copy->varnum = i;\
                } \
-               interfaces[i][copy->type].type = copy->type; \
-               interfaces[i][copy->type].flags |= copy->flags; \
+               m->registerdata->interfaces[i][copy->type].type = copy->type; \
+               m->registerdata->interfaces[i][copy->type].flags |= copy->flags; \
                i--; copy = copy->prev; \
        } \
        i = bptr->indepth - 1; \
        copy = bptr->instack; \
        while (copy) { \
-               interfaces[i][copy->type].type = copy->type; \
+               m->registerdata->interfaces[i][copy->type].type = copy->type; \
                if (copy->varkind == STACKVAR) { \
                        if (copy->flags & SAVEDVAR) \
-                               interfaces[i][copy->type].flags |= SAVEDVAR; \
+                               m->registerdata->interfaces[i][copy->type].flags |= SAVEDVAR; \
                } \
                i--; copy = copy->prev; \
        } \
@@ -301,7 +302,7 @@ extern int dseglen;
                {COPYCURSTACK(c);b->flags=0;b->instack=c;b->indepth=stackdepth;} \
        else {stackptr s=curstack;stackptr t=b->instack;                                        \
                if(b->indepth!=stackdepth)                                                                              \
-                       {show_icmd_method();panic("Stack depth mismatch");}                     \
+                       {show_icmd_method(m);panic("Stack depth mismatch");}                    \
                while(s){if (s->type!=t->type)                                                                  \
                                TYPEPANIC                                                                                               \
                        s=s->prev;t=t->prev;                                                                            \
@@ -353,20 +354,20 @@ methodinfo *analyse_stack(methodinfo *m)
        int *argren;
        char msg[MAXLOGTEXT];               /* maybe we get an exception          */
 
-       argren = DMNEW(int, maxlocals);
-       /*int *argren = (int *)alloca(maxlocals * sizeof(int));*/ /* table for argument renaming */
-       for (i = 0; i < maxlocals; i++)
+       argren = DMNEW(int, m->maxlocals);
+       /*int *argren = (int *)alloca(m->maxlocals * sizeof(int));*/ /* table for argument renaming */
+       for (i = 0; i < m->maxlocals; i++)
                argren[i] = i;
        
-       arguments_num = 0;
-       new = stack;
+       m->registerdata->arguments_num = 0;
+       new = m->stack;
        loops = 0;
-       block[0].flags = BBREACHED;
-       block[0].instack = 0;
-       block[0].indepth = 0;
+       m->basicblocks[0].flags = BBREACHED;
+       m->basicblocks[0].instack = 0;
+       m->basicblocks[0].indepth = 0;
 
-       for (i = 0; i < exceptiontablelength; i++) {
-               bptr = &block[block_index[extable[i].handlerpc]];
+       for (i = 0; i < m->exceptiontablelength; i++) {
+               bptr = &m->basicblocks[m->basicblockindex[m->exceptiontable[i].handlerpc]];
                bptr->flags = BBREACHED;
                bptr->type = BBTYPE_EXH;
                bptr->instack = new;
@@ -377,8 +378,8 @@ methodinfo *analyse_stack(methodinfo *m)
        }
 
 #ifdef CONDITIONAL_LOADCONST
-       b_count = block_count;
-       bptr = block;
+       b_count = m->basicblockcount;
+       bptr = m->basicblocks;
        while (--b_count >= 0) {
                if (bptr->icount != 0) {
                        iptr = bptr->iinstr + bptr->icount - 1;
@@ -414,25 +415,25 @@ methodinfo *analyse_stack(methodinfo *m)
                        case ICMD_IF_ACMPNE:
                                bptr[1].pre_count++;
                        case ICMD_GOTO:
-                               block[block_index[iptr->op1]].pre_count++;
+                               m->basicblocks[m->basicblockindex[iptr->op1]].pre_count++;
                                break;
 
                        case ICMD_TABLESWITCH:
                                s4ptr = iptr->val.a;
-                               block[block_index[*s4ptr++]].pre_count++;   /* default */
+                               m->basicblocks[m->basicblockindex[*s4ptr++]].pre_count++;
                                i = *s4ptr++;                               /* low     */
                                i = *s4ptr++ - i + 1;                       /* high    */
                                while (--i >= 0) {
-                                       block[block_index[*s4ptr++]].pre_count++;
+                                       m->basicblocks[m->basicblockindex[*s4ptr++]].pre_count++;
                                }
                                break;
                                        
                        case ICMD_LOOKUPSWITCH:
                                s4ptr = iptr->val.a;
-                               block[block_index[*s4ptr++]].pre_count++;   /* default */
+                               m->basicblocks[m->basicblockindex[*s4ptr++]].pre_count++;
                                i = *s4ptr++;                               /* count   */
                                while (--i >= 0) {
-                                       block[block_index[s4ptr[1]]].pre_count++;
+                                       m->basicblocks[m->basicblockindex[s4ptr[1]]].pre_count++;
                                        s4ptr += 2;
                                }
                                break;
@@ -448,8 +449,8 @@ methodinfo *analyse_stack(methodinfo *m)
 
        do {
                loops++;
-               b_count = block_count;
-               bptr = block;
+               b_count = m->basicblockcount;
+               bptr = m->basicblocks;
                superblockend = true;
                repeat = false;
                STACKRESET;
@@ -469,7 +470,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                        bptr->indepth = stackdepth;
                                }
                                else if (bptr->indepth != stackdepth) {
-                                       show_icmd_method();
+                                       show_icmd_method(m);
                                        panic("Stack depth mismatch");
                                        
                                }
@@ -479,7 +480,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                bptr->flags = BBFINISHED;
                                len = bptr->icount;
                                iptr = bptr->iinstr;
-                               b_index = bptr - block;
+                               b_index = bptr - m->basicblocks;
                                while (--len >= 0)  {
                                        opcode = iptr->opc;
                                        iptr->target = NULL;
@@ -496,7 +497,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                        iptr[0].opc = breplace->icmd;
                                                        iptr[0].op1 = breplace->type_d;
                                                        iptr[0].val.a = breplace->builtin;
-                                                       isleafmethod = false;
+                                                       m->isleafmethod = false;
                                                        switch (breplace->icmd) {
                                                        case ICMD_BUILTIN1:
                                                                goto builtin1;
@@ -512,7 +513,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                        iptr[0].opc = breplace->icmd;
                                                        iptr[0].op1 = breplace->type_d;
                                                        iptr[0].val.a = breplace->builtin;
-                                                       isleafmethod = false;
+                                                       m->isleafmethod = false;
                                                        switch (breplace->icmd) {
                                                        case ICMD_BUILTIN1:
                                                                goto builtin1;
@@ -542,7 +543,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                break;
 
                                        case ICMD_RET:
-                                               locals[iptr->op1][TYPE_ADR].type = TYPE_ADR;
+                                               m->registerdata->locals[iptr->op1][TYPE_ADR].type = TYPE_ADR;
                                        case ICMD_RETURN:
                                                COUNT(count_pcmd_return);
                                                SETDST;
@@ -730,7 +731,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                                len--;
                                                                /* iptr[1].opc = ICMD_NOP; */
                                                                OP1_0(TYPE_INT);
-                                                               tbptr = block + block_index[iptr->op1];
+                                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                                iptr[0].target = (void *) tbptr;
 
@@ -752,6 +753,24 @@ methodinfo *analyse_stack(methodinfo *m)
                                                        case ICMD_IF_ICMPGE:
                                                                iptr[0].opc = ICMD_IFGE;
                                                                goto icmd_if_icmp_tail;
+
+                                                       case ICMD_IASTORE:
+                                                               iptr[0].opc = ICMD_IASTORECONST;
+                                                       icmd_astore_tail:
+                                                               iptr[1].opc = ICMD_NOP;
+                                                               OPTT2_0(TYPE_INT, TYPE_ADR);
+                                                               COUNT(count_pcmd_op);
+                                                               break;
+                                                       case ICMD_BASTORE:
+                                                               iptr[0].opc = ICMD_BASTORECONST;
+                                                               goto icmd_astore_tail;
+                                                       case ICMD_CASTORE:
+                                                               iptr[0].opc = ICMD_CASTORECONST;
+                                                               goto icmd_astore_tail;
+                                                       case ICMD_SASTORE:
+                                                               iptr[0].opc = ICMD_SASTORECONST;
+                                                               goto icmd_astore_tail;
+
                                                        default:
                                                                PUSHCONST(TYPE_INT);
                                                        }
@@ -759,6 +778,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                else
                                                        PUSHCONST(TYPE_INT);
                                                break;
+
                                        case ICMD_LCONST:
                                                COUNT(count_pcmd_load);
                                                if (len > 0) {
@@ -932,7 +952,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                                                /* iptr[1].opc = ICMD_NOP;
                                                                                   iptr[2].opc = ICMD_NOP; */
                                                                                OP1_0(TYPE_LNG);
-                                                                               tbptr = block + block_index[iptr->op1];
+                                                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                                                iptr[0].target = (void *) tbptr;
 
@@ -966,6 +986,14 @@ methodinfo *analyse_stack(methodinfo *m)
                                                                        PUSHCONST(TYPE_LNG);
                                                                break;
 #endif
+
+                                                       case ICMD_LASTORE:
+                                                               iptr[0].opc = ICMD_LASTORECONST;
+                                                               iptr[1].opc = ICMD_NOP;
+                                                               OPTT2_0(TYPE_INT, TYPE_ADR);
+                                                               COUNT(count_pcmd_op);
+                                                               break;
+
                                                        default:
                                                                PUSHCONST(TYPE_LNG);
                                                        }
@@ -973,17 +1001,34 @@ methodinfo *analyse_stack(methodinfo *m)
                                                else
                                                        PUSHCONST(TYPE_LNG);
                                                break;
+
                                        case ICMD_FCONST:
                                                COUNT(count_pcmd_load);
                                                PUSHCONST(TYPE_FLT);
                                                break;
+
                                        case ICMD_DCONST:
                                                COUNT(count_pcmd_load);
                                                PUSHCONST(TYPE_DBL);
                                                break;
+
                                        case ICMD_ACONST:
                                                COUNT(count_pcmd_load);
-                                               PUSHCONST(TYPE_ADR);
+                                               if (len > 0 && iptr->val.a == 0) {
+                                                       if (iptr[1].opc == ICMD_BUILTIN3 &&
+                                                               iptr[1].val.a == BUILTIN_aastore) {
+                                                               iptr[0].opc = ICMD_AASTORECONST;
+                                                               iptr[1].opc = ICMD_NOP;
+                                                               OPTT2_0(TYPE_INT, TYPE_ADR);
+                                                               COUNT(count_pcmd_op);
+
+                                                       } else {
+                                                               PUSHCONST(TYPE_ADR);
+                                                       }
+
+                                               } else {
+                                                       PUSHCONST(TYPE_ADR);
+                                               }
                                                break;
 
                                                /* pop 0 push 1 load */
@@ -996,7 +1041,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                COUNT(count_load_instruction);
                                                i = opcode-ICMD_ILOAD;
                                                iptr->op1 = argren[iptr->op1];
-                                               locals[iptr->op1][i].type = i;
+                                               m->registerdata->locals[iptr->op1][i].type = i;
                                                LOAD(i, LOCALVAR, iptr->op1);
                                                break;
 
@@ -1067,7 +1112,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                REQUIRE_1;
 
                                        i = opcode - ICMD_ISTORE;
-                                       locals[iptr->op1][i].type = i;
+                                       m->registerdata->locals[iptr->op1][i].type = i;
 #ifdef STATISTICS
                                        count_pcmd_store++;
                                        i = new - curstack;
@@ -1174,7 +1219,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                        case ICMD_IFNONNULL:
                                                COUNT(count_pcmd_bra);
                                                OP1_0(TYPE_ADR);
-                                               tbptr = block + block_index[iptr->op1];
+                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                iptr[0].target = (void *) tbptr;
 
@@ -1190,13 +1235,13 @@ methodinfo *analyse_stack(methodinfo *m)
                                                COUNT(count_pcmd_bra);
 #ifdef CONDITIONAL_LOADCONST
                                                {
-                                                       tbptr = block + b_index;
+                                                       tbptr = m->basicblocks + b_index;
                                                        if ((b_count >= 3) &&
-                                                           ((b_index + 2) == block_index[iptr[0].op1]) &&
+                                                           ((b_index + 2) == m->basicblockindex[iptr[0].op1]) &&
                                                            (tbptr[1].pre_count == 1) &&
                                                            (iptr[1].opc == ICMD_ICONST) &&
                                                            (iptr[2].opc == ICMD_GOTO)   &&
-                                                           ((b_index + 3) == block_index[iptr[2].op1]) &&
+                                                           ((b_index + 3) == m->basicblockindex[iptr[2].op1]) &&
                                                            (tbptr[2].pre_count == 1) &&
                                                            (iptr[3].opc == ICMD_ICONST)) {
                                                                OP1_1(TYPE_INT, TYPE_INT);
@@ -1246,7 +1291,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                }
 #endif
                                                OP1_0(TYPE_INT);
-                                               tbptr = block + block_index[iptr->op1];
+                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                iptr[0].target = (void *) tbptr;
 
@@ -1257,7 +1302,7 @@ methodinfo *analyse_stack(methodinfo *m)
 
                                        case ICMD_GOTO:
                                                COUNT(count_pcmd_bra);
-                                               tbptr = block + block_index[iptr->op1];
+                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                iptr[0].target = (void *) tbptr;
 
@@ -1272,7 +1317,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                COUNT(count_pcmd_table);
                                                OP1_0(TYPE_INT);
                                                s4ptr = iptr->val.a;
-                                               tbptr = block + block_index[*s4ptr++]; /* default */
+                                               tbptr = m->basicblocks + m->basicblockindex[*s4ptr++];
                                                MARKREACHED(tbptr, copy);
                                                i = *s4ptr++;                          /* low     */
                                                i = *s4ptr++ - i + 1;                  /* high    */
@@ -1284,7 +1329,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                tptr++;
 
                                                while (--i >= 0) {
-                                                       tbptr = block + block_index[*s4ptr++];
+                                                       tbptr = m->basicblocks + m->basicblockindex[*s4ptr++];
 
                                                        tptr[0] = (void *) tbptr;
                                                        tptr++;
@@ -1304,7 +1349,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                COUNT(count_pcmd_table);
                                                OP1_0(TYPE_INT);
                                                s4ptr = iptr->val.a;
-                                               tbptr = block + block_index[*s4ptr++]; /* default */
+                                               tbptr = m->basicblocks + m->basicblockindex[*s4ptr++];
                                                MARKREACHED(tbptr, copy);
                                                i = *s4ptr++;                          /* count   */
 
@@ -1315,7 +1360,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                tptr++;
 
                                                while (--i >= 0) {
-                                                       tbptr = block + block_index[s4ptr[1]];
+                                                       tbptr = m->basicblocks + m->basicblockindex[s4ptr[1]];
 
                                                        tptr[0] = (void *) tbptr;
                                                        tptr++;
@@ -1344,7 +1389,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                        case ICMD_IF_ICMPLE:
                                                COUNT(count_pcmd_bra);
                                                OP2_0(TYPE_INT);
-                                               tbptr = block + block_index[iptr->op1];
+                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
                                                        
                                                iptr[0].target = (void *) tbptr;
 
@@ -1355,7 +1400,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                        case ICMD_IF_ACMPNE:
                                                COUNT(count_pcmd_bra);
                                                OP2_0(TYPE_ADR);
-                                               tbptr = block + block_index[iptr->op1];
+                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                iptr[0].target = (void *) tbptr;
 
@@ -1573,7 +1618,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                iptr[0].opc = ICMD_BUILTIN2;
                                                iptr[0].op1 = TYPE_INT;
                                                iptr[0].val.a = BUILTIN_idiv;
-                                               isleafmethod = false;
+                                               m->isleafmethod = false;
                                                goto builtin2;
 #endif
 
@@ -1582,7 +1627,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                iptr[0].opc = ICMD_BUILTIN2;
                                                iptr[0].op1 = TYPE_INT;
                                                iptr[0].val.a = BUILTIN_irem;
-                                               isleafmethod = false;
+                                               m->isleafmethod = false;
                                                goto builtin2;
 #endif
 #if defined(__I386__)
@@ -1611,7 +1656,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                iptr[0].opc = ICMD_BUILTIN2;
                                                iptr[0].op1 = TYPE_LNG;
                                                iptr[0].val.a = BUILTIN_ldiv;
-                                               isleafmethod = false;
+                                               m->isleafmethod = false;
                                                goto builtin2;
 #endif
 
@@ -1620,7 +1665,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                iptr[0].opc = ICMD_BUILTIN2;
                                                iptr[0].op1 = TYPE_LNG;
                                                iptr[0].val.a = BUILTIN_lrem;
-                                               isleafmethod = false;
+                                               m->isleafmethod = false;
                                                goto builtin2;
 #endif
 
@@ -1684,7 +1729,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                                bptr->icount--;
                                                                /* iptr[1].opc = ICMD_NOP; */
                                                                OP2_0(TYPE_LNG);
-                                                               tbptr = block + block_index[iptr->op1];
+                                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
                        
                                                                iptr[0].target = (void *) tbptr;
 
@@ -1855,7 +1900,7 @@ methodinfo *analyse_stack(methodinfo *m)
 
                                        case ICMD_JSR:
                                                OP0_1(TYPE_ADR);
-                                               tbptr = block + block_index[iptr->op1];
+                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                iptr[0].target = (void *) tbptr;
 
@@ -1885,12 +1930,12 @@ methodinfo *analyse_stack(methodinfo *m)
                                                method_uses_ecx = true;
 #endif
                                                {
-                                                       methodinfo *m = iptr->val.a;
-                                                       if (m->flags & ACC_STATIC)
+                                                       methodinfo *lm = iptr->val.a;
+                                                       if (lm->flags & ACC_STATIC)
                                                                {COUNT(count_check_null);}
                                                        i = iptr->op1;
-                                                       if (i > arguments_num)
-                                                               arguments_num = i;
+                                                       if (i > m->registerdata->arguments_num)
+                                                               m->registerdata->arguments_num = i;
                                                        REQUIRE(i);
 #if defined(__X86_64__)
                                                        {
@@ -1947,8 +1992,8 @@ methodinfo *analyse_stack(methodinfo *m)
                                                        }
                                                        i = iptr->op1;
                                                        POPMANY(i);
-                                                       if (m->returntype != TYPE_VOID) {
-                                                               OP0_1(m->returntype);
+                                                       if (lm->returntype != TYPE_VOID) {
+                                                               OP0_1(lm->returntype);
                                                        }
                                                        break;
                                                }
@@ -1960,8 +2005,8 @@ methodinfo *analyse_stack(methodinfo *m)
                                                        curstack->varkind = ARGVAR;
                                                        curstack->varnum = 2;
                                                }
-                                               if (3 > arguments_num) {
-                                                       arguments_num = 3;
+                                               if (3 > m->registerdata->arguments_num) {
+                                                       m->registerdata->arguments_num = 3;
                                                }
                                                OP1_0ANY;
 
@@ -1973,8 +2018,8 @@ methodinfo *analyse_stack(methodinfo *m)
                                                curstack->varkind = ARGVAR;
                                                curstack->varnum = 1;
                                        }
-                                       if (2 > arguments_num) {
-                                               arguments_num = 2;
+                                       if (2 > m->registerdata->arguments_num) {
+                                               m->registerdata->arguments_num = 2;
                                        }
                                        OP1_0ANY;
 
@@ -1986,8 +2031,8 @@ methodinfo *analyse_stack(methodinfo *m)
                                                curstack->varkind = ARGVAR;
                                                curstack->varnum = 0;
                                        }
-                                       if (1 > arguments_num) {
-                                               arguments_num = 1;
+                                       if (1 > m->registerdata->arguments_num) {
+                                               m->registerdata->arguments_num = 1;
                                        }
                                        OP1_0ANY;
                                        copy = curstack;
@@ -2002,14 +2047,14 @@ methodinfo *analyse_stack(methodinfo *m)
                                        case ICMD_MULTIANEWARRAY:
                                                i = iptr->op1;
                                                REQUIRE(i);
-                                               if ((i + intreg_argnum) > arguments_num)
-                                                       arguments_num = i + intreg_argnum;
+                                               if ((i + m->registerdata->intreg_argnum) > m->registerdata->arguments_num)
+                                                       m->registerdata->arguments_num = i + m->registerdata->intreg_argnum;
                                                copy = curstack;
                                                while (--i >= 0) {
                                                        /* check INT type here? Currently typecheck does this. */
                                                        if (! (copy->flags & SAVEDVAR)) {
                                                                copy->varkind = ARGVAR;
-                                                               copy->varnum = i + intreg_argnum;
+                                                               copy->varnum = i + m->registerdata->intreg_argnum;
                                                        }
                                                        copy = copy->prev;
                                                }
@@ -2023,7 +2068,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                break;
 
                                        case ICMD_CLEAR_ARGREN:
-                                               for (i = iptr->op1; i<maxlocals; i++) 
+                                               for (i = iptr->op1; i<m->maxlocals; i++) 
                                                        argren[i] = i;
                                                iptr->opc = opcode = ICMD_NOP;
                                                SETDST;
@@ -2047,7 +2092,7 @@ methodinfo *analyse_stack(methodinfo *m)
                                                break;
 
                                        default:
-                                               printf("ICMD %d at %d\n", iptr->opc, (int)(iptr-instr));
+                                               printf("ICMD %d at %d\n", iptr->opc, (s4) (iptr - m->instructions));
                                                panic("Missing ICMD code during stack analysis");
                                        } /* switch */
 
@@ -2067,19 +2112,19 @@ methodinfo *analyse_stack(methodinfo *m)
        } while (repeat && !deadcode);
 
 #ifdef STATISTICS
-       if (block_count > count_max_basic_blocks)
-               count_max_basic_blocks = block_count;
-       count_basic_blocks += block_count;
-       if (instr_count > count_max_javainstr)
-               count_max_javainstr = instr_count;
-       count_javainstr += instr_count;
-       if (stack_count > count_upper_bound_new_stack)
-               count_upper_bound_new_stack = stack_count;
-       if ((new - stack) > count_max_new_stack)
-               count_max_new_stack = (new - stack);
-
-       b_count = block_count;
-       bptr = block;
+       if (m->basicblockcount > count_max_basic_blocks)
+               count_max_basic_blocks = m->basicblockcount;
+       count_basic_blocks += m->basicblockcount;
+       if (m->instructioncount > count_max_javainstr)
+               count_max_javainstr = m->instructioncount;
+       count_javainstr += m->instructioncount;
+       if (m->stackcount > count_upper_bound_new_stack)
+               count_upper_bound_new_stack = m->stackcount;
+       if ((new - m->stack) > count_max_new_stack)
+               count_max_new_stack = (new - m->stack);
+
+       b_count = m->basicblockcount;
+       bptr = m->basicblocks;
        while (--b_count >= 0) {
                if (bptr->flags > BBREACHED) {
                        if (bptr->indepth >= 10)
@@ -2120,21 +2165,21 @@ methodinfo *analyse_stack(methodinfo *m)
        else
                count_analyse_iterations[4]++;
 
-       if (block_count <= 5)
+       if (m->basicblockcount <= 5)
                count_method_bb_distribution[0]++;
-       else if (block_count <= 10)
+       else if (m->basicblockcount <= 10)
                count_method_bb_distribution[1]++;
-       else if (block_count <= 15)
+       else if (m->basicblockcount <= 15)
                count_method_bb_distribution[2]++;
-       else if (block_count <= 20)
+       else if (m->basicblockcount <= 20)
                count_method_bb_distribution[3]++;
-       else if (block_count <= 30)
+       else if (m->basicblockcount <= 30)
                count_method_bb_distribution[4]++;
-       else if (block_count <= 40)
+       else if (m->basicblockcount <= 40)
                count_method_bb_distribution[5]++;
-       else if (block_count <= 50)
+       else if (m->basicblockcount <= 50)
                count_method_bb_distribution[6]++;
-       else if (block_count <= 75)
+       else if (m->basicblockcount <= 75)
                count_method_bb_distribution[7]++;
        else
                count_method_bb_distribution[8]++;
@@ -2150,19 +2195,19 @@ methodinfo *analyse_stack(methodinfo *m)
 /* DEBUGGING HELPERS                                                  */
 /**********************************************************************/
 
-void icmd_print_stack(stackptr s)
+void icmd_print_stack(methodinfo *m, stackptr s)
 {
        int i, j;
        stackptr t;
 
-       i = maxstack;
+       i = m->maxstack;
        t = s;
        
        while (t) {
                i--;
                t = t->prev;
        }
-       j = maxstack - i;
+       j = m->maxstack - i;
        while (--i >= 0)
                printf("    ");
        while (s) {
@@ -2172,11 +2217,11 @@ void icmd_print_stack(stackptr s)
                        switch (s->varkind) {
                        case TEMPVAR:
                                if (s->flags & INMEMORY)
-                                       printf((regs_ok) ? " M%02d" : " M??", s->regoff);
+                                       printf(" M%02d", s->regoff);
                                else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL))
-                                       printf((regs_ok) ? " F%02d" : " F??", s->regoff);
+                                       printf(" F%02d", s->regoff);
                                else {
-                                       if (regs_ok) printf(" %3s",regs[s->regoff]); else printf(" ???");
+                                       printf(" %3s", regs[s->regoff]);
                                }
                                break;
                        case STACKVAR:
@@ -2195,11 +2240,11 @@ void icmd_print_stack(stackptr s)
                        switch (s->varkind) {
                        case TEMPVAR:
                                if (s->flags & INMEMORY)
-                                       printf((regs_ok) ? " m%02d" : " m??", s->regoff);
+                                       printf(" m%02d", s->regoff);
                                else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL))
-                                       printf((regs_ok) ? " f%02d" : " f??", s->regoff);
+                                       printf(" f%02d", s->regoff);
                                else {
-                                       if (regs_ok) printf(" %3s",regs[s->regoff]); else printf(" ???");
+                                       printf(" %3s", regs[s->regoff]);
                                }
                                break;
                        case STACKVAR:
@@ -2288,41 +2333,41 @@ static char *jit_type[] = {
 };
 
 
-void show_icmd_method()
+void show_icmd_method(methodinfo *m)
 {
        int i, j;
        basicblock *bptr;
-       xtable *ex;
+       exceptiontable *ex;
 
        printf("\n");
-       utf_fprint_classname(stdout, class->name);
+       utf_fprint_classname(stdout, m->class->name);
        printf(".");
-       utf_fprint(stdout, method->name);
-       utf_fprint_classname(stdout, method->descriptor);
-       printf ("\n\nMax locals: %d\n", (int) maxlocals);
-       printf ("Max stack:  %d\n", (int) maxstack);
+       utf_fprint(stdout, m->name);
+       utf_fprint_classname(stdout, m->descriptor);
+       printf ("\n\nMax locals: %d\n", (int) m->maxlocals);
+       printf ("Max stack:  %d\n", (int) m->maxstack);
 
-       printf ("Line number table length: %d\n",method->linenumbercount);
+       printf ("Line number table length: %d\n", m->linenumbercount);
 
-       printf ("Exceptions (Number: %d):\n", exceptiontablelength);
-       for (ex = extable; ex != NULL; ex = ex->down) {
+       printf ("Exceptions (Number: %d):\n", m->exceptiontablelength);
+       for (ex = m->exceptiontable; ex != NULL; ex = ex->down) {
                printf("    L%03d ... ", ex->start->debug_nr );
                printf("L%03d  = ", ex->end->debug_nr);
                printf("L%03d\n", ex->handler->debug_nr);
        }
        
        printf ("Local Table:\n");
-       for (i = 0; i < maxlocals; i++) {
+       for (i = 0; i < m->maxlocals; i++) {
                printf("   %3d: ", i);
                for (j = TYPE_INT; j <= TYPE_ADR; j++)
-                       if (locals[i][j].type >= 0) {
+                       if (m->registerdata->locals[i][j].type >= 0) {
                                printf("   (%s) ", jit_type[j]);
-                               if (locals[i][j].flags & INMEMORY)
-                                       printf((regs_ok) ? "m%2d" : "m??", locals[i][j].regoff);
+                               if (m->registerdata->locals[i][j].flags & INMEMORY)
+                                       printf("m%2d", m->registerdata->locals[i][j].regoff);
                                else if ((j == TYPE_FLT) || (j == TYPE_DBL))
-                                       printf((regs_ok) ? "f%02d" : "f??", locals[i][j].regoff);
+                                       printf("f%02d", m->registerdata->locals[i][j].regoff);
                                else {
-                                       if (regs_ok) printf("%3s",regs[locals[i][j].regoff]); else printf("???");
+                                       printf("%3s", regs[m->registerdata->locals[i][j].regoff]);
                                }
                        }
                printf("\n");
@@ -2330,30 +2375,32 @@ void show_icmd_method()
        printf("\n");
 
        printf ("Interface Table:\n");
-       for (i = 0; i < maxstack; i++) {
-               if ((interfaces[i][0].type >= 0) || (interfaces[i][1].type >= 0) ||
-                   (interfaces[i][2].type >= 0) || (interfaces[i][3].type >= 0) ||
-                   (interfaces[i][4].type >= 0)) {
+       for (i = 0; i < m->maxstack; i++) {
+               if ((m->registerdata->interfaces[i][0].type >= 0) ||
+                       (m->registerdata->interfaces[i][1].type >= 0) ||
+                   (m->registerdata->interfaces[i][2].type >= 0) ||
+                       (m->registerdata->interfaces[i][3].type >= 0) ||
+                   (m->registerdata->interfaces[i][4].type >= 0)) {
                        printf("   %3d: ", i);
                        for (j = TYPE_INT; j <= TYPE_ADR; j++)
-                               if (interfaces[i][j].type >= 0) {
+                               if (m->registerdata->interfaces[i][j].type >= 0) {
                                        printf("   (%s) ", jit_type[j]);
-                                       if (interfaces[i][j].flags & SAVEDVAR) {
-                                               if (interfaces[i][j].flags & INMEMORY)
-                                                       printf((regs_ok) ? "M%2d" : "M??", interfaces[i][j].regoff);
+                                       if (m->registerdata->interfaces[i][j].flags & SAVEDVAR) {
+                                               if (m->registerdata->interfaces[i][j].flags & INMEMORY)
+                                                       printf("M%2d", m->registerdata->interfaces[i][j].regoff);
                                                else if ((j == TYPE_FLT) || (j == TYPE_DBL))
-                                                       printf((regs_ok) ? "F%02d" : "F??", interfaces[i][j].regoff);
+                                                       printf("F%02d", m->registerdata->interfaces[i][j].regoff);
                                                else {
-                                                       if (regs_ok) printf("%3s",regs[interfaces[i][j].regoff]); else printf("???");
+                                                       printf("%3s", regs[m->registerdata->interfaces[i][j].regoff]);
                                                }
                                        }
                                        else {
-                                               if (interfaces[i][j].flags & INMEMORY)
-                                                       printf((regs_ok) ? "m%2d" : "m??", interfaces[i][j].regoff);
+                                               if (m->registerdata->interfaces[i][j].flags & INMEMORY)
+                                                       printf("m%2d", m->registerdata->interfaces[i][j].regoff);
                                                else if ((j == TYPE_FLT) || (j == TYPE_DBL))
-                                                       printf((regs_ok) ? "f%02d" : "f??", interfaces[i][j].regoff);
+                                                       printf("f%02d", m->registerdata->interfaces[i][j].regoff);
                                                else {
-                                                       if (regs_ok) printf("%3s",regs[interfaces[i][j].regoff]); else printf("???");
+                                                       printf("%3s", regs[m->registerdata->interfaces[i][j].regoff]);
                                                }
                                        }
                                }
@@ -2367,8 +2414,8 @@ void show_icmd_method()
                u1 *u1ptr;
                int a;
 
-               u1ptr = method->mcode + dseglen;
-               for (i = 0; i < block[0].mpc; i++, u1ptr++) {
+               u1ptr = m->mcode + dseglen;
+               for (i = 0; i < m->basicblocks[0].mpc; i++, u1ptr++) {
                        a = disassinstr(u1ptr, i);
                        i += a;
                        u1ptr += a;
@@ -2377,21 +2424,21 @@ void show_icmd_method()
 #else
                s4 *s4ptr;
 
-               s4ptr = (s4 *) (method->mcode + dseglen);
-               for (i = 0; i < block[0].mpc; i += 4, s4ptr++) {
+               s4ptr = (s4 *) (m->mcode + dseglen);
+               for (i = 0; i < m->basicblocks[0].mpc; i += 4, s4ptr++) {
                        disassinstr(s4ptr, i); 
                }
                printf("\n");
 #endif
        }
        
-       for (bptr = block; bptr != NULL; bptr = bptr->next) {
-               show_icmd_block(bptr);
+       for (bptr = m->basicblocks; bptr != NULL; bptr = bptr->next) {
+               show_icmd_block(m, bptr);
        }
 }
 
 
-void show_icmd_block(basicblock *bptr)
+void show_icmd_block(methodinfo *m, basicblock *bptr)
 {
        int i, j;
        int deadcode;
@@ -2401,24 +2448,23 @@ void show_icmd_block(basicblock *bptr)
                deadcode = bptr->flags <= BBREACHED;
                printf("[");
                if (deadcode)
-                       for (j = method->maxstack; j > 0; j--)
+                       for (j = m->maxstack; j > 0; j--)
                                printf(" ?  ");
                else
-                       icmd_print_stack(bptr->instack);
+                       icmd_print_stack(m, bptr->instack);
                printf("] L%03d(%d - %d) flags=%d:\n", bptr->debug_nr, bptr->icount, bptr->pre_count,bptr->flags);
                iptr = bptr->iinstr;
 
-               for (i=0; i < bptr->icount; i++, iptr++) {
+               for (i = 0; i < bptr->icount; i++, iptr++) {
                        printf("[");
                        if (deadcode) {
-                               for (j = method->maxstack; j > 0; j--)
+                               for (j = m->maxstack; j > 0; j--)
                                        printf(" ?  ");
                        }
                        else
-                               icmd_print_stack(iptr->dst);
+                               icmd_print_stack(m, iptr->dst);
                        printf("]     %4d  ", i);
-                       /* DEBUG */ /*fflush(stdout);*/
-                       show_icmd(iptr,deadcode);
+                       show_icmd(iptr, deadcode);
                        printf("\n");
                }
 
@@ -2429,7 +2475,7 @@ void show_icmd_block(basicblock *bptr)
 
                        printf("\n");
                        i = bptr->mpc;
-                       u1ptr = method->mcode + dseglen + i;
+                       u1ptr = m->mcode + dseglen + i;
 
                        if (bptr->next != NULL) {
                                for (; i < bptr->next->mpc; i++, u1ptr++) {
@@ -2440,7 +2486,7 @@ void show_icmd_block(basicblock *bptr)
                                printf("\n");
 
                        } else {
-                               for (; u1ptr < (u1 *) (method->mcode + method->mcodelength); i++, u1ptr++) {
+                               for (; u1ptr < (u1 *) (m->mcode + m->mcodelength); i++, u1ptr++) {
                                        a = disassinstr(u1ptr, i); 
                                        i += a;
                                        u1ptr += a;
@@ -2452,7 +2498,7 @@ void show_icmd_block(basicblock *bptr)
 
                        printf("\n");
                        i = bptr->mpc;
-                       s4ptr = (s4 *) (method->mcode + dseglen + i);
+                       s4ptr = (s4 *) (m->mcode + dseglen + i);
 
                        if (bptr->next != NULL) {
                                for (; i < bptr->next->mpc; i += 4, s4ptr++) {
@@ -2461,7 +2507,7 @@ void show_icmd_block(basicblock *bptr)
                                printf("\n");
 
                        } else {
-                               for (; s4ptr < (s4 *) (method->mcode + method->mcodelength); i += 4, s4ptr++) {
+                               for (; s4ptr < (s4 *) (m->mcode + m->mcodelength); i += 4, s4ptr++) {
                                        disassinstr(s4ptr, i); 
                                }
                                printf("\n");
@@ -2472,7 +2518,7 @@ void show_icmd_block(basicblock *bptr)
 }
 
 
-void show_icmd(instruction *iptr,bool deadcode)
+void show_icmd(instruction *iptr, bool deadcode)
 {
        int j;
        s4  *s4ptr;
@@ -2504,6 +2550,10 @@ void show_icmd(instruction *iptr,bool deadcode)
        case ICMD_IFGE_ICONST:
        case ICMD_IFGT_ICONST:
        case ICMD_IFLE_ICONST:
+       case ICMD_IASTORECONST:
+       case ICMD_BASTORECONST:
+       case ICMD_CASTORECONST:
+       case ICMD_SASTORECONST:
                printf(" %d", iptr->val.i);
                break;
 
@@ -2516,6 +2566,7 @@ void show_icmd(instruction *iptr,bool deadcode)
        case ICMD_LORCONST:
        case ICMD_LXORCONST:
        case ICMD_LCONST:
+       case ICMD_LASTORECONST:
 #if defined(__I386__)
                printf(" %lld", iptr->val.l);
 #else
@@ -2532,6 +2583,7 @@ void show_icmd(instruction *iptr,bool deadcode)
                break;
 
        case ICMD_ACONST:
+       case ICMD_AASTORECONST:
                printf(" %p", iptr->val.a);
                break;