X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fparse.h;h=c7d561dbb8ebfafcd6dd7633d46d46918ca5317a;hb=ff4083aaec535fb7a937e3221a42782959586644;hp=4decb5ec2d4d5dc52c1f683b4aa7b0197a388c6a;hpb=45635de8f37ea5b4113181b446d746c9f8502436;p=cacao.git diff --git a/src/vm/jit/parse.h b/src/vm/jit/parse.h index 4decb5ec2..c7d561dbb 100644 --- a/src/vm/jit/parse.h +++ b/src/vm/jit/parse.h @@ -25,10 +25,9 @@ Contact: cacao@cacaojvm.org Author: Christian Thalinger + Edwin Steiner - Changes: Edwin Steiner - - $Id: parse.h 5096 2006-07-10 14:02:25Z twisti $ + $Id: parse.h 5959 2006-11-12 13:31:14Z edwin $ */ @@ -79,33 +78,29 @@ goto throw_invalid_bytecode_index; \ } while (0) -#else /* !define(ENABLE_VERIFIER) */ +#else /* !defined(ENABLE_VERIFIER) */ #define INDEX_ONEWORD(num) #define INDEX_TWOWORD(num) #define CHECK_BYTECODE_INDEX(i) #define CHECK_BYTECODE_INDEX_EXCLUSIVE(i) -#endif /* define(ENABLE_VERIFIER) */ +#endif /* defined(ENABLE_VERIFIER) */ /* basic block generating macro ***********************************************/ -#define new_block_insert(i) \ - do { \ - if (!(jd->new_basicblockindex[(i)] & 1)) { \ - b_count++; \ - jd->new_basicblockindex[(i)] |= 1; \ - } \ +#define MARK_BASICBLOCK(i) \ + do { \ + if (!(jd->basicblockindex[(i)] & 1)) { \ + b_count++; \ + jd->basicblockindex[(i)] |= 1; \ + } \ } while (0) -#define block_insert(i) \ - do { \ - if (!(m->basicblockindex[(i)] & 1)) { \ - b_count++; \ - m->basicblockindex[(i)] |= 1; \ - } \ - } while (0) +#define INSTRUCTIONS_CHECK(i) \ + if ((ipc + (i)) > pd.instructionslength) \ + iptr = parse_realloc_instructions(&pd, ipc, (i)) /* intermediate code generating macros ****************************************/ @@ -123,275 +118,167 @@ /* The _PREPARE macros omit the PINC, so you can set additional fields */ /* afterwards. */ -/* CAUTION: Some of the _PREPARE macros don't set iptr->flags! */ -#define PINC \ +#define PINC \ iptr++; ipc++ -/* CAUTION: You must set iptr->flags yourself when using this! */ -#define NEW_OP_PREPARE(o) \ - iptr->opc = (o); \ - iptr->line = currentline; +#define OP_PREPARE_FLAGS(o, f) \ + iptr->opc = (o); \ + iptr->line = currentline; \ + iptr->flags.bits = (f) | (ipc << INS_FLAG_ID_SHIFT); + +#define OP_PREPARE_ZEROFLAGS(o) \ + OP_PREPARE_FLAGS(o, 0) -#define NEW_OP_PREPARE_ZEROFLAGS(o) \ - iptr->opc = (o); \ - iptr->line = currentline; \ - iptr->flags.bits = 0; +#define OP_PREPARE(o) \ + OP_PREPARE_ZEROFLAGS(o) -#define NEW_OP(o) \ - NEW_OP_PREPARE_ZEROFLAGS(o); \ +#define OP(o) \ + OP_PREPARE_ZEROFLAGS(o); \ PINC -#define NEW_OP_LOADCONST_I(v) \ - NEW_OP_PREPARE_ZEROFLAGS(ICMD_ICONST); \ - iptr->sx.val.i = (v); \ +#define OP_LOADCONST_I(v) \ + OP_PREPARE_ZEROFLAGS(ICMD_ICONST); \ + iptr->sx.val.i = (v); \ PINC -#define NEW_OP_LOADCONST_L(v) \ - NEW_OP_PREPARE_ZEROFLAGS(ICMD_LCONST); \ - iptr->sx.val.l = (v); \ +#define OP_LOADCONST_L(v) \ + OP_PREPARE_ZEROFLAGS(ICMD_LCONST); \ + iptr->sx.val.l = (v); \ PINC -#define NEW_OP_LOADCONST_F(v) \ - NEW_OP_PREPARE_ZEROFLAGS(ICMD_FCONST); \ - iptr->sx.val.f = (v); \ +#define OP_LOADCONST_F(v) \ + OP_PREPARE_ZEROFLAGS(ICMD_FCONST); \ + iptr->sx.val.f = (v); \ PINC -#define NEW_OP_LOADCONST_D(v) \ - NEW_OP_PREPARE_ZEROFLAGS(ICMD_DCONST); \ - iptr->sx.val.d = (v); \ +#define OP_LOADCONST_D(v) \ + OP_PREPARE_ZEROFLAGS(ICMD_DCONST); \ + iptr->sx.val.d = (v); \ PINC -#define NEW_OP_LOADCONST_NULL() \ - NEW_OP_PREPARE_ZEROFLAGS(ICMD_ACONST); \ - iptr->sx.val.anyptr = NULL; \ +#define OP_LOADCONST_NULL() \ + OP_PREPARE_FLAGS(ICMD_ACONST, INS_FLAG_CHECK); \ + iptr->sx.val.anyptr = NULL; \ PINC -#define NEW_OP_LOADCONST_STRING(v) \ - NEW_OP_PREPARE_ZEROFLAGS(ICMD_ACONST); \ - iptr->sx.val.stringconst = (v); \ +#define OP_LOADCONST_STRING(v) \ + OP_PREPARE_FLAGS(ICMD_ACONST, INS_FLAG_CHECK); \ + iptr->sx.val.stringconst = (v); \ PINC -#define NEW_OP_LOADCONST_CLASSINFO_OR_CLASSREF(c, cr, extraflags) \ - NEW_OP_PREPARE(ICMD_ACONST); \ - if (c) { \ - iptr->sx.val.c.cls = (c); \ - iptr->flags.bits = INS_FLAG_CLASS | (extraflags); \ - } \ - else { \ - iptr->sx.val.c.ref = (cr); \ - iptr->flags.bits = INS_FLAG_CLASS | INS_FLAG_UNRESOLVED \ - | (extraflags); \ - } \ +#define OP_LOADCONST_CLASSINFO_OR_CLASSREF_FLAGS(cl, cr, extraflags) \ + OP_PREPARE(ICMD_ACONST); \ + if (cl) { \ + iptr->sx.val.c.cls = (cl); \ + iptr->flags.bits |= INS_FLAG_CLASS | (extraflags); \ + } \ + else { \ + iptr->sx.val.c.ref = (cr); \ + iptr->flags.bits |= INS_FLAG_CLASS | INS_FLAG_UNRESOLVED \ + | (extraflags); \ + } \ PINC -#define NEW_OP_S3_CLASSINFO_OR_CLASSREF(o, c, cr, extraflags) \ - NEW_OP_PREPARE(o); \ - if (c) { \ - iptr->sx.s23.s3.c.cls= (c); \ - iptr->flags.bits = (extraflags); \ - } \ - else { \ - iptr->sx.s23.s3.c.ref= (cr); \ - iptr->flags.bits = INS_FLAG_UNRESOLVED | (extraflags); \ - } \ +#define OP_LOADCONST_CLASSINFO_OR_CLASSREF_CHECK(c, cr) \ + OP_LOADCONST_CLASSINFO_OR_CLASSREF_FLAGS((c), (cr), INS_FLAG_CHECK) + +#define OP_LOADCONST_CLASSINFO_OR_CLASSREF_NOCHECK(c, cr) \ + OP_LOADCONST_CLASSINFO_OR_CLASSREF_FLAGS((c), (cr), 0) + +#define OP_S3_CLASSINFO_OR_CLASSREF(o, c, cr, extraflags) \ + OP_PREPARE(o); \ + if (c) { \ + iptr->sx.s23.s3.c.cls= (c); \ + iptr->flags.bits |= (extraflags); \ + } \ + else { \ + iptr->sx.s23.s3.c.ref= (cr); \ + iptr->flags.bits |= INS_FLAG_UNRESOLVED | (extraflags); \ + } \ PINC -#define NEW_OP_INSINDEX(o, iindex) \ - NEW_OP_PREPARE_ZEROFLAGS(o); \ - iptr->dst.insindex = (iindex); \ +#define OP_INSINDEX(o, iindex) \ + OP_PREPARE_ZEROFLAGS(o); \ + iptr->dst.insindex = (iindex); \ PINC -#define NEW_OP_LOCALINDEX(o,index) \ - NEW_OP_PREPARE_ZEROFLAGS(o); \ - iptr->s1.localindex = (index); \ +# define OP_LOCALINDEX(o,index) \ + OP_PREPARE_ZEROFLAGS(o); \ + iptr->s1.varindex = (index); \ PINC -#define NEW_OP_LOCALINDEX_I(o,index,v) \ - NEW_OP_PREPARE_ZEROFLAGS(o); \ - iptr->s1.localindex = (index); \ - iptr->sx.val.i = (v); \ +# define OP_LOCALINDEX_I(o,index,v) \ + OP_PREPARE_ZEROFLAGS(o); \ + iptr->s1.varindex = (index); \ + iptr->sx.val.i = (v); \ PINC -#define NEW_OP_LOAD_ONEWORD(o,index) \ - do { \ - INDEX_ONEWORD(index); \ - NEW_OP_LOCALINDEX(o,index); \ +# define LOCALTYPE_USED(index,type) \ + do { \ + local_map[(index) * 5 + (type)] = 1; \ } while (0) -#define NEW_OP_LOAD_TWOWORD(o,index) \ - do { \ - INDEX_TWOWORD(index); \ - NEW_OP_LOCALINDEX(o,index); \ +#define OP_LOAD_ONEWORD(o,index,type) \ + do { \ + INDEX_ONEWORD(index); \ + OP_LOCALINDEX(o,index); \ + LOCALTYPE_USED(index,type); \ } while (0) -#define NEW_OP_STORE_ONEWORD(o,index) \ - do { \ - INDEX_ONEWORD(index); \ - NEW_OP_LOCALINDEX(o,index); \ +#define OP_LOAD_TWOWORD(o,index,type) \ + do { \ + INDEX_TWOWORD(index); \ + OP_LOCALINDEX(o,index); \ + LOCALTYPE_USED(index,type); \ } while (0) -#define NEW_OP_STORE_TWOWORD(o,index) \ - do { \ - INDEX_TWOWORD(index); \ - NEW_OP_LOCALINDEX(o,index); \ +# define OP_STORE_ONEWORD(o,index,type) \ + do { \ + INDEX_ONEWORD(index); \ + OP_PREPARE_ZEROFLAGS(o); \ + iptr->dst.varindex = (index); \ + LOCALTYPE_USED(index,type); \ + PINC; \ } while (0) -#define NEW_OP_BUILTIN_CHECK_EXCEPTION(bte) \ - jd->isleafmethod = false; \ - NEW_OP_PREPARE_ZEROFLAGS(ICMD_BUILTIN); \ - iptr->sx.s23.s3.bte = (bte); \ +# define OP_STORE_TWOWORD(o,index,type) \ + do { \ + INDEX_TWOWORD(index); \ + OP_PREPARE_ZEROFLAGS(o); \ + iptr->dst.varindex = (index); \ + LOCALTYPE_USED(index,type); \ + PINC; \ + } while (0) + +#define OP_BUILTIN_CHECK_EXCEPTION(bte) \ + jd->isleafmethod = false; \ + OP_PREPARE_FLAGS(ICMD_BUILTIN, INS_FLAG_CHECK); \ + iptr->sx.s23.s3.bte = (bte); \ PINC -#define NEW_OP_BUILTIN_NO_EXCEPTION(bte) \ - jd->isleafmethod = false; \ - NEW_OP_PREPARE(ICMD_BUILTIN); \ - iptr->sx.s23.s3.bte = (bte); \ - iptr->flags.bits = INS_FLAG_NOCHECK; \ +#define OP_BUILTIN_NO_EXCEPTION(bte) \ + jd->isleafmethod = false; \ + OP_PREPARE_ZEROFLAGS(ICMD_BUILTIN); \ + iptr->sx.s23.s3.bte = (bte); \ PINC -#define NEW_OP_BUILTIN_ARITHMETIC(opcode, bte) \ - jd->isleafmethod = false; \ - NEW_OP_PREPARE_ZEROFLAGS(opcode); \ - iptr->sx.s23.s3.bte = (bte); \ +#define OP_BUILTIN_ARITHMETIC(opcode, bte) \ + jd->isleafmethod = false; \ + OP_PREPARE_FLAGS(opcode, INS_FLAG_CHECK); \ + iptr->sx.s23.s3.bte = (bte); \ PINC /* CAUTION: You must set iptr->flags yourself when using this! */ -#define NEW_OP_FMIREF_PREPARE(o, fmiref) \ - NEW_OP_PREPARE(o); \ +#define OP_FMIREF_PREPARE(o, fmiref) \ + OP_PREPARE(o); \ iptr->sx.s23.s3.fmiref = (fmiref); -/* old macros for intermediate code generation ********************************/ - -#define LOADCONST_I(v) \ - iptr->opc = ICMD_ICONST; \ - iptr->val.i = (v); \ - iptr->line = currentline; \ - PINC - -#define LOADCONST_L(v) \ - iptr->opc = ICMD_LCONST; \ - iptr->val.l = (v); \ - iptr->line = currentline; \ - PINC - -#define LOADCONST_F(v) \ - iptr->opc = ICMD_FCONST; \ - iptr->val.f = (v); \ - iptr->line = currentline; \ - PINC - -#define LOADCONST_D(v) \ - iptr->opc = ICMD_DCONST; \ - iptr->val.d = (v); \ - iptr->line = currentline; \ - PINC - -#define LOADCONST_A(v) \ - iptr->opc = ICMD_ACONST; \ - iptr->val.a = (v); \ - iptr->line = currentline; \ - PINC - -/* ACONST instructions generated as arguments for builtin functions - * have op1 set to non-zero. This is used for stack overflow checking - * in stack.c. */ -/* XXX in the new instruction format use a flag for this */ -/* XXX target used temporarily as flag */ -#define LOADCONST_A_BUILTIN(c,cr) \ - iptr->opc = ICMD_ACONST; \ - iptr->op1 = 1; \ - iptr->line = currentline; \ - if (c) { \ - iptr->val.a = c; iptr->target = (void*) 0x02; \ - } \ - else { \ - iptr->val.a = cr; iptr->target = (void*) 0x03; \ - } \ - PINC - -#define OP(o) \ - iptr->opc = (o); \ - iptr->line = currentline; \ - PINC - -#define OP1(o,o1) \ - iptr->opc = (o); \ - iptr->op1 = (o1); \ - iptr->line = currentline; \ - PINC - -#define OP2I(o,o1,v) \ - iptr->opc = (o); \ - iptr->op1 = (o1); \ - iptr->val.i = (v); \ - iptr->line = currentline; \ - PINC - -#define OP2A_NOINC(o,o1,v,l) \ - iptr->opc = (o); \ - iptr->op1 = (o1); \ - iptr->val.a = (v); \ - iptr->line = (l); - -#define OP2A(o,o1,v,l) \ - OP2A_NOINC(o,o1,v,l); \ - PINC - -#define OP2AT(o,o1,v,t,l) \ - OP2A_NOINC(o,o1,v,l); \ - iptr->target = (t); \ - PINC - -#define BUILTIN(v,o1,t,l) \ - jd->isleafmethod = false; \ - iptr->opc = ICMD_BUILTIN; \ - iptr->op1 = (o1); \ - iptr->val.a = (v); \ - iptr->target = (t); \ - iptr->line = (l); \ - PINC - -#define OP1LOAD_ONEWORD(o,o1) \ - do { \ - INDEX_ONEWORD(o1); \ - OP1(o,o1); \ - } while (0) - -#define OP1LOAD_TWOWORD(o,o1) \ - do { \ - INDEX_TWOWORD(o1); \ - OP1(o,o1); \ - } while (0) - -#define OP1STORE_ONEWORD(o,o1) \ - do { \ - INDEX_ONEWORD(o1); \ - OP1(o,o1); \ - } while (0) - -#define OP1STORE_TWOWORD(o,o1) \ - do { \ - INDEX_TWOWORD(o1); \ - OP1(o,o1); \ - } while (0) - - -/* macros for byte code fetching *********************************************** - - fetch a byte code of given size from position p in code array jcode -*******************************************************************************/ +/* external macros ************************************************************/ -#define code_get_u1(p,m) m->jcode[p] -#define code_get_s1(p,m) ((s1)m->jcode[p]) -#define code_get_u2(p,m) ((((u2)m->jcode[p]) << 8) + m->jcode[p + 1]) -#define code_get_s2(p,m) ((s2)((((u2)m->jcode[p]) << 8) + m->jcode[p + 1])) -#define code_get_u4(p,m) ((((u4)m->jcode[p]) << 24) + (((u4)m->jcode[p + 1]) << 16) \ - +(((u4)m->jcode[p + 2]) << 8) + m->jcode[p + 3]) -#define code_get_s4(p,m) ((s4)((((u4)m->jcode[p]) << 24) + (((u4)m->jcode[p + 1]) << 16) \ - +(((u4)m->jcode[p + 2]) << 8) + m->jcode[p + 3])) -/* XXX read 32bit aligned big-endian values directly */ +#define BLOCK_OF(index) \ + (jd->basicblocks + jd->basicblockindex[index]) /* function prototypes ********************************************************/