X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fstack.c;h=231d4ff1b96e967153f6d88b6ede760dfdf3905f;hb=e40eb14db560593ecc53c4b522f130ca1044d6fb;hp=809e69183e4fcf7524fa548a9991fc100d994b20;hpb=5e664f3be14891166934ea1c169d81eaba136ace;p=cacao.git diff --git a/src/vm/jit/stack.c b/src/vm/jit/stack.c index 809e69183..231d4ff1b 100644 --- a/src/vm/jit/stack.c +++ b/src/vm/jit/stack.c @@ -1,9 +1,9 @@ -/* 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. @@ -27,28 +27,33 @@ Authors: Andreas Krall Changes: Edwin Steiner + Christian Thalinger - $Id: stack.c 1456 2004-11-05 14:33:14Z twisti $ + $Id: stack.c 2333 2005-04-22 13:26:36Z twisti $ */ #include #include -#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 "codegen.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/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" /**********************************************************************/ @@ -93,6 +98,13 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -115,7 +127,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) NEWXSTACK; } -#ifdef CONDITIONAL_LOADCONST +#if CONDITIONAL_LOADCONST b_count = m->basicblockcount; bptr = m->basicblocks; while (--b_count >= 0) { @@ -182,7 +194,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) } bptr++; } -#endif +#endif /* CONDITIONAL_LOADCONST */ do { @@ -209,7 +221,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) } else if (bptr->indepth != stackdepth) { show_icmd_method(m, cd, rd); - printf("Block: %ld, required depth:%ld, current depth:%ld\n",bptr->debug_nr,bptr->indepth,stackdepth); + printf("Block: %d, required depth: %d, current depth: %d\n", bptr->debug_nr, bptr->indepth, stackdepth); panic("Stack depth mismatch"); } @@ -222,11 +234,12 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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); */ -#ifdef USEBUILTINTABLE +#if defined(USEBUILTINTABLE) { #if 0 stdopdescriptor *breplace; @@ -235,7 +248,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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: @@ -251,7 +264,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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: @@ -261,7 +274,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) } } } -#endif +#endif /* defined(USEBUILTINTABLE) */ switch (opcode) { @@ -299,15 +312,87 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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_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; @@ -411,13 +496,11 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) (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; @@ -427,6 +510,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -439,29 +523,21 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) #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].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]; @@ -470,6 +546,9 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) MARKREACHED(tbptr, copy); COUNT(count_pcmd_bra); +#else + goto icmd_if; +#endif break; case ICMD_IF_ICMPLT: iptr[0].opc = ICMD_IFLT; @@ -487,14 +566,14 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -513,13 +592,37 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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); } @@ -543,16 +646,84 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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) @@ -622,9 +793,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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) || @@ -660,15 +828,13 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) (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; @@ -678,16 +844,13 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -705,9 +868,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -728,24 +888,48 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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 +#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); } @@ -766,21 +950,43 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; + 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; @@ -801,10 +1007,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) /* 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: @@ -813,9 +1015,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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: @@ -825,20 +1024,19 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -866,18 +1064,20 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) i = opcode - ICMD_ISTORE; rd->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]++; +#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; @@ -902,10 +1102,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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); @@ -921,10 +1117,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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 */ @@ -963,9 +1155,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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 */ @@ -987,64 +1176,77 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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 +#endif /* CONDITIONAL_LOADCONST */ + OP1_0(TYPE_INT); tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; @@ -1093,9 +1295,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) } SETDST; superblockend = true; -#if defined(__I386__) - method_uses_ecx = true; -#endif break; /* pop 1 push 0 table branch */ @@ -1168,9 +1367,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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: @@ -1396,7 +1592,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) #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 @@ -1405,21 +1601,14 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) #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: @@ -1434,7 +1623,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) #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 @@ -1443,22 +1632,19 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) #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; @@ -1468,10 +1654,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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: @@ -1499,9 +1681,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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--; @@ -1517,9 +1696,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -1577,9 +1753,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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); @@ -1608,9 +1781,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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); @@ -1623,9 +1793,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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); @@ -1634,17 +1801,9 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -1658,9 +1817,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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 */ @@ -1668,9 +1824,6 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) case ICMD_GETSTATIC: COUNT(count_pcmd_mem); OP0_1(iptr->op1); -#if defined(__I386__) - method_uses_ecx = true; -#endif break; case ICMD_NEW: @@ -1699,143 +1852,101 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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(__I386__) - method_uses_ecx = true; -#endif { +#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; - - copy = curstack; - while (--i >= 0) { - (IS_FLT_DBL_TYPE(copy->type)) ? farg++ : iarg++; - copy = copy->prev; - } - stackargs += (iarg < rd->intreg_argnum) ? - 0 : (iarg - rd->intreg_argnum); - stackargs += (farg < rd->fltreg_argnum) ? - 0 : (farg - rd->fltreg_argnum); - - i = iptr->op1; - copy = curstack; - while (--i >= 0) { - if (!(copy->flags & SAVEDVAR)) { - copy->varkind = ARGVAR; - if (IS_FLT_DBL_TYPE(copy->type)) { - if (--farg < rd->fltreg_argnum) { - copy->varnum = farg; - } else { - copy->varnum = --stackargs + rd->intreg_argnum; - } - } else { - if (--iarg < rd->intreg_argnum) { - copy->varnum = iarg; - } else { - copy->varnum = --stackargs + rd->intreg_argnum; - } - } - } 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 + /* Macro in codegen.h */ + SET_ARG_STACKSLOTS; + 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_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: - builtin2: - 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: - builtin1: - 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_INLINE_START: + case ICMD_INLINE_END: + SETDST; + break; case ICMD_MULTIANEWARRAY: + if (rd->argintreguse < 3) + rd->argintreguse = 3; + i = iptr->op1; REQUIRE(i); - if ((i + rd->intreg_argnum) > rd->arguments_num) - rd->arguments_num = i + rd->intreg_argnum; +#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; 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 + rd->intreg_argnum; + 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; } @@ -1898,8 +2009,7 @@ methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd) 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; @@ -2002,7 +2112,11 @@ void icmd_print_stack(codegendata *cd, stackptr s) case TEMPVAR: if (s->flags & INMEMORY) printf(" M%02d", s->regoff); - else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL)) +#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 { printf(" %3s", regs[s->regoff]); @@ -2016,6 +2130,12 @@ void icmd_print_stack(codegendata *cd, stackptr s) 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); @@ -2025,7 +2145,11 @@ void icmd_print_stack(codegendata *cd, stackptr s) case TEMPVAR: if (s->flags & INMEMORY) printf(" m%02d", s->regoff); - else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL)) +#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 { printf(" %3s", regs[s->regoff]); @@ -2039,6 +2163,12 @@ void icmd_print_stack(codegendata *cd, stackptr s) 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); @@ -2148,6 +2278,10 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) 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 { @@ -2157,7 +2291,9 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) printf("\n"); } printf("\n"); - +#ifdef LSRA + if (!opt_lsra) { +#endif printf("Interface Table:\n"); for (i = 0; i < cd->maxstack; i++) { if ((rd->interfaces[i][0].type >= 0) || @@ -2172,6 +2308,10 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) 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 { @@ -2181,6 +2321,10 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) 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 { @@ -2192,25 +2336,39 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) } } printf("\n"); - +#ifdef LSRA + } +#endif if (showdisassemble) { #if defined(__I386__) || defined(__X86_64__) u1 *u1ptr; s4 a; - u1ptr = m->mcode + cd->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 + cd->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 @@ -2248,6 +2406,22 @@ void show_icmd_block(methodinfo *m, codegendata *cd, basicblock *bptr) 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"); } @@ -2259,43 +2433,66 @@ void show_icmd_block(methodinfo *m, codegendata *cd, basicblock *bptr) printf("\n"); i = bptr->mpc; - u1ptr = m->mcode + cd->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 + cd->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 } } @@ -2314,6 +2511,7 @@ void show_icmd(instruction *iptr, bool deadcode) case ICMD_IADDCONST: case ICMD_ISUBCONST: case ICMD_IMULCONST: + case ICMD_IMULPOW2: case ICMD_IDIVPOW2: case ICMD_IREMPOW2: case ICMD_IANDCONST: @@ -2327,22 +2525,26 @@ void show_icmd(instruction *iptr, bool deadcode) 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: @@ -2350,10 +2552,10 @@ void show_icmd(instruction *iptr, bool deadcode) 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; @@ -2372,16 +2574,87 @@ void show_icmd(instruction *iptr, bool deadcode) 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: @@ -2425,8 +2698,7 @@ void show_icmd(instruction *iptr, bool deadcode) case ICMD_NEW: printf(" "); - utf_fprint(stdout, - ((classinfo *) iptr->val.a)->name); + utf_display_classname(((classinfo *) iptr->val.a)->name); break; case ICMD_NEWARRAY: @@ -2461,8 +2733,7 @@ void show_icmd(instruction *iptr, bool deadcode) case ICMD_ANEWARRAY: if (iptr->op1) { printf(" "); - utf_fprint(stdout, - ((classinfo *) iptr->val.a)->name); + utf_display_classname(((classinfo *) iptr->val.a)->name); } break; @@ -2472,7 +2743,7 @@ void show_icmd(instruction *iptr, bool deadcode) 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(""); } @@ -2480,32 +2751,60 @@ void show_icmd(instruction *iptr, bool deadcode) 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_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: case ICMD_INVOKESPECIAL: case ICMD_INVOKESTATIC: case ICMD_INVOKEINTERFACE: +#if defined(__X86_64__) || defined(__I386__) + printf(" "); + utf_display_classname(((unresolved_method *) iptr->target)->methodref->classref->name); + printf("."); + utf_display(((unresolved_method *) iptr->target)->methodref->name); + utf_display(((unresolved_method *) iptr->target)->methodref->descriptor); +#else printf(" "); - utf_fprint(stdout, - ((methodinfo *) iptr->val.a)->class->name); + utf_display_classname(((methodinfo *) iptr->val.a)->class->name); printf("."); - utf_fprint(stdout, - ((methodinfo *) iptr->val.a)->name); + utf_display(((methodinfo *) iptr->val.a)->name); + utf_display(((methodinfo *) iptr->val.a)->descriptor); +#endif break; case ICMD_IFEQ: @@ -2616,11 +2915,11 @@ void show_icmd(instruction *iptr, bool deadcode) } break; } -/* printf(" Line number: %d, method:",iptr->line); */ - printf("\t\t"); + printf(" Line number: %d, method:",iptr->line); +/* printf("\t\t"); utf_display(iptr->method->class->name); printf("."); - utf_display(iptr->method->name); + utf_display(iptr->method->name); */ }