-/* vm/jit/stack.c - stack analysis
+/* src/vm/jit/stack.c - stack analysis
Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
Authors: Andreas Krall
Changes: Edwin Steiner
+ Christian Thalinger
- $Id: stack.c 2013 2005-03-07 11:39:11Z twisti $
+ $Id: stack.c 2333 2005-04-22 13:26:36Z twisti $
*/
#include "disass.h"
#include "types.h"
+#include "codegen.h"
#include "mm/memory.h"
#include "native/native.h"
#include "toolbox/logging.h"
#include "vm/global.h"
#include "vm/builtin.h"
#include "vm/options.h"
+#include "vm/resolve.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"
+#include "vm/jit/lsra.h"
/**********************************************************************/
void* *tptr;
s4 *argren;
+ s4 call_argcount;
+ s4 call_returntype;
+
+#ifdef LSRA
+ m->maxlifetimes = 0;
+#endif
+
argren = DMNEW(s4, cd->maxlocals); /* table for argument renaming */
for (i = 0; i < cd->maxlocals; i++)
argren[i] = i;
NEWXSTACK;
}
-#ifdef CONDITIONAL_LOADCONST
+#if CONDITIONAL_LOADCONST
b_count = m->basicblockcount;
bptr = m->basicblocks;
while (--b_count >= 0) {
}
bptr++;
}
-#endif
+#endif /* CONDITIONAL_LOADCONST */
do {
b_index = bptr - m->basicblocks;
while (--len >= 0) {
opcode = iptr->opc;
- iptr->target = NULL;
+ /* XXX TWISTI: why is this set to NULL here? */
+ /* iptr->target = NULL; */
/* dolog("p: %04d op: %s stack: %p", iptr - instr, icmd_names[opcode], curstack); */
iptr[0].opc = ICMD_IADDCONST;
icmd_iconst_tail:
iptr[1].opc = ICMD_NOP;
- OP1_1(TYPE_INT,TYPE_INT);
+ OP1_1(TYPE_INT, TYPE_INT);
COUNT(count_pcmd_op);
break;
case ICMD_ISUB:
iptr[0].opc = ICMD_ISUBCONST;
goto icmd_iconst_tail;
-#if SUPPORT_MUL_CONST
+#if SUPPORT_CONST_MUL
case ICMD_IMUL:
iptr[0].opc = ICMD_IMULCONST;
goto icmd_iconst_tail;
-#endif /* SUPPORT_MUL_CONST */
+#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;
}
PUSHCONST(TYPE_INT);
break;
-#if SUPPORT_LOGICAL_CONST
+#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_LOGICAL_CONST */
+#endif /* SUPPORT_CONST_LOGICAL */
case ICMD_ISHL:
iptr[0].opc = ICMD_ISHLCONST;
goto icmd_iconst_tail;
iptr[0].op1 = iptr[1].op1;
bptr->icount--;
len--;
+#if 1
/* iptr[1].opc = ICMD_NOP; */
OP1_0(TYPE_INT);
tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
MARKREACHED(tbptr, copy);
COUNT(count_pcmd_bra);
+#else
+ goto icmd_if;
+#endif
break;
case ICMD_IF_ICMPLT:
iptr[0].opc = ICMD_IFLT;
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
+#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;
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 */
+ case ICMD_PUTSTATIC:
+ case ICMD_PUTFIELD:
+#if SUPPORT_CONST_STORE_ZERO_ONLY
+ if (iptr[0].val.i == 0) {
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
+ switch (iptr[1].opc) {
+ case ICMD_PUTSTATIC:
+ iptr[0].opc = ICMD_PUTSTATICCONST;
+ SETDST;
+ break;
+ case ICMD_PUTFIELD:
+ iptr[0].opc = ICMD_PUTFIELDCONST;
+ OP1_0(TYPE_ADR);
+ break;
+ }
+
+ iptr[1].opc = ICMD_NOP;
+ iptr[0].op1 = TYPE_INT;
+ COUNT(count_pcmd_op);
+#if SUPPORT_CONST_STORE_ZERO_ONLY
+ } else
+ PUSHCONST(TYPE_INT);
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
+ break;
+#endif /* SUPPORT_CONST_STORE */
default:
PUSHCONST(TYPE_INT);
}
iptr[0].opc = ICMD_LSUBCONST;
goto icmd_lconst_tail;
#endif /* SUPPORT_LONG_ADD */
-#if SUPPORT_LONG_MUL && SUPPORT_MUL_CONST
+#if SUPPORT_LONG_MUL && SUPPORT_CONST_MUL
case ICMD_LMUL:
iptr[0].opc = ICMD_LMULCONST;
goto icmd_lconst_tail;
-#endif /* SUPPORT_LONG_MUL && SUPPORT_MUL_CONST */
+#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)
PUSHCONST(TYPE_LNG);
break;
#endif /* SUPPORT_LONG_DIV */
-#if SUPPORT_LONG_LOG
-#if SUPPORT_LOGICAL_CONST
+#if SUPPORT_LONG_LOGICAL && SUPPORT_CONST_LOGICAL
case ICMD_LAND:
iptr[0].opc = ICMD_LANDCONST;
case ICMD_LXOR:
iptr[0].opc = ICMD_LXORCONST;
goto icmd_lconst_tail;
-#endif /* SUPPORT_LOGICAL_CONST */
-#endif /* SUPPORT_LONG_LOG */
+#endif /* SUPPORT_LONG_LOGICAL && SUPPORT_CONST_LOGICAL */
#if !defined(NOLONG_CONDITIONAL)
case ICMD_LCMP:
if ((len > 1) && (iptr[2].val.i == 0)) {
break;
#endif /* !defined(NOLONG_CONDITIONAL) */
-#if SUPPORT_CONST_ASTORE
+#if SUPPORT_CONST_STORE
case ICMD_LASTORE:
-#if SUPPORT_ONLY_ZERO_ASTORE
+#if SUPPORT_CONST_STORE_ZERO_ONLY
if (iptr[0].val.l == 0) {
-#endif /* SUPPORT_ONLY_ZERO_ASTORE */
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
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
+#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 */
+ case ICMD_PUTSTATIC:
+ case ICMD_PUTFIELD:
+#if SUPPORT_CONST_STORE_ZERO_ONLY
+ if (iptr[0].val.l == 0) {
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
+ switch (iptr[1].opc) {
+ case ICMD_PUTSTATIC:
+ iptr[0].opc = ICMD_PUTSTATICCONST;
+ SETDST;
+ break;
+ case ICMD_PUTFIELD:
+ iptr[0].opc = ICMD_PUTFIELDCONST;
+ OP1_0(TYPE_ADR);
+ break;
+ }
+
+ iptr[1].opc = ICMD_NOP;
+ iptr[0].op1 = TYPE_LNG;
+ COUNT(count_pcmd_op);
+#if SUPPORT_CONST_STORE_ZERO_ONLY
+ } else
+ PUSHCONST(TYPE_LNG);
+#endif /* SUPPORT_CONST_STORE_ZERO_ONLY */
+ break;
+#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.fp == 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;
+ OPTT2_0(TYPE_INT, TYPE_ADR);
+ break;
+ case ICMD_PUTSTATIC:
+ iptr[0].opc = ICMD_PUTSTATICCONST;
+ iptr[0].op1 = TYPE_ADR;
+ SETDST;
+ break;
+ case ICMD_PUTFIELD:
+ iptr[0].opc = ICMD_PUTFIELDCONST;
+ iptr[0].op1 = TYPE_ADR;
+ OP1_0(TYPE_ADR);
+ 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;
case ICMD_IFGE:
case ICMD_IFGT:
case ICMD_IFLE:
+#if 0
+ icmd_if:
+#endif
COUNT(count_pcmd_bra);
-#ifdef CONDITIONAL_LOADCONST
- {
- tbptr = m->basicblocks + b_index;
- if ((b_count >= 3) &&
- ((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) == m->basicblockindex[iptr[2].op1]) &&
- (tbptr[2].pre_count == 1) &&
- (iptr[3].opc == ICMD_ICONST)) {
- OP1_1(TYPE_INT, TYPE_INT);
- switch (iptr[0].opc) {
- case ICMD_IFEQ:
- iptr[0].opc = ICMD_IFNE_ICONST;
- break;
- case ICMD_IFNE:
- iptr[0].opc = ICMD_IFEQ_ICONST;
- break;
- case ICMD_IFLT:
- iptr[0].opc = ICMD_IFGE_ICONST;
- break;
- case ICMD_IFGE:
- iptr[0].opc = ICMD_IFLT_ICONST;
- break;
- case ICMD_IFGT:
- iptr[0].opc = ICMD_IFLE_ICONST;
- break;
- case ICMD_IFLE:
- iptr[0].opc = ICMD_IFGT_ICONST;
- break;
- }
- iptr[0].val.i = iptr[1].val.i;
- iptr[1].opc = ICMD_ELSE_ICONST;
- iptr[1].val.i = iptr[3].val.i;
- iptr[2].opc = ICMD_NOP;
- iptr[3].opc = ICMD_NOP;
- tbptr[1].flags = BBDELETED;
- tbptr[2].flags = BBDELETED;
- tbptr[1].icount = 0;
- tbptr[2].icount = 0;
- if (tbptr[3].pre_count == 2) {
- len += tbptr[3].icount + 3;
- bptr->icount += tbptr[3].icount + 3;
- tbptr[3].flags = BBDELETED;
- tbptr[3].icount = 0;
- b_index++;
- }
- else {
- bptr->icount++;
- len ++;
- }
- b_index += 2;
+#if CONDITIONAL_LOADCONST
+ tbptr = m->basicblocks + b_index;
+ if ((b_count >= 3) &&
+ ((b_index + 2) == m->basicblockindex[iptr[0].op1]) &&
+ (tbptr[1].pre_count == 1) &&
+ (tbptr[1].iinstr[0].opc == ICMD_ICONST) &&
+ (tbptr[1].iinstr[1].opc == ICMD_GOTO) &&
+ ((b_index + 3) == m->basicblockindex[tbptr[1].iinstr[1].op1]) &&
+ (tbptr[2].pre_count == 1) &&
+ (tbptr[2].iinstr[0].opc == ICMD_ICONST)) {
+ OP1_1(TYPE_INT, TYPE_INT);
+ switch (iptr[0].opc) {
+ case ICMD_IFEQ:
+ iptr[0].opc = ICMD_IFNE_ICONST;
+ break;
+ case ICMD_IFNE:
+ iptr[0].opc = ICMD_IFEQ_ICONST;
+ break;
+ case ICMD_IFLT:
+ iptr[0].opc = ICMD_IFGE_ICONST;
+ break;
+ case ICMD_IFGE:
+ iptr[0].opc = ICMD_IFLT_ICONST;
+ break;
+ case ICMD_IFGT:
+ iptr[0].opc = ICMD_IFLE_ICONST;
+ break;
+ case ICMD_IFLE:
+ iptr[0].opc = ICMD_IFGT_ICONST;
break;
}
- }
+#if 1
+ iptr[0].val.i = iptr[1].val.i;
+ iptr[1].opc = ICMD_ELSE_ICONST;
+ iptr[1].val.i = iptr[3].val.i;
+ iptr[2].opc = ICMD_NOP;
+ iptr[3].opc = ICMD_NOP;
+#else
+ /* HACK: save compare value in iptr[1].op1 */
+ iptr[1].op1 = iptr[0].val.i;
+ iptr[0].val.i = tbptr[1].iinstr[0].val.i;
+ iptr[1].opc = ICMD_ELSE_ICONST;
+ iptr[1].val.i = tbptr[2].iinstr[0].val.i;
+ tbptr[1].iinstr[0].opc = ICMD_NOP;
+ tbptr[1].iinstr[1].opc = ICMD_NOP;
+ tbptr[2].iinstr[0].opc = ICMD_NOP;
#endif
+ tbptr[1].flags = BBDELETED;
+ tbptr[2].flags = BBDELETED;
+ tbptr[1].icount = 0;
+ tbptr[2].icount = 0;
+ if (tbptr[3].pre_count == 2) {
+ len += tbptr[3].icount + 3;
+ bptr->icount += tbptr[3].icount + 3;
+ tbptr[3].flags = BBDELETED;
+ tbptr[3].icount = 0;
+ b_index++;
+ }
+ else {
+ bptr->icount++;
+ len ++;
+ }
+ b_index += 2;
+ break;
+ }
+#endif /* CONDITIONAL_LOADCONST */
+
OP1_0(TYPE_INT);
tbptr = m->basicblocks + m->basicblockindex[iptr->op1];
case ICMD_LMUL:
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;
break;
/* pop many push any */
-
+ case ICMD_BUILTIN3:
+ call_argcount = 3;
+ call_returntype = iptr->op1;
+ goto _callhandling;
+ case ICMD_BUILTIN2:
+#if defined(USEBUILTINTABLE) || !SUPPORT_DIVISION
+ /* Just prevent a compiler warning... */
+ builtin2:
+#endif
+ call_argcount = 2;
+ call_returntype = iptr->op1;
+ goto _callhandling;
+ case ICMD_BUILTIN1:
+#if defined(USEBUILTINTABLE)
+ /* Just prevent a compiler warning... */
+ builtin1:
+#endif
+ call_argcount = 1;
+ call_returntype = iptr->op1;
+ goto _callhandling;
+
case ICMD_INVOKEVIRTUAL:
case ICMD_INVOKESPECIAL:
case ICMD_INVOKEINTERFACE:
case ICMD_INVOKESTATIC:
COUNT(count_pcmd_met);
{
+#if defined(__X86_64__) || defined(__I386__)
+ unresolved_method *um = iptr->target;
+/* if (lm->flags & ACC_STATIC) */
+/* {COUNT(count_check_null);} */
+ call_argcount = iptr->op1;
+ call_returntype = um->methodref->parseddesc.md->returntype.type;
+#else
methodinfo *lm = iptr->val.a;
if (lm->flags & ACC_STATIC)
{COUNT(count_check_null);}
- i = iptr->op1;
+ call_argcount = iptr->op1;
+ call_returntype = lm->returntype;
+#endif
+
+ _callhandling:
+ i = call_argcount;
+
if (i > rd->arguments_num)
rd->arguments_num = i;
REQUIRE(i);
-#if defined(__X86_64__)
- {
- s4 iarg = 0;
- 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;
- }
-
- /* calculate stack space required */
- stackargs += (iarg < INT_ARG_CNT) ?
- 0 : (iarg - INT_ARG_CNT);
- stackargs += (farg < FLT_ARG_CNT) ?
- 0 : (farg - FLT_ARG_CNT);
+ /* Macro in codegen.h */
+ SET_ARG_STACKSLOTS;
- i = iptr->op1;
- copy = curstack;
- while (--i >= 0) {
- if (!(copy->flags & SAVEDVAR)) {
- copy->varkind = ARGVAR;
-
- if (IS_FLT_DBL_TYPE(copy->type)) {
- if (--farg < FLT_ARG_CNT) {
- copy->varnum = farg;
-
- } else {
- copy->varnum = --stackargs + FLT_ARG_CNT;
- }
-
- } else {
- if (--iarg < INT_ARG_CNT) {
- copy->varnum = iarg;
-
- } else {
- copy->varnum = --stackargs + INT_ARG_CNT;
- }
- }
-
- } else {
- (IS_FLT_DBL_TYPE(copy->type)) ? --farg : --iarg;
- }
- copy = copy->prev;
- }
- }
-#else
- copy = curstack;
- while (--i >= 0) {
- if (!(copy->flags & SAVEDVAR)) {
- copy->varkind = ARGVAR;
- copy->varnum = i;
- }
- copy = copy->prev;
- }
-#endif
while (copy) {
copy->flags |= SAVEDVAR;
copy = copy->prev;
}
- i = iptr->op1;
+ i = call_argcount;
+
POPMANY(i);
- if (lm->returntype != TYPE_VOID) {
- OP0_1(lm->returntype);
- }
+ if (call_returntype != TYPE_VOID)
+ OP0_1(call_returntype);
break;
}
+
case ICMD_INLINE_START:
case ICMD_INLINE_END:
SETDST;
break;
- case ICMD_BUILTIN3:
- /* DEBUG */ /*dolog("builtin3");*/
- REQUIRE_3;
- if (!(curstack->flags & SAVEDVAR)) {
- curstack->varkind = ARGVAR;
- curstack->varnum = 2;
- }
- 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 > 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 > rd->arguments_num) {
- rd->arguments_num = 1;
- }
- OP1_0ANY;
- copy = curstack;
- while (copy) {
- copy->flags |= SAVEDVAR;
- copy = copy->prev;
- }
- if (iptr->op1 != TYPE_VOID)
- OP0_1(iptr->op1);
- break;
-
case ICMD_MULTIANEWARRAY:
+ if (rd->argintreguse < 3)
+ rd->argintreguse = 3;
+
i = iptr->op1;
REQUIRE(i);
+#ifdef SPECIALMEMUSE
+ if (rd->ifmemuse < (i + rd->intreg_argnum + 6))
+ rd->ifmemuse = i + rd->intreg_argnum + 6;
+#else
+ if (rd->ifmemuse < i)
+ rd->ifmemuse = i; /* n integer args spilled on stack */
+#endif
if ((i + INT_ARG_CNT) > rd->arguments_num)
rd->arguments_num = i + INT_ARG_CNT;
copy = curstack;
if (!(copy->flags & SAVEDVAR)) {
copy->varkind = ARGVAR;
copy->varnum = i + INT_ARG_CNT;
+ copy->flags|=INMEMORY;
+#ifdef SPECIALMEMUSE
+ copy->regoff = i + rd->intreg_argnum + 6;
+#else
+ copy->regoff = i;
+#endif
}
copy = copy->prev;
}
case TEMPVAR:
if (s->flags & INMEMORY)
printf(" M%02d", s->regoff);
+#ifdef HAS_ADDRESS_REGISTER_FILE
+ else if (s->type == TYPE_ADR)
+ printf(" R%02d", s->regoff);
+#endif
else if (IS_FLT_DBL_TYPE(s->type))
printf(" F%02d", s->regoff);
else {
break;
case ARGVAR:
printf(" A%02d", s->varnum);
+#ifdef INVOKE_NEW_DEBUG
+ if (s->flags & INMEMORY)
+ printf("(M%i)", s->regoff);
+ else
+ printf("(R%i)", s->regoff);
+#endif
break;
default:
printf(" !%02d", j);
case TEMPVAR:
if (s->flags & INMEMORY)
printf(" m%02d", s->regoff);
+#ifdef HAS_ADDRESS_REGISTER_FILE
+ else if (s->type == TYPE_ADR)
+ printf(" r%02d", s->regoff);
+#endif
else if (IS_FLT_DBL_TYPE(s->type))
printf(" f%02d", s->regoff);
else {
break;
case ARGVAR:
printf(" a%02d", s->varnum);
+#ifdef INVOKE_NEW_DEBUG
+ if (s->flags & INMEMORY)
+ printf("(M%i)", s->regoff);
+ else
+ printf("(R%i)", s->regoff);
+#endif
break;
default:
printf(" ?%02d", j);
printf(" (%s) ", jit_type[j]);
if (rd->locals[i][j].flags & INMEMORY)
printf("m%2d", rd->locals[i][j].regoff);
+#ifdef HAS_ADDRESS_REGISTER_FILE
+ else if (j == TYPE_ADR)
+ printf("r%02d", rd->locals[i][j].regoff);
+#endif
else if ((j == TYPE_FLT) || (j == TYPE_DBL))
printf("f%02d", rd->locals[i][j].regoff);
else {
if (rd->interfaces[i][j].flags & SAVEDVAR) {
if (rd->interfaces[i][j].flags & INMEMORY)
printf("M%2d", rd->interfaces[i][j].regoff);
+#ifdef HAS_ADDRESS_REGISTER_FILE
+ else if (j == TYPE_ADR)
+ printf("R%02d", rd->interfaces[i][j].regoff);
+#endif
else if ((j == TYPE_FLT) || (j == TYPE_DBL))
printf("F%02d", rd->interfaces[i][j].regoff);
else {
else {
if (rd->interfaces[i][j].flags & INMEMORY)
printf("m%2d", rd->interfaces[i][j].regoff);
+#ifdef HAS_ADDRESS_REGISTER_FILE
+ else if (j == TYPE_ADR)
+ printf("r%02d", rd->interfaces[i][j].regoff);
+#endif
else if ((j == TYPE_FLT) || (j == TYPE_DBL))
printf("f%02d", rd->interfaces[i][j].regoff);
else {
s4ptr = (s4 *) ((ptrint) m->mcode + cd->dseglen);
for (i = 0; i < m->basicblocks[0].mpc;) {
- a = disassinstr(s4ptr);
+ a = disassinstr(stdout, s4ptr);
printf("\n");
i += a * 4;
s4ptr += a;
else
icmd_print_stack(cd, iptr->dst);
printf("] %4d ", i);
+
+#ifdef LSRA_EDX
+ if (icmd_uses_tmp[iptr->opc][0])
+ printf(" ---");
+ else
+ printf(" EAX");
+ if (icmd_uses_tmp[iptr->opc][1])
+ printf(" ---");
+ else
+ printf(" ECX");
+ if (icmd_uses_tmp[iptr->opc][2])
+ printf(" --- ");
+ else
+ printf(" EDX ");
+#endif
+
show_icmd(iptr, deadcode);
printf("\n");
}
if (bptr->next != NULL) {
for (; i < bptr->next->mpc;) {
- a = disassinstr(s4ptr);
+ a = disassinstr(stdout, s4ptr);
printf("\n");
i += a * 4;
s4ptr += a;
} else {
for (; s4ptr < (s4 *) ((ptrint) m->mcode + m->mcodelength); ) {
- a = disassinstr(s4ptr);
+ a = disassinstr(stdout, s4ptr);
i += a * 4;
s4ptr += a;
}
case ICMD_IADDCONST:
case ICMD_ISUBCONST:
case ICMD_IMULCONST:
+ case ICMD_IMULPOW2:
case ICMD_IDIVPOW2:
case ICMD_IREMPOW2:
case ICMD_IANDCONST:
case ICMD_LUSHRCONST:
case ICMD_ICONST:
case ICMD_ELSE_ICONST:
+ case ICMD_IASTORECONST:
+ case ICMD_BASTORECONST:
+ case ICMD_CASTORECONST:
+ case ICMD_SASTORECONST:
+ printf(" %d (0x%08x)", iptr->val.i, iptr->val.i);
+ break;
+
case ICMD_IFEQ_ICONST:
case ICMD_IFNE_ICONST:
case ICMD_IFLT_ICONST:
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);
+ printf("(%d) %d", iptr[1].op1, iptr->val.i);
break;
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__)
- printf(" %lld", iptr->val.l);
+#if defined(__I386__) || defined(__POWERPC__)
+ printf(" %lld (0x%016llx)", iptr->val.l, iptr->val.l);
#else
- printf(" %ld", iptr->val.l);
+ printf(" %ld (0x%016lx)", iptr->val.l, iptr->val.l);
#endif
break;
case ICMD_GETFIELD:
case ICMD_PUTFIELD:
- printf(" %d,", ((fieldinfo *) iptr->val.a)->offset);
- case ICMD_PUTSTATIC:
+#if defined(__X86_64__) || defined(__I386__)
+ if (iptr->val.a)
+ printf(" %d,", ((fieldinfo *) iptr->val.a)->offset);
+ else
+ printf(" NOT RESOLVED,");
+#else
+ printf(" %d,", ((fieldinfo *) iptr->val.a)->offset);
+ printf(" ");
+ utf_display_classname(((fieldinfo *) iptr->val.a)->class->name);
+ printf(".");
+ utf_display(((fieldinfo *) iptr->val.a)->name);
+ printf(" (type ");
+ utf_display(((fieldinfo *) iptr->val.a)->descriptor);
+ printf(")");
+ break;
+#endif
+ case ICMD_PUTSTATIC:
case ICMD_GETSTATIC:
+#if defined(__X86_64__) || defined(__I386__)
+ printf(" ");
+ utf_display_classname(((unresolved_field *) iptr->target)->fieldref->classref->name);
+ printf(".");
+ utf_display(((unresolved_field *) iptr->target)->fieldref->name);
+ printf(" (type ");
+ utf_display(((unresolved_field *) iptr->target)->fieldref->descriptor);
+ printf(")");
+#else
+ printf(" ");
+ utf_display_classname(((fieldinfo *) iptr->val.a)->class->name);
+ printf(".");
+ utf_display(((fieldinfo *) iptr->val.a)->name);
+ printf(" (type ");
+ utf_display(((fieldinfo *) iptr->val.a)->descriptor);
+ printf(")");
+#endif
+ break;
+
+ case ICMD_PUTSTATICCONST:
+ case ICMD_PUTFIELDCONST:
+ switch (iptr[1].op1) {
+ 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:
+ printf(" %p,", iptr->val.a);
+ break;
+ case TYPE_FLT:
+ printf(" %g,", iptr->val.f);
+ break;
+ case TYPE_DBL:
+ printf(" %g,", iptr->val.d);
+ break;
+ }
+#if defined(__X86_64__)
+ if (iptr->opc == ICMD_PUTFIELDCONST)
+ printf(" NOT RESOLVED,");
+ printf(" ");
+ utf_display_classname(((unresolved_field *) iptr[1].target)->fieldref->classref->name);
+ printf(".");
+ utf_display(((unresolved_field *) iptr[1].target)->fieldref->name);
+ printf(" (type ");
+ utf_display(((unresolved_field *) iptr[1].target)->fieldref->descriptor);
+ printf(")");
+#else
+ if (iptr->opc == ICMD_PUTFIELDCONST)
+ printf(" %d,", ((fieldinfo *) iptr[1].val.a)->offset);
printf(" ");
- utf_fprint(stdout, ((fieldinfo *) iptr->val.a)->class->name);
+ utf_display_classname(((fieldinfo *) iptr[1].val.a)->class->name);
printf(".");
- utf_fprint(stdout, ((fieldinfo *) iptr->val.a)->name);
+ utf_display(((fieldinfo *) iptr[1].val.a)->name);
printf(" (type ");
- utf_fprint(stdout, ((fieldinfo *) iptr->val.a)->descriptor);
+ utf_display(((fieldinfo *) iptr[1].val.a)->descriptor);
printf(")");
+#endif
break;
case ICMD_IINC:
case ICMD_NEW:
printf(" ");
- utf_fprint(stdout,
- ((classinfo *) iptr->val.a)->name);
+ utf_display_classname(((classinfo *) iptr->val.a)->name);
break;
case ICMD_NEWARRAY:
case ICMD_ANEWARRAY:
if (iptr->op1) {
printf(" ");
- utf_fprint(stdout,
- ((classinfo *) iptr->val.a)->name);
+ utf_display_classname(((classinfo *) iptr->val.a)->name);
}
break;
printf(" %d ",iptr->op1);
vft = (vftbl_t *)iptr->val.a;
if (vft)
- utf_fprint(stdout,vft->class->name);
+ utf_display_classname(vft->class->name);
else
printf("<null>");
}
case ICMD_CHECKCAST:
case ICMD_INSTANCEOF:
+#if defined(__X86_64__) || defined(__I386__)
+ if (iptr->op1) {
+ classinfo *c = iptr->val.a;
+ if (c) {
+ if (c->flags & ACC_INTERFACE)
+ printf(" (INTERFACE) ");
+ else
+ printf(" (CLASS,%3d) ", c->vftbl->diffval);
+ } else {
+ printf(" (NOT RESOLVED) ");
+ }
+ utf_display_classname(((constant_classref *) iptr->target)->name);
+ }
+ break;
+#endif
if (iptr->op1) {
classinfo *c = iptr->val.a;
if (c->flags & ACC_INTERFACE)
printf(" (INTERFACE) ");
else
printf(" (CLASS,%3d) ", c->vftbl->diffval);
- utf_fprint(stdout, c->name);
+ utf_display_classname(c->name);
}
break;
case ICMD_INVOKESPECIAL:
case ICMD_INVOKESTATIC:
case ICMD_INVOKEINTERFACE:
+#if defined(__X86_64__) || defined(__I386__)
printf(" ");
- utf_fprint(stdout,
- ((methodinfo *) iptr->val.a)->class->name);
+ utf_display_classname(((unresolved_method *) iptr->target)->methodref->classref->name);
printf(".");
- utf_fprint(stdout,
- ((methodinfo *) iptr->val.a)->name);
+ utf_display(((unresolved_method *) iptr->target)->methodref->name);
+ utf_display(((unresolved_method *) iptr->target)->methodref->descriptor);
+#else
+ printf(" ");
+ utf_display_classname(((methodinfo *) iptr->val.a)->class->name);
+ printf(".");
+ utf_display(((methodinfo *) iptr->val.a)->name);
+ utf_display(((methodinfo *) iptr->val.a)->descriptor);
+#endif
break;
case ICMD_IFEQ: