-/* jit/stack.c - stack analysis
+/* src/vm/jit/stack.c - stack analysis
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
- M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
- P. Tomsich, J. Wenninger
+ Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+ R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+ C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+ Institut f. Computersprachen - TU Wien
This file is part of CACAO.
Authors: Andreas Krall
Changes: Edwin Steiner
+ Christian Thalinger
- $Id: stack.c 1338 2004-07-21 16:02:14Z twisti $
+ $Id: stack.c 2038 2005-03-20 11:22:40Z twisti $
*/
#include <stdio.h>
#include <string.h>
-#include "global.h"
-#include "native.h"
-#include "builtin.h"
+
#include "disass.h"
-#include "tables.h"
#include "types.h"
-#include "options.h"
-#include "statistics.h"
-#include "jit/codegen.inc.h"
-#include "jit/jit.h"
-#include "jit/stack.h"
-#include "jit/reg.h"
+#include "mm/memory.h"
+#include "native/native.h"
#include "toolbox/logging.h"
-#include "toolbox/memory.h"
+#include "vm/global.h"
+#include "vm/builtin.h"
+#include "vm/options.h"
+#include "vm/statistics.h"
+#include "vm/tables.h"
+#include "vm/jit/codegen.inc.h"
+#include "vm/jit/jit.h"
+#include "vm/jit/reg.h"
+#include "vm/jit/stack.h"
/**********************************************************************/
* types are not discerned.
*/
-methodinfo *analyse_stack(methodinfo *m)
+methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd)
{
int b_count;
int b_index;
void* *tptr;
s4 *argren;
- argren = DMNEW(s4, m->maxlocals); /* table for argument renaming */
- for (i = 0; i < m->maxlocals; i++)
+ argren = DMNEW(s4, cd->maxlocals); /* table for argument renaming */
+ for (i = 0; i < cd->maxlocals; i++)
argren[i] = i;
- m->registerdata->arguments_num = 0;
+ rd->arguments_num = 0;
new = m->stack;
loops = 0;
m->basicblocks[0].flags = BBREACHED;
m->basicblocks[0].instack = 0;
m->basicblocks[0].indepth = 0;
- for (i = 0; i < m->exceptiontablelength; i++) {
- bptr = &m->basicblocks[m->basicblockindex[m->exceptiontable[i].handlerpc]];
+ for (i = 0; i < cd->exceptiontablelength; i++) {
+ bptr = &m->basicblocks[m->basicblockindex[cd->exceptiontable[i].handlerpc]];
bptr->flags = BBREACHED;
bptr->type = BBTYPE_EXH;
bptr->instack = new;
bptr->indepth = stackdepth;
}
else if (bptr->indepth != stackdepth) {
- show_icmd_method(m);
+ show_icmd_method(m, cd, rd);
+ printf("Block: %d, required depth: %d, current depth: %d\n", bptr->debug_nr, bptr->indepth, stackdepth);
panic("Stack depth mismatch");
}
/* dolog("p: %04d op: %s stack: %p", iptr - instr, icmd_names[opcode], curstack); */
-#ifdef USEBUILTINTABLE
+#if defined(USEBUILTINTABLE)
{
#if 0
stdopdescriptor *breplace;
if (breplace && opcode == breplace->opcode) {
iptr[0].opc = breplace->icmd;
iptr[0].op1 = breplace->type_d;
- iptr[0].val.a = breplace->builtin;
+ iptr[0].val.fp = breplace->builtin;
m->isleafmethod = false;
switch (breplace->icmd) {
case ICMD_BUILTIN1:
if (breplace && opcode == breplace->opcode) {
iptr[0].opc = breplace->icmd;
iptr[0].op1 = breplace->type_d;
- iptr[0].val.a = breplace->builtin;
+ iptr[0].val.fp = breplace->builtin;
m->isleafmethod = false;
switch (breplace->icmd) {
case ICMD_BUILTIN1:
}
}
}
-#endif
+#endif /* defined(USEBUILTINTABLE) */
switch (opcode) {
break;
case ICMD_RET:
- m->registerdata->locals[iptr->op1][TYPE_ADR].type = TYPE_ADR;
+ rd->locals[iptr->op1][TYPE_ADR].type = TYPE_ADR;
case ICMD_RETURN:
COUNT(count_pcmd_return);
SETDST;
case ICMD_ISUB:
iptr[0].opc = ICMD_ISUBCONST;
goto icmd_iconst_tail;
+#if SUPPORT_CONST_MUL
case ICMD_IMUL:
iptr[0].opc = ICMD_IMULCONST;
goto icmd_iconst_tail;
+#else /* SUPPORT_CONST_MUL */
+ case ICMD_IMUL:
+ if (iptr[0].val.i == 0x00000002)
+ iptr[0].val.i = 1;
+ else if (iptr[0].val.i == 0x00000004)
+ iptr[0].val.i = 2;
+ else if (iptr[0].val.i == 0x00000008)
+ iptr[0].val.i = 3;
+ else if (iptr[0].val.i == 0x00000010)
+ iptr[0].val.i = 4;
+ else if (iptr[0].val.i == 0x00000020)
+ iptr[0].val.i = 5;
+ else if (iptr[0].val.i == 0x00000040)
+ iptr[0].val.i = 6;
+ else if (iptr[0].val.i == 0x00000080)
+ iptr[0].val.i = 7;
+ else if (iptr[0].val.i == 0x00000100)
+ iptr[0].val.i = 8;
+ else if (iptr[0].val.i == 0x00000200)
+ iptr[0].val.i = 9;
+ else if (iptr[0].val.i == 0x00000400)
+ iptr[0].val.i = 10;
+ else if (iptr[0].val.i == 0x00000800)
+ iptr[0].val.i = 11;
+ else if (iptr[0].val.i == 0x00001000)
+ iptr[0].val.i = 12;
+ else if (iptr[0].val.i == 0x00002000)
+ iptr[0].val.i = 13;
+ else if (iptr[0].val.i == 0x00004000)
+ iptr[0].val.i = 14;
+ else if (iptr[0].val.i == 0x00008000)
+ iptr[0].val.i = 15;
+ else if (iptr[0].val.i == 0x00010000)
+ iptr[0].val.i = 16;
+ else if (iptr[0].val.i == 0x00020000)
+ iptr[0].val.i = 17;
+ else if (iptr[0].val.i == 0x00040000)
+ iptr[0].val.i = 18;
+ else if (iptr[0].val.i == 0x00080000)
+ iptr[0].val.i = 19;
+ else if (iptr[0].val.i == 0x00100000)
+ iptr[0].val.i = 20;
+ else if (iptr[0].val.i == 0x00200000)
+ iptr[0].val.i = 21;
+ else if (iptr[0].val.i == 0x00400000)
+ iptr[0].val.i = 22;
+ else if (iptr[0].val.i == 0x00800000)
+ iptr[0].val.i = 23;
+ else if (iptr[0].val.i == 0x01000000)
+ iptr[0].val.i = 24;
+ else if (iptr[0].val.i == 0x02000000)
+ iptr[0].val.i = 25;
+ else if (iptr[0].val.i == 0x04000000)
+ iptr[0].val.i = 26;
+ else if (iptr[0].val.i == 0x08000000)
+ iptr[0].val.i = 27;
+ else if (iptr[0].val.i == 0x10000000)
+ iptr[0].val.i = 28;
+ else if (iptr[0].val.i == 0x20000000)
+ iptr[0].val.i = 29;
+ else if (iptr[0].val.i == 0x40000000)
+ iptr[0].val.i = 30;
+ else if (iptr[0].val.i == 0x80000000)
+ iptr[0].val.i = 31;
+ else {
+ PUSHCONST(TYPE_INT);
+ break;
+ }
+ iptr[0].opc = ICMD_IMULPOW2;
+ goto icmd_iconst_tail;
+#endif /* SUPPORT_CONST_MUL */
case ICMD_IDIV:
if (iptr[0].val.i == 0x00000002)
iptr[0].val.i = 1;
(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);
break;
+#if SUPPORT_CONST_LOGICAL
case ICMD_IAND:
iptr[0].opc = ICMD_IANDCONST;
goto icmd_iconst_tail;
case ICMD_IXOR:
iptr[0].opc = ICMD_IXORCONST;
goto icmd_iconst_tail;
+#endif /* SUPPORT_CONST_LOGICAL */
case ICMD_ISHL:
iptr[0].opc = ICMD_ISHLCONST;
goto icmd_iconst_tail;
#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
+#endif /* SUPPORT_LONG_SHIFT */
case ICMD_IF_ICMPEQ:
iptr[0].opc = ICMD_IFEQ;
icmd_if_icmp_tail:
iptr[0].opc = ICMD_IFGE;
goto icmd_if_icmp_tail;
-#if SUPPORT_CONST_ASTORE
+#if SUPPORT_CONST_STORE
case ICMD_IASTORE:
case ICMD_BASTORE:
case ICMD_CASTORE:
case ICMD_SASTORE:
-#if SUPPORT_ONLY_ZERO_ASTORE
+ case ICMD_PUTSTATIC:
+ case ICMD_PUTFIELD:
+#if SUPPORT_CONST_STORE_ZERO_ONLY
if (iptr[0].val.i == 0) {
-#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
switch (iptr[1].opc) {
case ICMD_IASTORE:
iptr[0].opc = ICMD_IASTORECONST;
case ICMD_SASTORE:
iptr[0].opc = ICMD_SASTORECONST;
break;
+ case ICMD_PUTSTATIC:
+ iptr[0].opc = ICMD_PUTSTATICCONST;
+ break;
+ case ICMD_PUTFIELD:
+ iptr[0].opc = ICMD_PUTFIELDCONST;
+ break;
}
iptr[1].opc = ICMD_NOP;
OPTT2_0(TYPE_INT, TYPE_ADR);
COUNT(count_pcmd_op);
-#if SUPPORT_ONLY_ZERO_ASTORE
+#if SUPPORT_CONST_STORE_ZERO_ONLY
} else
PUSHCONST(TYPE_INT);
-#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
break;
-#endif /* SUPPORT_CONST_ASTORE */
+#endif /* SUPPORT_CONST_STORE */
default:
PUSHCONST(TYPE_INT);
case ICMD_LSUB:
iptr[0].opc = ICMD_LSUBCONST;
goto icmd_lconst_tail;
-#endif
-#if SUPPORT_LONG_MUL
+#endif /* SUPPORT_LONG_ADD */
+#if SUPPORT_LONG_MUL && SUPPORT_CONST_MUL
case ICMD_LMUL:
iptr[0].opc = ICMD_LMULCONST;
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = true;
-#endif
goto icmd_lconst_tail;
-#endif
+#else /* SUPPORT_LONG_MUL && SUPPORT_CONST_MUL */
+# if SUPPORT_LONG_SHIFT
+ case ICMD_LMUL:
+ if (iptr[0].val.l == 0x00000002)
+ iptr[0].val.i = 1;
+ else if (iptr[0].val.l == 0x00000004)
+ iptr[0].val.i = 2;
+ else if (iptr[0].val.l == 0x00000008)
+ iptr[0].val.i = 3;
+ else if (iptr[0].val.l == 0x00000010)
+ iptr[0].val.i = 4;
+ else if (iptr[0].val.l == 0x00000020)
+ iptr[0].val.i = 5;
+ else if (iptr[0].val.l == 0x00000040)
+ iptr[0].val.i = 6;
+ else if (iptr[0].val.l == 0x00000080)
+ iptr[0].val.i = 7;
+ else if (iptr[0].val.l == 0x00000100)
+ iptr[0].val.i = 8;
+ else if (iptr[0].val.l == 0x00000200)
+ iptr[0].val.i = 9;
+ else if (iptr[0].val.l == 0x00000400)
+ iptr[0].val.i = 10;
+ else if (iptr[0].val.l == 0x00000800)
+ iptr[0].val.i = 11;
+ else if (iptr[0].val.l == 0x00001000)
+ iptr[0].val.i = 12;
+ else if (iptr[0].val.l == 0x00002000)
+ iptr[0].val.i = 13;
+ else if (iptr[0].val.l == 0x00004000)
+ iptr[0].val.i = 14;
+ else if (iptr[0].val.l == 0x00008000)
+ iptr[0].val.i = 15;
+ else if (iptr[0].val.l == 0x00010000)
+ iptr[0].val.i = 16;
+ else if (iptr[0].val.l == 0x00020000)
+ iptr[0].val.i = 17;
+ else if (iptr[0].val.l == 0x00040000)
+ iptr[0].val.i = 18;
+ else if (iptr[0].val.l == 0x00080000)
+ iptr[0].val.i = 19;
+ else if (iptr[0].val.l == 0x00100000)
+ iptr[0].val.i = 20;
+ else if (iptr[0].val.l == 0x00200000)
+ iptr[0].val.i = 21;
+ else if (iptr[0].val.l == 0x00400000)
+ iptr[0].val.i = 22;
+ else if (iptr[0].val.l == 0x00800000)
+ iptr[0].val.i = 23;
+ else if (iptr[0].val.l == 0x01000000)
+ iptr[0].val.i = 24;
+ else if (iptr[0].val.l == 0x02000000)
+ iptr[0].val.i = 25;
+ else if (iptr[0].val.l == 0x04000000)
+ iptr[0].val.i = 26;
+ else if (iptr[0].val.l == 0x08000000)
+ iptr[0].val.i = 27;
+ else if (iptr[0].val.l == 0x10000000)
+ iptr[0].val.i = 28;
+ else if (iptr[0].val.l == 0x20000000)
+ iptr[0].val.i = 29;
+ else if (iptr[0].val.l == 0x40000000)
+ iptr[0].val.i = 30;
+ else if (iptr[0].val.l == 0x80000000)
+ iptr[0].val.i = 31;
+ else {
+ PUSHCONST(TYPE_LNG);
+ break;
+ }
+ iptr[0].opc = ICMD_LMULPOW2;
+ goto icmd_lconst_tail;
+# endif /* SUPPORT_LONG_SHIFT */
+#endif /* SUPPORT_LONG_MUL && SUPPORT_CONST_MUL */
#if SUPPORT_LONG_DIV
case ICMD_LDIV:
if (iptr[0].val.l == 0x00000002)
break;
}
iptr[0].opc = ICMD_LDIVPOW2;
-#if defined(__I386__)
- method_uses_ecx = true;
-#endif
goto icmd_lconst_tail;
case ICMD_LREM:
if ((iptr[0].val.l == 0x00000002) ||
(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);
break;
-#endif
-#if SUPPORT_LONG_LOG
+#endif /* SUPPORT_LONG_DIV */
+#if SUPPORT_LONG_LOGICAL && SUPPORT_CONST_LOGICAL
+
case ICMD_LAND:
iptr[0].opc = ICMD_LANDCONST;
goto icmd_lconst_tail;
case ICMD_LXOR:
iptr[0].opc = ICMD_LXORCONST;
goto icmd_lconst_tail;
-#endif
+#endif /* SUPPORT_LONG_LOGICAL && SUPPORT_CONST_LOGICAL */
#if !defined(NOLONG_CONDITIONAL)
case ICMD_LCMP:
if ((len > 1) && (iptr[2].val.i == 0)) {
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;
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;
else
PUSHCONST(TYPE_LNG);
break;
-#endif
+#endif /* !defined(NOLONG_CONDITIONAL) */
-#if SUPPORT_CONST_ASTORE
+#if SUPPORT_CONST_STORE
case ICMD_LASTORE:
-#if SUPPORT_ONLY_ZERO_ASTORE
+ case ICMD_PUTSTATIC:
+ case ICMD_PUTFIELD:
+#if SUPPORT_CONST_STORE_ZERO_ONLY
if (iptr[0].val.l == 0) {
-#endif /* SUPPORT_ONLY_ZERO_ASTORE */
- iptr[0].opc = ICMD_LASTORECONST;
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
+ switch (iptr[1].opc) {
+ case ICMD_LASTORE:
+ iptr[0].opc = ICMD_LASTORECONST;
+ break;
+ case ICMD_PUTSTATIC:
+ iptr[0].opc = ICMD_PUTSTATICCONST;
+ break;
+ case ICMD_PUTFIELD:
+ iptr[0].opc = ICMD_PUTFIELDCONST;
+ break;
+ }
+
iptr[1].opc = ICMD_NOP;
OPTT2_0(TYPE_INT, TYPE_ADR);
COUNT(count_pcmd_op);
-#if SUPPORT_ONLY_ZERO_ASTORE
+#if SUPPORT_CONST_STORE_ZERO_ONLY
} else
PUSHCONST(TYPE_LNG);
-#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
break;
-#endif /* SUPPORT_CONST_ASTORE */
+#endif /* SUPPORT_CONST_STORE */
default:
PUSHCONST(TYPE_LNG);
case ICMD_ACONST:
COUNT(count_pcmd_load);
-#if SUPPORT_CONST_ASTORE
+#if SUPPORT_CONST_STORE
if (len > 0 && iptr->val.a == 0) {
- if (iptr[1].opc == ICMD_BUILTIN3 &&
- iptr[1].val.a == BUILTIN_aastore) {
- iptr[0].opc = ICMD_AASTORECONST;
+ switch (iptr[1].opc) {
+ case ICMD_BUILTIN3:
+ if (iptr[1].val.fp != BUILTIN_aastore) {
+ PUSHCONST(TYPE_ADR);
+ break;
+ }
+ /* fall through */
+ case ICMD_PUTSTATIC:
+ case ICMD_PUTFIELD:
+ switch (iptr[1].opc) {
+ case ICMD_BUILTIN3:
+ iptr[0].opc = ICMD_AASTORECONST;
+ break;
+ case ICMD_PUTSTATIC:
+ iptr[0].opc = ICMD_PUTSTATICCONST;
+ break;
+ case ICMD_PUTFIELD:
+ iptr[0].opc = ICMD_PUTFIELDCONST;
+ break;
+ }
+
iptr[1].opc = ICMD_NOP;
OPTT2_0(TYPE_INT, TYPE_ADR);
COUNT(count_pcmd_op);
+ break;
- } else {
+ default:
PUSHCONST(TYPE_ADR);
}
-
} else
-#endif /* SUPPORT_CONST_ASTORE */
+#endif /* SUPPORT_CONST_STORE */
PUSHCONST(TYPE_ADR);
break;
COUNT(count_load_instruction);
i = opcode-ICMD_ILOAD;
iptr->op1 = argren[iptr->op1];
- m->registerdata->locals[iptr->op1][i].type = i;
+ rd->locals[iptr->op1][i].type = i;
LOAD(i, LOCALVAR, iptr->op1);
break;
/* pop 2 push 1 */
case ICMD_LALOAD:
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = true;
-#endif
case ICMD_IALOAD:
case ICMD_FALOAD:
case ICMD_DALOAD:
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:
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 */
case ICMD_IINC:
-#ifdef STATISTICS
- i = stackdepth;
- if (i >= 10)
- count_store_depth[10]++;
- else
- count_store_depth[i]++;
+#if defined(STATISTICS)
+ if (opt_stat) {
+ i = stackdepth;
+ if (i >= 10)
+ count_store_depth[10]++;
+ else
+ count_store_depth[i]++;
+ }
#endif
copy = curstack;
i = stackdepth - 1;
REQUIRE_1;
i = opcode - ICMD_ISTORE;
- m->registerdata->locals[iptr->op1][i].type = i;
-#ifdef STATISTICS
- count_pcmd_store++;
- i = new - curstack;
- if (i >= 20)
- count_store_length[20]++;
- else
- count_store_length[i]++;
- i = stackdepth - 1;
- if (i >= 10)
- count_store_depth[10]++;
- else
- count_store_depth[i]++;
+ rd->locals[iptr->op1][i].type = i;
+#if defined(STATISTICS)
+ if (opt_stat) {
+ count_pcmd_store++;
+ i = new - curstack;
+ if (i >= 20)
+ count_store_length[20]++;
+ else
+ count_store_length[i]++;
+ i = stackdepth - 1;
+ if (i >= 10)
+ count_store_depth[10]++;
+ else
+ count_store_depth[i]++;
+ }
#endif
copy = curstack->prev;
i = stackdepth - 2;
case ICMD_IASTORE:
case ICMD_AASTORE:
case ICMD_LASTORE:
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = true;
-#endif
case ICMD_FASTORE:
case ICMD_DASTORE:
COUNT(count_check_null);
COUNT(count_check_bound);
COUNT(count_pcmd_mem);
OP3TIA_0(TYPE_INT);
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = true;
-#endif
break;
/* pop 1 push 0 */
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 */
}
SETDST;
superblockend = true;
-#if defined(__I386__)
- method_uses_ecx = true;
-#endif
break;
/* pop 1 push 0 table branch */
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:
#if !SUPPORT_DIVISION
iptr[0].opc = ICMD_BUILTIN2;
iptr[0].op1 = TYPE_INT;
- iptr[0].val.a = BUILTIN_idiv;
+ iptr[0].val.fp = BUILTIN_idiv;
m->isleafmethod = false;
goto builtin2;
#endif
#if !SUPPORT_DIVISION
iptr[0].opc = ICMD_BUILTIN2;
iptr[0].op1 = TYPE_INT;
- iptr[0].val.a = BUILTIN_irem;
+ iptr[0].val.fp = BUILTIN_irem;
m->isleafmethod = false;
goto builtin2;
#endif
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = true;
-#endif
case ICMD_ISHL:
case ICMD_ISHR:
case ICMD_IUSHR:
-#if defined(__I386__)
- method_uses_ecx = true;
-#endif
case ICMD_IADD:
case ICMD_ISUB:
case ICMD_IMUL:
#if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
iptr[0].opc = ICMD_BUILTIN2;
iptr[0].op1 = TYPE_LNG;
- iptr[0].val.a = BUILTIN_ldiv;
+ iptr[0].val.fp = BUILTIN_ldiv;
m->isleafmethod = false;
goto builtin2;
#endif
#if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
iptr[0].opc = ICMD_BUILTIN2;
iptr[0].op1 = TYPE_LNG;
- iptr[0].val.a = BUILTIN_lrem;
+ iptr[0].val.fp = BUILTIN_lrem;
m->isleafmethod = false;
goto builtin2;
#endif
case ICMD_LMUL:
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = true;
-#endif
case ICMD_LADD:
case ICMD_LSUB:
- case ICMD_LOR:
+#if SUPPORT_LONG_LOGICAL
case ICMD_LAND:
+ case ICMD_LOR:
case ICMD_LXOR:
- /* DEBUG */ /*dolog("OP2_1(TYPE_LNG)"); */
+#endif /* SUPPORT_LONG_LOGICAL */
COUNT(count_pcmd_op);
OP2_1(TYPE_LNG);
break;
case ICMD_LUSHR:
COUNT(count_pcmd_op);
OP2IT_1(TYPE_LNG);
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = true;
-#endif
break;
case ICMD_FADD:
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--;
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;
case ICMD_I2L:
COUNT(count_pcmd_op);
OP1_1(TYPE_INT, TYPE_LNG);
-#if defined(__I386__)
- method_uses_edx = true;
-#endif
break;
case ICMD_I2F:
COUNT(count_pcmd_op);
case ICMD_F2L:
COUNT(count_pcmd_op);
OP1_1(TYPE_FLT, TYPE_LNG);
-#if defined(__I386__)
- method_uses_edx = true;
-#endif
break;
case ICMD_F2D:
COUNT(count_pcmd_op);
case ICMD_D2L:
COUNT(count_pcmd_op);
OP1_1(TYPE_DBL, TYPE_LNG);
-#if defined(__I386__)
- method_uses_edx = true;
-#endif
break;
case ICMD_D2F:
COUNT(count_pcmd_op);
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:
OP1_1(TYPE_ADR, TYPE_INT);
break;
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 */
case ICMD_GETSTATIC:
COUNT(count_pcmd_mem);
OP0_1(iptr->op1);
-#if defined(__I386__)
- method_uses_ecx = true;
-#endif
break;
case ICMD_NEW:
case ICMD_INVOKEINTERFACE:
case ICMD_INVOKESTATIC:
COUNT(count_pcmd_met);
-#if defined(__I386__)
- method_uses_ecx = true;
-#endif
{
methodinfo *lm = iptr->val.a;
if (lm->flags & ACC_STATIC)
{COUNT(count_check_null);}
i = iptr->op1;
- if (i > m->registerdata->arguments_num)
- m->registerdata->arguments_num = i;
+ if (i > rd->arguments_num)
+ rd->arguments_num = i;
REQUIRE(i);
#if defined(__X86_64__)
{
s4 farg = 0;
s4 stackargs = 0;
+ /* count integer and float arguments */
+
copy = curstack;
while (--i >= 0) {
(IS_FLT_DBL_TYPE(copy->type)) ? farg++ : iarg++;
copy = copy->prev;
}
- stackargs += (iarg < m->registerdata->intreg_argnum) ?
- 0 : (iarg - m->registerdata->intreg_argnum);
- stackargs += (farg < m->registerdata->fltreg_argnum) ?
- 0 : (farg - m->registerdata->fltreg_argnum);
+ /* calculate stack space required */
+
+ stackargs += (iarg < INT_ARG_CNT) ?
+ 0 : (iarg - INT_ARG_CNT);
+ stackargs += (farg < FLT_ARG_CNT) ?
+ 0 : (farg - FLT_ARG_CNT);
i = iptr->op1;
copy = curstack;
while (--i >= 0) {
if (!(copy->flags & SAVEDVAR)) {
copy->varkind = ARGVAR;
+
if (IS_FLT_DBL_TYPE(copy->type)) {
- if (--farg < m->registerdata->fltreg_argnum) {
+ if (--farg < FLT_ARG_CNT)
copy->varnum = farg;
- } else {
- copy->varnum = --stackargs + m->registerdata->intreg_argnum;
- }
+ else
+ copy->varnum = --stackargs + FLT_ARG_CNT;
+
} else {
- if (--iarg < m->registerdata->intreg_argnum) {
+ if (--iarg < INT_ARG_CNT)
copy->varnum = iarg;
- } else {
- copy->varnum = --stackargs + m->registerdata->intreg_argnum;
- }
+ else
+ copy->varnum = --stackargs + INT_ARG_CNT;
}
+
} else {
(IS_FLT_DBL_TYPE(copy->type)) ? --farg : --iarg;
}
copy = copy->prev;
}
}
-#else
+#else /* defined(__X86_64__) */
copy = curstack;
while (--i >= 0) {
- if (! (copy->flags & SAVEDVAR)) {
+ if (!(copy->flags & SAVEDVAR)) {
copy->varkind = ARGVAR;
copy->varnum = i;
}
copy = copy->prev;
}
-#endif
+#endif /* defined(__X86_64__) */
while (copy) {
copy->flags |= SAVEDVAR;
copy = copy->prev;
}
i = iptr->op1;
POPMANY(i);
- if (lm->returntype != TYPE_VOID) {
+ if (lm->returntype != TYPE_VOID)
OP0_1(lm->returntype);
- }
break;
}
+ case ICMD_INLINE_START:
+ case ICMD_INLINE_END:
+ SETDST;
+ break;
case ICMD_BUILTIN3:
/* DEBUG */ /*dolog("builtin3");*/
REQUIRE_3;
- if (! (curstack->flags & SAVEDVAR)) {
+ if (!(curstack->flags & SAVEDVAR)) {
curstack->varkind = ARGVAR;
curstack->varnum = 2;
}
- if (3 > m->registerdata->arguments_num) {
- m->registerdata->arguments_num = 3;
+ if (3 > rd->arguments_num) {
+ rd->arguments_num = 3;
}
OP1_0ANY;
case ICMD_BUILTIN2:
+#if defined(USEBUILTINTABLE) || !SUPPORT_DIVISION
+ /* Just prevent a compiler warning... */
builtin2:
+#endif
REQUIRE_2;
/* DEBUG */ /*dolog("builtin2");*/
if (!(curstack->flags & SAVEDVAR)) {
curstack->varkind = ARGVAR;
curstack->varnum = 1;
}
- if (2 > m->registerdata->arguments_num) {
- m->registerdata->arguments_num = 2;
+ if (2 > rd->arguments_num) {
+ rd->arguments_num = 2;
}
OP1_0ANY;
case ICMD_BUILTIN1:
+#if defined(USEBUILTINTABLE)
+ /* Just prevent a compiler warning... */
builtin1:
+#endif
REQUIRE_1;
/* DEBUG */ /*dolog("builtin1");*/
if (!(curstack->flags & SAVEDVAR)) {
curstack->varkind = ARGVAR;
curstack->varnum = 0;
}
- if (1 > m->registerdata->arguments_num) {
- m->registerdata->arguments_num = 1;
+ if (1 > rd->arguments_num) {
+ rd->arguments_num = 1;
}
OP1_0ANY;
copy = curstack;
case ICMD_MULTIANEWARRAY:
i = iptr->op1;
REQUIRE(i);
- if ((i + m->registerdata->intreg_argnum) > m->registerdata->arguments_num)
- m->registerdata->arguments_num = i + m->registerdata->intreg_argnum;
+ if ((i + INT_ARG_CNT) > rd->arguments_num)
+ rd->arguments_num = i + INT_ARG_CNT;
copy = curstack;
while (--i >= 0) {
/* check INT type here? Currently typecheck does this. */
- if (! (copy->flags & SAVEDVAR)) {
+ if (!(copy->flags & SAVEDVAR)) {
copy->varkind = ARGVAR;
- copy->varnum = i + m->registerdata->intreg_argnum;
+ copy->varnum = i + INT_ARG_CNT;
}
copy = copy->prev;
}
break;
case ICMD_CLEAR_ARGREN:
- for (i = iptr->op1; i<m->maxlocals; i++)
+ for (i = iptr->op1; i < cd->maxlocals; i++)
argren[i] = i;
iptr->opc = opcode = ICMD_NOP;
SETDST;
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;
+ 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;
/* DEBUGGING HELPERS */
/**********************************************************************/
-void icmd_print_stack(methodinfo *m, stackptr s)
+void icmd_print_stack(codegendata *cd, stackptr s)
{
int i, j;
stackptr t;
- i = m->maxstack;
+ i = cd->maxstack;
t = s;
while (t) {
i--;
t = t->prev;
}
- j = m->maxstack - i;
+ j = cd->maxstack - i;
while (--i >= 0)
printf(" ");
while (s) {
case TEMPVAR:
if (s->flags & INMEMORY)
printf(" M%02d", s->regoff);
- else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL))
+ else if (IS_FLT_DBL_TYPE(s->type))
printf(" F%02d", s->regoff);
else {
printf(" %3s", regs[s->regoff]);
case TEMPVAR:
if (s->flags & INMEMORY)
printf(" m%02d", s->regoff);
- else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL))
+ else if (IS_FLT_DBL_TYPE(s->type))
printf(" f%02d", s->regoff);
else {
printf(" %3s", regs[s->regoff]);
};
-void show_icmd_method(methodinfo *m)
+void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd)
{
int i, j;
basicblock *bptr;
printf(".");
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("\n\nMax locals: %d\n", (int) cd->maxlocals);
+ printf("Max stack: %d\n", (int) cd->maxstack);
- printf ("Line number table length: %d\n", m->linenumbercount);
+ 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("Exceptions (Number: %d):\n", cd->exceptiontablelength);
+ for (ex = cd->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 < m->maxlocals; i++) {
+ printf("Local Table:\n");
+ for (i = 0; i < cd->maxlocals; i++) {
printf(" %3d: ", i);
for (j = TYPE_INT; j <= TYPE_ADR; j++)
- if (m->registerdata->locals[i][j].type >= 0) {
+ if (rd->locals[i][j].type >= 0) {
printf(" (%s) ", jit_type[j]);
- if (m->registerdata->locals[i][j].flags & INMEMORY)
- printf("m%2d", m->registerdata->locals[i][j].regoff);
+ if (rd->locals[i][j].flags & INMEMORY)
+ printf("m%2d", rd->locals[i][j].regoff);
else if ((j == TYPE_FLT) || (j == TYPE_DBL))
- printf("f%02d", m->registerdata->locals[i][j].regoff);
+ printf("f%02d", rd->locals[i][j].regoff);
else {
- printf("%3s", regs[m->registerdata->locals[i][j].regoff]);
+ printf("%3s", regs[rd->locals[i][j].regoff]);
}
}
printf("\n");
}
printf("\n");
-
- printf ("Interface Table:\n");
- 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)) {
+#ifdef LSRA
+ if (!opt_lsra) {
+#endif
+ printf("Interface Table:\n");
+ for (i = 0; i < cd->maxstack; i++) {
+ if ((rd->interfaces[i][0].type >= 0) ||
+ (rd->interfaces[i][1].type >= 0) ||
+ (rd->interfaces[i][2].type >= 0) ||
+ (rd->interfaces[i][3].type >= 0) ||
+ (rd->interfaces[i][4].type >= 0)) {
printf(" %3d: ", i);
for (j = TYPE_INT; j <= TYPE_ADR; j++)
- if (m->registerdata->interfaces[i][j].type >= 0) {
+ if (rd->interfaces[i][j].type >= 0) {
printf(" (%s) ", jit_type[j]);
- 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);
+ if (rd->interfaces[i][j].flags & SAVEDVAR) {
+ if (rd->interfaces[i][j].flags & INMEMORY)
+ printf("M%2d", rd->interfaces[i][j].regoff);
else if ((j == TYPE_FLT) || (j == TYPE_DBL))
- printf("F%02d", m->registerdata->interfaces[i][j].regoff);
+ printf("F%02d", rd->interfaces[i][j].regoff);
else {
- printf("%3s", regs[m->registerdata->interfaces[i][j].regoff]);
+ printf("%3s", regs[rd->interfaces[i][j].regoff]);
}
}
else {
- if (m->registerdata->interfaces[i][j].flags & INMEMORY)
- printf("m%2d", m->registerdata->interfaces[i][j].regoff);
+ if (rd->interfaces[i][j].flags & INMEMORY)
+ printf("m%2d", rd->interfaces[i][j].regoff);
else if ((j == TYPE_FLT) || (j == TYPE_DBL))
- printf("f%02d", m->registerdata->interfaces[i][j].regoff);
+ printf("f%02d", rd->interfaces[i][j].regoff);
else {
- printf("%3s", regs[m->registerdata->interfaces[i][j].regoff]);
+ printf("%3s", regs[rd->interfaces[i][j].regoff]);
}
}
}
}
}
printf("\n");
-
+#ifdef LSRA
+ }
+#endif
if (showdisassemble) {
#if defined(__I386__) || defined(__X86_64__)
u1 *u1ptr;
s4 a;
- u1ptr = m->mcode + m->codegendata->dseglen;
- for (i = 0; i < m->basicblocks[0].mpc; i++, u1ptr++) {
- a = disassinstr(u1ptr, i);
+ u1ptr = (u1 *) ((ptrint) m->mcode + cd->dseglen);
+ for (i = 0; i < m->basicblocks[0].mpc;) {
+ a = disassinstr(u1ptr);
i += a;
u1ptr += a;
}
printf("\n");
+#elif defined(__XDSPCORE__)
+ s4 *s4ptr;
+ s4 a;
+
+ s4ptr = (s4 *) ((ptrint) m->mcode + cd->dseglen);
+ for (i = 0; i < m->basicblocks[0].mpc;) {
+ a = disassinstr(stdout, s4ptr);
+ printf("\n");
+ i += a * 4;
+ s4ptr += a;
+ }
+ printf("\n");
#else
s4 *s4ptr;
- s4ptr = (s4 *) (m->mcode + m->codegendata->dseglen);
+ s4ptr = (s4 *) ((ptrint) m->mcode + cd->dseglen);
for (i = 0; i < m->basicblocks[0].mpc; i += 4, s4ptr++) {
- disassinstr(s4ptr, i);
+ disassinstr(s4ptr);
}
printf("\n");
#endif
}
for (bptr = m->basicblocks; bptr != NULL; bptr = bptr->next) {
- show_icmd_block(m, bptr);
+ show_icmd_block(m, cd, bptr);
}
}
-void show_icmd_block(methodinfo *m, basicblock *bptr)
+void show_icmd_block(methodinfo *m, codegendata *cd, basicblock *bptr)
{
int i, j;
int deadcode;
deadcode = bptr->flags <= BBREACHED;
printf("[");
if (deadcode)
- for (j = m->maxstack; j > 0; j--)
+ for (j = cd->maxstack; j > 0; j--)
printf(" ? ");
else
- icmd_print_stack(m, bptr->instack);
+ icmd_print_stack(cd, 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++) {
printf("[");
if (deadcode) {
- for (j = m->maxstack; j > 0; j--)
+ for (j = cd->maxstack; j > 0; j--)
printf(" ? ");
}
else
- icmd_print_stack(m, iptr->dst);
+ icmd_print_stack(cd, iptr->dst);
printf("] %4d ", i);
show_icmd(iptr, deadcode);
printf("\n");
printf("\n");
i = bptr->mpc;
- u1ptr = m->mcode + m->codegendata->dseglen + i;
+ u1ptr = (u1 *) ((ptrint) m->mcode + cd->dseglen + i);
if (bptr->next != NULL) {
- for (; i < bptr->next->mpc; i++, u1ptr++) {
- a = disassinstr(u1ptr, i);
+ for (; i < bptr->next->mpc; ) {
+ a = disassinstr(u1ptr);
i += a;
u1ptr += a;
}
printf("\n");
} else {
- for (; u1ptr < (u1 *) (m->mcode + m->mcodelength); i++, u1ptr++) {
- a = disassinstr(u1ptr, i);
+ for (; u1ptr < (u1 *) ((ptrint) m->mcode + m->mcodelength); ) {
+ a = disassinstr(u1ptr);
i += a;
u1ptr += a;
}
printf("\n");
}
-#else
+#elif defined(__XDSPCORE__)
s4 *s4ptr;
+ s4 a;
printf("\n");
i = bptr->mpc;
- s4ptr = (s4 *) (m->mcode + m->codegendata->dseglen + i);
+ s4ptr = (s4 *) ((ptrint) m->mcode + cd->dseglen + i);
if (bptr->next != NULL) {
- for (; i < bptr->next->mpc; i += 4, s4ptr++) {
- disassinstr(s4ptr, i);
+ for (; i < bptr->next->mpc;) {
+ a = disassinstr(stdout, s4ptr);
+ printf("\n");
+ i += a * 4;
+ s4ptr += a;
}
printf("\n");
} else {
- for (; s4ptr < (s4 *) (m->mcode + m->mcodelength); i += 4, s4ptr++) {
- disassinstr(s4ptr, i);
+ for (; s4ptr < (s4 *) ((ptrint) m->mcode + m->mcodelength); ) {
+ a = disassinstr(stdout, s4ptr);
+ i += a * 4;
+ s4ptr += a;
}
printf("\n");
}
+#else
+ s4 *s4ptr;
+
+ printf("\n");
+ i = bptr->mpc;
+ s4ptr = (s4 *) ((ptrint) m->mcode + cd->dseglen + i);
+
+ if (bptr->next != NULL) {
+ for (; i < bptr->next->mpc; i += 4, s4ptr++)
+ disassinstr(s4ptr);
+ printf("\n");
+
+ } else {
+ for (; s4ptr < (s4 *) ((ptrint) m->mcode + m->mcodelength); i += 4, s4ptr++)
+ disassinstr(s4ptr);
+ printf("\n");
+ }
#endif
}
}
case ICMD_IADDCONST:
case ICMD_ISUBCONST:
case ICMD_IMULCONST:
+ case ICMD_IMULPOW2:
case ICMD_IDIVPOW2:
case ICMD_IREMPOW2:
case ICMD_IANDCONST:
case ICMD_LADDCONST:
case ICMD_LSUBCONST:
case ICMD_LMULCONST:
+ case ICMD_LMULPOW2:
case ICMD_LDIVPOW2:
case ICMD_LREMPOW2:
case ICMD_LANDCONST:
case ICMD_LXORCONST:
case ICMD_LCONST:
case ICMD_LASTORECONST:
-#if defined(__I386__)
+#if defined(__I386__) && defined(__POWERPC__)
printf(" %lld", iptr->val.l);
#else
printf(" %ld", iptr->val.l);
printf(")");
break;
+ case ICMD_PUTSTATICCONST:
+ case ICMD_PUTFIELDCONST:
+ switch (iptr[1].opc) {
+ case TYPE_INT:
+ printf(" %d,", iptr->val.i);
+ break;
+ case TYPE_LNG:
+#if defined(__I386__) && defined(__POWERPC__)
+ printf(" %lld,", iptr->val.l);
+#else
+ printf(" %ld,", iptr->val.l);
+#endif
+ break;
+ case TYPE_ADR:
+#if defined(__I386__) && defined(__POWERPC__)
+ printf(" 0x%08x,", iptr->val.a);
+#else
+ printf(" 0x%016lx,", iptr->val.a);
+#endif
+ break;
+ case TYPE_FLT:
+ printf(" %g,", iptr->val.f);
+ break;
+ case TYPE_DBL:
+ printf(" %g,", iptr->val.d);
+ break;
+ }
+ if (iptr->opc == ICMD_PUTFIELDCONST)
+ printf(" %d,", ((fieldinfo *) iptr[1].val.a)->offset);
+ utf_fprint(stdout, ((fieldinfo *) iptr[1].val.a)->class->name);
+ printf(".");
+ utf_fprint(stdout, ((fieldinfo *) iptr[1].val.a)->name);
+ printf(" (type ");
+ utf_fprint(stdout, ((fieldinfo *) iptr[1].val.a)->descriptor);
+ printf(")");
+ break;
+
case ICMD_IINC:
printf(" %d + %d", iptr->op1, iptr->val.i);
break;
}
break;
+ case ICMD_INLINE_START:
+ printf("\t\t\t%s.%s%s depth=%i",iptr->method->class->name->text,iptr->method->name->text,iptr->method->descriptor->text, iptr->op1);
+ break;
+ case ICMD_INLINE_END:
+ break;
+
case ICMD_BUILTIN3:
case ICMD_BUILTIN2:
case ICMD_BUILTIN1:
- printf(" %s", icmd_builtin_name((functionptr) iptr->val.a));
+ printf(" %s", icmd_builtin_name((functionptr) iptr->val.fp));
break;
case ICMD_INVOKEVIRTUAL:
}
break;
}
-/* printf(" Line number: %d, method:",iptr->line); */
-/* utf_display(iptr->method->class->name); */
-/* printf("."); */
-/* utf_display(iptr->method->name); */
+ printf(" Line number: %d, method:",iptr->line);
+/* printf("\t\t");
+ utf_display(iptr->method->class->name);
+ printf(".");
+ utf_display(iptr->method->name); */
}