Global compiler variables changes.
[cacao.git] / src / vm / jit / stack.c
index 470ea8bf792f000dafc696b781a4dd86d8209bd8..bfcbc5d8cba3b86f8eabbdcfc643c957a5a9cb86 100644 (file)
 
    Changes: Edwin Steiner
 
-   $Id: stack.c 846 2004-01-05 10:40:42Z twisti $
+   $Id: stack.c 1283 2004-07-07 15:55:24Z twisti $
 
 */
 
 
 #include <stdio.h>
 #include <string.h>
-#include "stack.h"
 #include "global.h"
-#include "main.h"
-#include "jit.h"
+#include "native.h"
 #include "builtin.h"
 #include "disass.h"
-#include "reg.h"
 #include "tables.h"
 #include "types.h"
-#include "toolbox/loging.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"
 
 
@@ -69,34 +71,63 @@ extern int dseglen;
 /* SIGNALING ERRORS                                 */
 /*--------------------------------------------------*/
 
-#define TYPEPANIC  {show_icmd_method();panic("Stack type mismatch");}
-#define UNDERFLOW  {show_icmd_method();panic("Operand stack underflow");}
-#define OVERFLOW   {show_icmd_method();panic("Operand stack overflow");}
+#define TYPEPANIC  {panic("Stack type mismatch");}
+
 
 /*--------------------------------------------------*/
 /* STACK UNDERFLOW/OVERFLOW CHECKS                  */
 /*--------------------------------------------------*/
 
 /* underflow checks */
-#define REQUIRE(num)  do { if (stackdepth<(num)) {UNDERFLOW;} } while(0)
+
+#define REQUIRE(num) \
+    do { \
+        if (stackdepth < (num)) { \
+            sprintf(msg, "(class: "); \
+            utf_sprint(msg + strlen(msg), m->class->name); \
+            sprintf(msg + strlen(msg), ", method: "); \
+            utf_sprint(msg + strlen(msg), m->name); \
+            sprintf(msg + strlen(msg), ", signature: "); \
+            utf_sprint(msg + strlen(msg), m->descriptor); \
+            sprintf(msg + strlen(msg), ") Unable to pop operand off an empty stack"); \
+            *exceptionptr = \
+                new_exception_message(string_java_lang_VerifyError, msg); \
+            return NULL; \
+        } \
+    } while(0)
+
 #define REQUIRE_1     REQUIRE(1)
 #define REQUIRE_2     REQUIRE(2)
 #define REQUIRE_3     REQUIRE(3)
 #define REQUIRE_4     REQUIRE(4)
 
+
 /* overflow check */
-/* XXX we allow ACONST to exceed the maximum stack depth because it is
- * generated for builtin calls. Maybe we should check against maximum
- * stack depth only at block boundaries?
+/* We allow ACONST instructions inserted as arguments to builtin
+ * functions to exceed the maximum stack depth.  Maybe we should check
+ * against maximum stack depth only at block boundaries?
  */
-#define CHECKOVERFLOW                                                  \
-       do {                                                                            \
-               if (stackdepth > maxstack) {                    \
-                       if (iptr[0].opc != ICMD_ACONST)         \
-                       {OVERFLOW;}                                                     \
-               }                                                                               \
+
+#define CHECKOVERFLOW \
+       do { \
+               if (stackdepth > m->maxstack) { \
+                       if (iptr[0].opc != ICMD_ACONST \
+                || iptr[0].op1 == 0) { \
+                sprintf(msg, "(class: "); \
+                utf_sprint_classname(msg + strlen(msg), m->class->name); \
+                sprintf(msg + strlen(msg), ", method: "); \
+                utf_sprint(msg + strlen(msg), m->name); \
+                sprintf(msg + strlen(msg), ", signature: "); \
+                utf_sprint(msg + strlen(msg), m->descriptor); \
+                sprintf(msg + strlen(msg), ") Stack size too large"); \
+                *exceptionptr = \
+                    new_exception_message(string_java_lang_VerifyError, msg); \
+                return NULL; \
+            } \
+               } \
        } while(0)
 
+
 /*--------------------------------------------------*/
 /* ALLOCATING STACK SLOTS                           */
 /*--------------------------------------------------*/
@@ -109,6 +140,7 @@ extern int dseglen;
 /* allocate the input stack for an exception handler */
 #define NEWXSTACK   {NEWSTACK(TYPE_ADR,STACKVAR,0);curstack=0;}
 
+
 /*--------------------------------------------------*/
 /* STACK MANIPULATION                               */
 /*--------------------------------------------------*/
@@ -128,6 +160,7 @@ extern int dseglen;
 #define COPY(s,d)   {(d)->flags=0;(d)->type=(s)->type;\
                      (d)->varkind=(s)->varkind;(d)->varnum=(s)->varnum;}
 
+
 /*--------------------------------------------------*/
 /* STACK OPERATIONS MODELING                        */
 /*--------------------------------------------------*/
@@ -189,6 +222,7 @@ extern int dseglen;
                     new[4].prev=new+3;new[5].prev=new+4;\
                     curstack=new+5;new+=6;SETDST;stackdepth+=2;}
 
+
 /*--------------------------------------------------*/
 /* MACROS FOR HANDLING BASIC BLOCKS                 */
 /*--------------------------------------------------*/
@@ -228,30 +262,30 @@ extern int dseglen;
  * instruction of the block has been processed).
  */
 
-#define BBEND(s,i){\
-       i=stackdepth-1;\
-       copy=s;\
-       while(copy){\
-               if((copy->varkind==STACKVAR)&&(copy->varnum>i))\
-                       copy->varkind=TEMPVAR;\
-               else {\
-                       copy->varkind=STACKVAR;\
-                       copy->varnum=i;\
-                       }\
-               interfaces[i][copy->type].type = copy->type;\
-               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;\
-               if(copy->varkind==STACKVAR){\
-                       if (copy->flags & SAVEDVAR)\
-                               interfaces[i][copy->type].flags |= SAVEDVAR;\
-                       }\
-               i--;copy=copy->prev;\
-               }\
+#define BBEND(s,i){ \
+       i = stackdepth - 1; \
+       copy = s; \
+       while (copy) { \
+               if ((copy->varkind == STACKVAR) && (copy->varnum > i)) \
+                       copy->varkind = TEMPVAR; \
+               else { \
+                       copy->varkind = STACKVAR; \
+                       copy->varnum = i;\
+               \
+               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) { \
+               m->registerdata->interfaces[i][copy->type].type = copy->type; \
+               if (copy->varkind == STACKVAR) { \
+                       if (copy->flags & SAVEDVAR) \
+                               m->registerdata->interfaces[i][copy->type].flags |= SAVEDVAR; \
+               \
+               i--; copy = copy->prev; \
+       \
 }
 
 
@@ -268,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;                                                                            \
@@ -290,9 +324,9 @@ extern int dseglen;
  *   - check for matching stack depth at merging points
  *   - check for matching basic types[2] at merging points
  *   - check basic types for instruction input (except for BUILTIN*
- *         opcodes and MULTIANEWARRAY)
+ *         opcodes, INVOKE* opcodes and MULTIANEWARRAY)
  *
- * [1]) XXX Checking this after the instruction should be ok. parse.c
+ * [1]) Checking this after the instruction should be ok. parse.c
  * counts the number of required stack slots in such a way that it is
  * only vital that we don't exceed `maxstack` at basic block
  * boundaries.
@@ -302,7 +336,7 @@ extern int dseglen;
  * types are not discerned.
  */
 
-void analyse_stack()
+methodinfo *analyse_stack(methodinfo *m)
 {
        int b_count;
        int b_index;
@@ -318,31 +352,22 @@ void analyse_stack()
        s4 *s4ptr;
        void* *tptr;
        int *argren;
+       char msg[MAXLOGTEXT];               /* maybe we get an exception          */
 
-       if (compileverbose) {
-               char logtext[MAXLOGTEXT];
-               sprintf(logtext, "Analysing: ");
-               utf_sprint(logtext+strlen(logtext), method->class->name);
-               strcpy(logtext+strlen(logtext), ".");
-               utf_sprint(logtext+strlen(logtext), method->name);
-               utf_sprint(logtext+strlen(logtext), method->descriptor);
-               log_text(logtext);
-       }
-
-       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;
@@ -353,8 +378,8 @@ void analyse_stack()
        }
 
 #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;
@@ -390,25 +415,25 @@ void analyse_stack()
                        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;
@@ -424,8 +449,8 @@ void analyse_stack()
 
        do {
                loops++;
-               b_count = block_count;
-               bptr = block;
+               b_count = m->basicblockcount;
+               bptr = m->basicblocks;
                superblockend = true;
                repeat = false;
                STACKRESET;
@@ -445,7 +470,7 @@ void analyse_stack()
                                        bptr->indepth = stackdepth;
                                }
                                else if (bptr->indepth != stackdepth) {
-                                       show_icmd_method();
+                                       show_icmd_method(m);
                                        panic("Stack depth mismatch");
                                        
                                }
@@ -455,12 +480,12 @@ void analyse_stack()
                                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;
 
-                                       /* DEBUG XXX */ /*  dolog("p:%04d op: %s",iptr-instr,icmd_names[opcode]); */
+/*                                     dolog("p: %04d op: %s stack: %p", iptr - instr, icmd_names[opcode], curstack); */
 
 #ifdef USEBUILTINTABLE
                                        {
@@ -472,7 +497,7 @@ void analyse_stack()
                                                        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;
@@ -488,7 +513,7 @@ void analyse_stack()
                                                        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;
@@ -505,6 +530,7 @@ void analyse_stack()
 
                                        case ICMD_NOP:
                                        case ICMD_CHECKASIZE:
+                                       case ICMD_CHECKEXCEPTION:
 
                                        case ICMD_IFEQ_ICONST:
                                        case ICMD_IFNE_ICONST:
@@ -517,7 +543,7 @@ void analyse_stack()
                                                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;
@@ -613,12 +639,6 @@ void analyse_stack()
                                                                iptr[0].opc = ICMD_IDIVPOW2;
                                                                goto icmd_iconst_tail;
                                                        case ICMD_IREM:
-#if !defined(NO_DIV_OPT)
-                                                               if (iptr[0].val.i == 0x10001) {
-                                                                       iptr[0].opc = ICMD_IREM0X10001;
-                                                                       goto icmd_iconst_tail;
-                                                               }
-#endif
                                                                if ((iptr[0].val.i == 0x00000002) ||
                                                                        (iptr[0].val.i == 0x00000004) ||
                                                                        (iptr[0].val.i == 0x00000008) ||
@@ -652,6 +672,9 @@ void analyse_stack()
                                                                        (iptr[0].val.i == 0x80000000)) {
                                                                        iptr[0].opc = ICMD_IREMPOW2;
                                                                        iptr[0].val.i -= 1;
+#if defined(__I386__)
+                                                                       method_uses_ecx = true;
+#endif
                                                                        goto icmd_iconst_tail;
                                                                }
                                                                PUSHCONST(TYPE_INT);
@@ -677,12 +700,21 @@ void analyse_stack()
 #if SUPPORT_LONG_SHIFT
                                                        case ICMD_LSHL:
                                                                iptr[0].opc = ICMD_LSHLCONST;
+#if defined(__I386__)
+                                                               method_uses_ecx = true;
+#endif
                                                                goto icmd_lconst_tail;
                                                        case ICMD_LSHR:
                                                                iptr[0].opc = ICMD_LSHRCONST;
+#if defined(__I386__)
+                                                               method_uses_ecx = true;
+#endif
                                                                goto icmd_lconst_tail;
                                                        case ICMD_LUSHR:
                                                                iptr[0].opc = ICMD_LUSHRCONST;
+#if defined(__I386__)
+                                                               method_uses_ecx = true;
+#endif
                                                                goto icmd_lconst_tail;
 #endif
                                                        case ICMD_IF_ICMPEQ:
@@ -693,7 +725,7 @@ void analyse_stack()
                                                                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;
 
@@ -715,6 +747,40 @@ void analyse_stack()
                                                        case ICMD_IF_ICMPGE:
                                                                iptr[0].opc = ICMD_IFGE;
                                                                goto icmd_if_icmp_tail;
+
+#if SUPPORT_CONST_ASTORE
+                                                       case ICMD_IASTORE:
+                                                       case ICMD_BASTORE:
+                                                       case ICMD_CASTORE:
+                                                       case ICMD_SASTORE:
+#if SUPPORT_ONLY_ZERO_ASTORE
+                                                               if (iptr[0].val.i == 0) {
+#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+                                                                       switch (iptr[1].opc) {
+                                                                       case ICMD_IASTORE:
+                                                                               iptr[0].opc = ICMD_IASTORECONST;
+                                                                               break;
+                                                                       case ICMD_BASTORE:
+                                                                               iptr[0].opc = ICMD_BASTORECONST;
+                                                                               break;
+                                                                       case ICMD_CASTORE:
+                                                                               iptr[0].opc = ICMD_CASTORECONST;
+                                                                               break;
+                                                                       case ICMD_SASTORE:
+                                                                               iptr[0].opc = ICMD_SASTORECONST;
+                                                                               break;
+                                                                       }
+
+                                                                       iptr[1].opc = ICMD_NOP;
+                                                                       OPTT2_0(TYPE_INT, TYPE_ADR);
+                                                                       COUNT(count_pcmd_op);
+#if SUPPORT_ONLY_ZERO_ASTORE
+                                                               } else
+#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+                                                                       PUSHCONST(TYPE_INT);
+                                                               break;
+#endif /* SUPPORT_CONST_ASTORE */
+
                                                        default:
                                                                PUSHCONST(TYPE_INT);
                                                        }
@@ -722,6 +788,7 @@ void analyse_stack()
                                                else
                                                        PUSHCONST(TYPE_INT);
                                                break;
+
                                        case ICMD_LCONST:
                                                COUNT(count_pcmd_load);
                                                if (len > 0) {
@@ -742,6 +809,7 @@ void analyse_stack()
                                                        case ICMD_LMUL:
                                                                iptr[0].opc = ICMD_LMULCONST;
 #if defined(__I386__)
+                                                               method_uses_ecx = true;
                                                                method_uses_edx = true;
 #endif
                                                                goto icmd_lconst_tail;
@@ -815,14 +883,11 @@ void analyse_stack()
                                                                        break;
                                                                }
                                                                iptr[0].opc = ICMD_LDIVPOW2;
+#if defined(__I386__)
+                                                               method_uses_ecx = true;
+#endif
                                                                goto icmd_lconst_tail;
                                                        case ICMD_LREM:
-#if !defined(NO_DIV_OPT)
-                                                               if (iptr[0].val.l == 0x10001) {
-                                                                       iptr[0].opc = ICMD_LREM0X10001;
-                                                                       goto icmd_lconst_tail;
-                                                               }
-#endif
                                                                if ((iptr[0].val.l == 0x00000002) ||
                                                                        (iptr[0].val.l == 0x00000004) ||
                                                                        (iptr[0].val.l == 0x00000008) ||
@@ -856,6 +921,9 @@ void analyse_stack()
                                                                        (iptr[0].val.l == 0x80000000)) {
                                                                        iptr[0].opc = ICMD_LREMPOW2;
                                                                        iptr[0].val.l -= 1;
+#if defined(__I386__)
+                                                                       method_uses_ecx = true;
+#endif
                                                                        goto icmd_lconst_tail;
                                                                }
                                                                PUSHCONST(TYPE_LNG);
@@ -878,6 +946,9 @@ void analyse_stack()
                                                                        switch (iptr[2].opc) {
                                                                        case ICMD_IFEQ:
                                                                                iptr[0].opc = ICMD_IF_LEQ;
+#if defined(__I386__)
+                                                                               method_uses_ecx = true;
+#endif
                                                                        icmd_lconst_lcmp_tail:
                                                                                iptr[0].op1 = iptr[2].op1;
                                                                                bptr->icount -= 2;
@@ -885,7 +956,7 @@ void analyse_stack()
                                                                                /* 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;
 
@@ -895,6 +966,9 @@ void analyse_stack()
                                                                                break;
                                                                        case ICMD_IFNE:
                                                                                iptr[0].opc = ICMD_IF_LNE;
+#if defined(__I386__)
+                                                                               method_uses_ecx = true;
+#endif
                                                                                goto icmd_lconst_lcmp_tail;
                                                                        case ICMD_IFLT:
                                                                                iptr[0].opc = ICMD_IF_LLT;
@@ -916,6 +990,23 @@ void analyse_stack()
                                                                        PUSHCONST(TYPE_LNG);
                                                                break;
 #endif
+
+#if SUPPORT_CONST_ASTORE
+                                                       case ICMD_LASTORE:
+#if SUPPORT_ONLY_ZERO_ASTORE
+                                                               if (iptr[0].val.l == 0) {
+#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+                                                                       iptr[0].opc = ICMD_LASTORECONST;
+                                                                       iptr[1].opc = ICMD_NOP;
+                                                                       OPTT2_0(TYPE_INT, TYPE_ADR);
+                                                                       COUNT(count_pcmd_op);
+#if SUPPORT_ONLY_ZERO_ASTORE
+                                                               } else
+#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+                                                                       PUSHCONST(TYPE_LNG);
+                                                               break;
+#endif /* SUPPORT_CONST_ASTORE */
+
                                                        default:
                                                                PUSHCONST(TYPE_LNG);
                                                        }
@@ -923,17 +1014,35 @@ void analyse_stack()
                                                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 SUPPORT_CONST_ASTORE
+                                               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
+#endif /* SUPPORT_CONST_ASTORE */
+                                                       PUSHCONST(TYPE_ADR);
                                                break;
 
                                                /* pop 0 push 1 load */
@@ -946,7 +1055,7 @@ void analyse_stack()
                                                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;
 
@@ -954,6 +1063,7 @@ void analyse_stack()
 
                                        case ICMD_LALOAD:
 #if defined(__I386__)
+                                               method_uses_ecx = true;
                                                method_uses_edx = true;
 #endif
                                        case ICMD_IALOAD:
@@ -964,6 +1074,9 @@ void analyse_stack()
                                                COUNT(count_check_bound);
                                                COUNT(count_pcmd_mem);
                                                OP2IAT_1(opcode-ICMD_IALOAD);
+#if defined(__I386__)
+                                               method_uses_ecx = true;
+#endif
                                                break;
 
                                        case ICMD_BALOAD:
@@ -973,6 +1086,9 @@ void analyse_stack()
                                                COUNT(count_check_bound);
                                                COUNT(count_pcmd_mem);
                                                OP2IAT_1(TYPE_INT);
+#if defined(__I386__)
+                                               method_uses_ecx = true;
+#endif
                                                break;
 
                                                /* pop 0 push 0 iinc */
@@ -1010,7 +1126,7 @@ void analyse_stack()
                                                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;
@@ -1048,6 +1164,7 @@ void analyse_stack()
                                        case ICMD_AASTORE:
                                        case ICMD_LASTORE:
 #if defined(__I386__)
+                                               method_uses_ecx = true;
                                                method_uses_edx = true;
 #endif
                                        case ICMD_FASTORE:
@@ -1066,6 +1183,7 @@ void analyse_stack()
                                                COUNT(count_pcmd_mem);
                                                OP3TIA_0(TYPE_INT);
 #if defined(__I386__)
+                                               method_uses_ecx = true;
                                                method_uses_edx = true;
 #endif
                                                break;
@@ -1104,6 +1222,9 @@ void analyse_stack()
                                        case ICMD_PUTSTATIC:
                                                COUNT(count_pcmd_mem);
                                                OP1_0(iptr->op1);
+#if defined(__I386__)
+                                               method_uses_ecx = true;
+#endif
                                                break;
 
                                                /* pop 1 push 0 branch */
@@ -1112,7 +1233,7 @@ void analyse_stack()
                                        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;
 
@@ -1128,13 +1249,13 @@ void analyse_stack()
                                                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);
@@ -1184,7 +1305,7 @@ void analyse_stack()
                                                }
 #endif
                                                OP1_0(TYPE_INT);
-                                               tbptr = block + block_index[iptr->op1];
+                                               tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
 
                                                iptr[0].target = (void *) tbptr;
 
@@ -1195,7 +1316,7 @@ void analyse_stack()
 
                                        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;
 
@@ -1210,7 +1331,7 @@ void analyse_stack()
                                                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    */
@@ -1222,7 +1343,7 @@ void analyse_stack()
                                                tptr++;
 
                                                while (--i >= 0) {
-                                                       tbptr = block + block_index[*s4ptr++];
+                                                       tbptr = m->basicblocks + m->basicblockindex[*s4ptr++];
 
                                                        tptr[0] = (void *) tbptr;
                                                        tptr++;
@@ -1231,6 +1352,9 @@ void analyse_stack()
                                                }
                                                SETDST;
                                                superblockend = true;
+#if defined(__I386__)
+                                               method_uses_ecx = true;
+#endif
                                                break;
                                                        
                                                /* pop 1 push 0 table branch */
@@ -1239,7 +1363,7 @@ void analyse_stack()
                                                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   */
 
@@ -1250,7 +1374,7 @@ void analyse_stack()
                                                tptr++;
 
                                                while (--i >= 0) {
-                                                       tbptr = block + block_index[s4ptr[1]];
+                                                       tbptr = m->basicblocks + m->basicblockindex[s4ptr[1]];
 
                                                        tptr[0] = (void *) tbptr;
                                                        tptr++;
@@ -1279,7 +1403,7 @@ void analyse_stack()
                                        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;
 
@@ -1290,7 +1414,7 @@ void analyse_stack()
                                        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;
 
@@ -1303,6 +1427,9 @@ void analyse_stack()
                                                COUNT(count_check_null);
                                                COUNT(count_pcmd_mem);
                                                OPTT2_0(iptr->op1,TYPE_ADR);
+#if defined(__I386__)
+                                               method_uses_ecx = true;
+#endif
                                                break;
 
                                        case ICMD_POP2:
@@ -1505,7 +1632,7 @@ void analyse_stack()
                                                iptr[0].opc = ICMD_BUILTIN2;
                                                iptr[0].op1 = TYPE_INT;
                                                iptr[0].val.a = BUILTIN_idiv;
-                                               isleafmethod = false;
+                                               m->isleafmethod = false;
                                                goto builtin2;
 #endif
 
@@ -1514,10 +1641,11 @@ void analyse_stack()
                                                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__)
+                                               method_uses_ecx = true;
                                                method_uses_edx = true;
 #endif
 
@@ -1542,7 +1670,7 @@ void analyse_stack()
                                                iptr[0].opc = ICMD_BUILTIN2;
                                                iptr[0].op1 = TYPE_LNG;
                                                iptr[0].val.a = BUILTIN_ldiv;
-                                               isleafmethod = false;
+                                               m->isleafmethod = false;
                                                goto builtin2;
 #endif
 
@@ -1551,12 +1679,13 @@ void analyse_stack()
                                                iptr[0].opc = ICMD_BUILTIN2;
                                                iptr[0].op1 = TYPE_LNG;
                                                iptr[0].val.a = BUILTIN_lrem;
-                                               isleafmethod = false;
+                                               m->isleafmethod = false;
                                                goto builtin2;
 #endif
 
                                        case ICMD_LMUL:
 #if defined(__I386__)
+                                               method_uses_ecx = true;
                                                method_uses_edx = true;
 #endif
                                        case ICMD_LADD:
@@ -1564,7 +1693,7 @@ void analyse_stack()
                                        case ICMD_LOR:
                                        case ICMD_LAND:
                                        case ICMD_LXOR:
-                                               /* XXX DEBUG */ /*dolog("OP2_1(TYPE_LNG)"); */
+                                               /* DEBUG */ /*dolog("OP2_1(TYPE_LNG)"); */
                                                COUNT(count_pcmd_op);
                                                OP2_1(TYPE_LNG);
                                                break;
@@ -1605,13 +1734,16 @@ void analyse_stack()
                                                        switch (iptr[1].opc) {
                                                        case ICMD_IFEQ:
                                                                iptr[0].opc = ICMD_IF_LCMPEQ;
+#if defined(__I386__)
+                                                               method_uses_ecx = true;
+#endif
                                                        icmd_lcmp_if_tail:
                                                                iptr[0].op1 = iptr[1].op1;
                                                                len--;
                                                                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;
 
@@ -1620,6 +1752,9 @@ void analyse_stack()
                                                                break;
                                                        case ICMD_IFNE:
                                                                iptr[0].opc = ICMD_IF_LCMPNE;
+#if defined(__I386__)
+                                                               method_uses_ecx = true;
+#endif
                                                                goto icmd_lcmp_if_tail;
                                                        case ICMD_IFLT:
                                                                iptr[0].opc = ICMD_IF_LCMPLT;
@@ -1735,12 +1870,14 @@ void analyse_stack()
                                        case ICMD_CHECKCAST:
                                                OP1_1(TYPE_ADR, TYPE_ADR);
 #if defined(__I386__)
+                                               method_uses_ecx = true;
                                                method_uses_edx = true;
 #endif
                                                break;
 
                                        case ICMD_INSTANCEOF:
 #if defined(__I386__)
+                                               method_uses_ecx = true;
                                                method_uses_edx = true;
 #endif
                                        case ICMD_ARRAYLENGTH:
@@ -1756,6 +1893,9 @@ void analyse_stack()
                                                COUNT(count_check_null);
                                                COUNT(count_pcmd_mem);
                                                OP1_1(TYPE_ADR, iptr->op1);
+#if defined(__I386__)
+                                               method_uses_ecx = true;
+#endif
                                                break;
 
                                                /* pop 0 push 1 */
@@ -1763,6 +1903,9 @@ void analyse_stack()
                                        case ICMD_GETSTATIC:
                                                COUNT(count_pcmd_mem);
                                                OP0_1(iptr->op1);
+#if defined(__I386__)
+                                               method_uses_ecx = true;
+#endif
                                                break;
 
                                        case ICMD_NEW:
@@ -1771,17 +1914,20 @@ void analyse_stack()
 
                                        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;
 
-                                               /* XXX This is a dirty hack. The typechecker
+                                               /* This is a dirty hack. The typechecker
                                                 * needs it because the OP1_0ANY below
                                                 * overwrites iptr->dst.
                                                 */
                                                iptr->val.a = (void *) iptr->dst;
 
                                                tbptr->type = BBTYPE_SBR;
+
+                                               /* We need to check for overflow right here because
+                                                * the pushed value is poped after MARKREACHED. */
                                                CHECKOVERFLOW;
                                                MARKREACHED(tbptr, copy);
                                                OP1_0ANY;
@@ -1794,19 +1940,22 @@ void analyse_stack()
                                        case ICMD_INVOKEINTERFACE:
                                        case ICMD_INVOKESTATIC:
                                                COUNT(count_pcmd_met);
+#if defined(__I386__)
+                                               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__)
                                                        {
-                                                               int iarg = 0;
-                                                               int farg = 0;
-                                                               int stackargs = 0;
+                                                               s4 iarg = 0;
+                                                               s4 farg = 0;
+                                                               s4 stackargs = 0;
 
                                                                copy = curstack;
                                                                while (--i >= 0) {
@@ -1814,8 +1963,10 @@ void analyse_stack()
                                                                        copy = copy->prev;
                                                                }
 
-                                                               stackargs += (iarg < intreg_argnum) ? 0 : (iarg - intreg_argnum);
-                                                               stackargs += (farg < fltreg_argnum) ? 0 : (farg - fltreg_argnum);
+                                                               stackargs += (iarg < m->registerdata->intreg_argnum) ?
+                                                                       0 : (iarg - m->registerdata->intreg_argnum);
+                                                               stackargs += (farg < m->registerdata->fltreg_argnum) ?
+                                                                       0 : (farg - m->registerdata->fltreg_argnum);
 
                                                                i = iptr->op1;
                                                                copy = curstack;
@@ -1823,16 +1974,16 @@ void analyse_stack()
                                                                        if (!(copy->flags & SAVEDVAR)) {
                                                                                copy->varkind = ARGVAR;
                                                                                if (IS_FLT_DBL_TYPE(copy->type)) {
-                                                                                       if (--farg < fltreg_argnum) {
+                                                                                       if (--farg < m->registerdata->fltreg_argnum) {
                                                                                                copy->varnum = farg;
                                                                                        } else {
-                                                                                               copy->varnum = --stackargs + intreg_argnum;
+                                                                                               copy->varnum = --stackargs + m->registerdata->intreg_argnum;
                                                                                        }
                                                                                } else {
-                                                                                       if (--iarg < intreg_argnum) {
+                                                                                       if (--iarg < m->registerdata->intreg_argnum) {
                                                                                                copy->varnum = iarg;
                                                                                        } else {
-                                                                                               copy->varnum = --stackargs + intreg_argnum;
+                                                                                               copy->varnum = --stackargs + m->registerdata->intreg_argnum;
                                                                                        }
                                                                                }
                                                                        } else {
@@ -1857,47 +2008,47 @@ void analyse_stack()
                                                        }
                                                        i = iptr->op1;
                                                        POPMANY(i);
-                                                       if (m->returntype != TYPE_VOID) {
-                                                               OP0_1(m->returntype);
+                                                       if (lm->returntype != TYPE_VOID) {
+                                                               OP0_1(lm->returntype);
                                                        }
                                                        break;
                                                }
 
                                        case ICMD_BUILTIN3:
-                                               /* XXX DEBUG */ /*dolog("builtin3");*/
+                                               /* DEBUG */ /*dolog("builtin3");*/
                                                REQUIRE_3;
                                                if (! (curstack->flags & SAVEDVAR)) {
                                                        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;
 
                                        case ICMD_BUILTIN2:
                                        builtin2:
                                                REQUIRE_2;
-                                               /* XXX DEBUG */ /*dolog("builtin2");*/
+                                               /* DEBUG */ /*dolog("builtin2");*/
                                        if (!(curstack->flags & SAVEDVAR)) {
                                                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;
 
                                        case ICMD_BUILTIN1:
                                        builtin1:
                                                REQUIRE_1;
-                                               /* XXX DEBUG */ /*dolog("builtin1");*/
+                                               /* DEBUG */ /*dolog("builtin1");*/
                                        if (!(curstack->flags & SAVEDVAR)) {
                                                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;
@@ -1912,14 +2063,14 @@ void analyse_stack()
                                        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) {
-                                                       /* XXX check INT type here? Currently typecheck does this. */
+                                                       /* 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;
                                                }
@@ -1933,7 +2084,7 @@ void analyse_stack()
                                                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;
@@ -1957,13 +2108,13 @@ void analyse_stack()
                                                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 */
 
                                        CHECKOVERFLOW;
                                        
-                                       /* XXX DEBUG */ /*dolog("iptr++");*/
+                                       /* DEBUG */ /*dolog("iptr++");*/
                                        iptr++;
                                } /* while instructions */
                                bptr->outstack = curstack;
@@ -1977,19 +2128,19 @@ void analyse_stack()
        } 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)
@@ -2030,25 +2181,29 @@ void analyse_stack()
        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]++;
 #endif
+
+       /* just return methodinfo* to signal everything was ok */
+
+       return m;
 }
 
 
@@ -2056,33 +2211,33 @@ void analyse_stack()
 /* 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) {
                j--;
-               /* XXX remove */ /* printf("(%d)",s->flags); fflush(stdout); */
+               /* DEBUG */ /*printf("(%d,%d,%d,%d)",s->varkind,s->flags,s->regoff,s->varnum); fflush(stdout);*/
                if (s->flags & SAVEDVAR)
                        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:
@@ -2101,11 +2256,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:
@@ -2194,41 +2349,41 @@ static char *jit_type[] = {
 };
 
 
-void show_icmd_method()
+void show_icmd_method(methodinfo *m)
 {
        int i, j;
-       s4  *s4ptr; /* used */
        basicblock *bptr;
-       xtable *ex;
+       exceptiontable *ex;
 
        printf("\n");
-       utf_fprint(stdout, class->name);
+       utf_fprint_classname(stdout, m->class->name);
        printf(".");
-       utf_fprint(stdout, method->name);
-       printf(" ");
-       utf_fprint(stdout, method->descriptor);
-       printf ("\n\nMax locals: %d\n", (int) maxlocals);
-       printf ("Max stack:  %d\n", (int) maxstack);
-
-       printf ("Exceptions (Number: %d):\n", exceptiontablelength);
-       for (ex = extable; ex != NULL; ex = ex->down) {
+       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", m->linenumbercount);
+
+       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");
@@ -2236,30 +2391,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]);
                                                }
                                        }
                                }
@@ -2271,71 +2428,70 @@ void show_icmd_method()
        if (showdisassemble) {
 #if defined(__I386__) || defined(__X86_64__)
                u1 *u1ptr;
-               int a;
+               s4 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;
                }
                printf("\n");
 #else
-               s4ptr = (s4 *) (method->mcode + dseglen);
-               for (i = 0; i < block[0].mpc; i += 4, s4ptr++) {
-                       disassinstr(*s4ptr, i); 
+               s4 *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;
-       s4  *s4ptr; /* used */
        instruction *iptr;
 
        if (bptr->flags != BBDELETED) {
                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);
-                       /* XXX remove */ /*fflush(stdout);*/
-                       show_icmd(iptr,deadcode);
+                       show_icmd(iptr, deadcode);
                        printf("\n");
                }
 
                if (showdisassemble && (!deadcode)) {
 #if defined(__I386__) || defined(__X86_64__)
                        u1 *u1ptr;
-                       int a;
+                       s4 a;
 
                        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++) {
@@ -2346,7 +2502,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;
@@ -2354,19 +2510,21 @@ void show_icmd_block(basicblock *bptr)
                                printf("\n");
                        }
 #else
+                       s4 *s4ptr;
+
                        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++) {
-                                       disassinstr(*s4ptr, i); 
+                                       disassinstr(s4ptr, i); 
                                }
                                printf("\n");
 
                        } else {
-                               for (; s4ptr < (s4 *) (method->mcode + method->mcodelength); i += 4, s4ptr++) {
-                                       disassinstr(*s4ptr, i); 
+                               for (; s4ptr < (s4 *) (m->mcode + m->mcodelength); i += 4, s4ptr++) {
+                                       disassinstr(s4ptr, i); 
                                }
                                printf("\n");
                        }
@@ -2376,11 +2534,11 @@ void show_icmd_block(basicblock *bptr)
 }
 
 
-void show_icmd(instruction *iptr,bool deadcode)
+void show_icmd(instruction *iptr, bool deadcode)
 {
        int j;
        s4  *s4ptr;
-       void **tptr;
+       void **tptr = NULL;
        
        printf("%s", icmd_names[iptr->opc]);
 
@@ -2390,7 +2548,6 @@ void show_icmd(instruction *iptr,bool deadcode)
        case ICMD_IMULCONST:
        case ICMD_IDIVPOW2:
        case ICMD_IREMPOW2:
-       case ICMD_IREM0X10001:
        case ICMD_IANDCONST:
        case ICMD_IORCONST:
        case ICMD_IXORCONST:
@@ -2408,6 +2565,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;
 
@@ -2420,6 +2581,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
@@ -2436,6 +2598,7 @@ void show_icmd(instruction *iptr,bool deadcode)
                break;
 
        case ICMD_ACONST:
+       case ICMD_AASTORECONST:
                printf(" %p", iptr->val.a);
                break;
 
@@ -2596,9 +2759,17 @@ void show_icmd(instruction *iptr,bool deadcode)
        case ICMD_IF_LGT:
        case ICMD_IF_LLE:
                if (deadcode || !iptr->target)
+#if defined(__I386__) || defined(__POWERPC__)
                        printf("(%lld) op1=%d", iptr->val.l, iptr->op1);
+#else
+                       printf("(%ld) op1=%d", iptr->val.l, iptr->op1);
+#endif
                else
+#if defined(__I386__) || defined(__POWERPC__)
                        printf("(%lld) L%03d", iptr->val.l, ((basicblock *) iptr->target)->debug_nr);
+#else
+                       printf("(%ld) L%03d", iptr->val.l, ((basicblock *) iptr->target)->debug_nr);
+#endif
                break;
 
        case ICMD_JSR:
@@ -2677,6 +2848,10 @@ void show_icmd(instruction *iptr,bool deadcode)
                }
                break;
        }
+       printf(" Line number: %d, method:",iptr->line);
+       utf_display(iptr->method->class->name);
+       printf(".");
+       utf_display(iptr->method->name);
 }