X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fjit.h;h=692bfaee52da728a40fbf5158bef5b09c96a0142;hb=bccee68a74e6205d3ed40502953693b49b7ec3aa;hp=c59dfc0cbfc6f47b410ff185f961d6a7b481d644;hpb=64477c7ad27597b72616021b3b27f66aa8149ae5;p=cacao.git diff --git a/src/vm/jit/jit.h b/src/vm/jit/jit.h index c59dfc0cb..692bfaee5 100644 --- a/src/vm/jit/jit.h +++ b/src/vm/jit/jit.h @@ -29,7 +29,7 @@ Changes: Christian Thalinger - $Id: jit.h 605 2003-11-11 23:06:33Z twisti $ + $Id: jit.h 1274 2004-07-05 17:24:40Z twisti $ */ @@ -37,9 +37,10 @@ #ifndef _JIT_H #define _JIT_H -#include "global.h" #include "toolbox/chain.h" - +#include "global.h" +#include "builtin.h" +#include "typeinfo.h" /**************************** resolve typedef-cycles **************************/ @@ -53,17 +54,21 @@ typedef struct branchref branchref; typedef struct jumpref jumpref; typedef struct dataref dataref; typedef varinfo *varinfoptr; +typedef struct linenumberref linenumberref; /************************** stack element structure ***************************/ /* slot types */ -#define TYPE_INT 0 /* the stack slot types must numbered in the */ -#define TYPE_LNG 1 /* same order as the ICMD_Ixxx to ICMD_Axxx */ -#define TYPE_FLT 2 /* instructions (LOAD and STORE) */ -#define TYPE_DBL 3 /* integer, long, float, double, address */ -#define TYPE_ADR 4 +/* Unified these with longer names. Maybe someday use only + * one set of names? -Edwin + */ +/*#define TYPE_INT 0*/ /* the stack slot types must numbered in the */ +#define TYPE_LNG TYPE_LONG /*1*/ /* same order as the ICMD_Ixxx to ICMD_Axxx */ +#define TYPE_FLT TYPE_FLOAT /*2*/ /* instructions (LOAD and STORE) */ +#define TYPE_DBL TYPE_DOUBLE /*3*/ /* integer, long, float, double, address */ +#define TYPE_ADR TYPE_ADDRESS /*4*/ #define IS_INT_LNG_TYPE(a) (!((a)&TYPE_FLT)) #define IS_FLT_DBL_TYPE(a) ((a)&TYPE_FLT) @@ -88,6 +93,9 @@ typedef varinfo *varinfoptr; struct stackelement { stackptr prev; /* pointer to next element towards bottom */ int type; /* slot type of stack element */ +#ifdef CACAO_TYPECHECK + typeinfo typeinfo; /* info on reference types */ +#endif int flags; /* flags (SAVED, INMEMORY) */ int varkind; /* kind of variable or register */ int varnum; /* number of variable */ @@ -98,21 +106,18 @@ struct stackelement { /**************************** instruction structure ***************************/ struct instruction { - stackptr dst; /* stack index of destination operand stack */ - u2 opc; /* opcode of intermediate code command */ - s4 op1; /* first operand, usually variable number */ - - union { - s4 i; /* integer operand */ - s8 l; /* long operand */ - float f; /* float operand */ - double d; /* double operand */ - void *a; /* address operand */ - } val; /* immediate constant */ - - void *target; /* used for targets of branches and jumps */ - /* and as address for list of targets for */ - /* statements */ + stackptr dst; /* stack index of destination operand stack */ + u2 opc; /* opcode of intermediate code command */ + s4 op1; /* first operand, usually variable number */ + imm_union val; /* immediate constant */ + void *target; /* used for targets of branches and jumps */ + /* and as address for list of targets for */ + /* statements */ + u2 line; /* line number in source file */ + methodinfo *method; /* needed for inlining. can't be done on */ + /* basic block level, since an inlined */ + /* function doesn't start necessarily start */ + /* a new block */ }; @@ -124,6 +129,8 @@ struct instruction { #define BBUNDEF -1 #define BBREACHED 0 #define BBFINISHED 1 +#define BBTYPECHECK_UNDEF 2 +#define BBTYPECHECK_REACHED 3 #define BBTYPE_STD 0 /* standard basic block type */ #define BBTYPE_EXH 1 /* exception handler basic block type */ @@ -158,13 +165,12 @@ struct varinfo { int regoff; /* register number or memory offset */ }; -typedef varinfo varinfo5[5]; - /***************** forward references in branch instructions ******************/ struct branchref { s4 branchpos; /* patching position in code segment */ + s4 reg; /* used for ArrayIndexOutOfBounds index reg */ branchref *next; /* next element in branchref list */ }; @@ -177,6 +183,13 @@ struct jumpref { jumpref *next; /* next element in jumpref list */ }; +struct linenumberref { + s4 tablepos; /* patching position in data segment */ + int targetmpc; /* machine code program counter of first instruction for given line*/ + u2 linenumber; /* line number, used for inserting into the table and for validty checking*/ + linenumberref *next; /* next element in linenumberref list */ +}; + struct dataref { u1 *pos; /* patching position in generated code */ @@ -184,6 +197,11 @@ struct dataref { }; +/********** op1 values for ACONST instructions ********************************/ + +#define ACONST_LOAD 0 /* ACONST_NULL or LDC instruction */ +#define ACONST_BUILTIN 1 /* constant argument for a builtin function call */ + /********** JavaVM operation codes (sorted) and instruction lengths ***********/ extern char *icmd_names[256]; @@ -203,7 +221,6 @@ extern int jcommandsize[256]; #define ICMD_ICONST 3 /* val.i = constant */ #define JAVA_ICONST_1 4 -#define ICMD_IREM0X10001 4 #define JAVA_ICONST_2 5 #define ICMD_IDIVPOW2 5 /* val.i = constant */ @@ -214,7 +231,6 @@ extern int jcommandsize[256]; #define JAVA_ICONST_4 7 #define JAVA_ICONST_5 8 -#define ICMD_LREM0X10001 8 #define JAVA_LCONST_0 9 #define ICMD_LCONST 9 /* val.l = constant */ @@ -788,6 +804,23 @@ extern int jcommandsize[256]; #define JAVA_BREAKPOINT 202 +#define ICMD_CHECKEXCEPTION 203 /* check for an exception */ + +#define ICMD_IASTORECONST 204 + +#define ICMD_LASTORECONST 205 + +#define ICMD_FASTORECONST 206 + +#define ICMD_DASTORECONST 207 + +#define ICMD_AASTORECONST 208 + +#define ICMD_BASTORECONST 209 + +#define ICMD_CASTORECONST 210 + +#define ICMD_SASTORECONST 211 #define ICMD_BUILTIN3 253 /* internal opcode */ #define ICMD_BUILTIN2 254 /* internal opcode */ @@ -800,21 +833,7 @@ extern int jcommandsize[256]; #if defined(USEBUILTINTABLE) -typedef struct { - u1 opcode; - u1 type_s1; - u1 type_s2; - u1 type_d; - int icmd; - functionptr builtin; - bool supported; - bool isfloat; -} stdopdescriptor; - - -extern stdopdescriptor builtintable[]; - -stdopdescriptor *find_builtin(int icmd); +builtin_descriptor *find_builtin(int opcode); #endif /* USEBUILTINTABLE */ @@ -842,119 +861,15 @@ extern int nregdescfloat[]; /* description of floating point registers */ extern int nreg_parammode; -/* compiler switches (set by main function) ***********************************/ - -extern bool runverbose; /* trace all method invocation */ -extern bool compileverbose; /* trace compiler actions */ -extern bool showdisassemble; /* generate disassembler listing */ -extern bool showddatasegment; /* generate data segment listing */ -extern bool showintermediate; /* generate intermediate code listing */ -extern int optimizelevel; /* optimzation level (0 = no optimization) */ - -extern bool useinlining; /* use method inlining */ -extern bool inlinevirtuals; /* inline unique virtual methods */ -extern bool inlineexceptions; /* inline methods, that contain excptions */ -extern bool inlineparamopt; /* optimize parameter passing to inlined methods */ -extern bool inlineoutsiders; /* inline methods, that are not member of the invoker's class */ - - -extern bool checkbounds; /* check array bounds */ -extern bool opt_loops; /* optimize array accesses in loops */ -extern bool checknull; /* check null pointers */ -extern bool opt_noieee; /* don't implement ieee compliant floats */ -extern bool checksync; /* do synchronization */ - -extern bool getcompilingtime; /* compute compile time */ -extern long compilingtime; /* accumulated compile time */ - -extern int has_ext_instr_set; /* has instruction set extensions */ - -extern bool statistics; - -extern int count_jit_calls; -extern int count_methods; -extern int count_spills; -extern int count_pcmd_activ; -extern int count_pcmd_drop; -extern int count_pcmd_zero; -extern int count_pcmd_const_store; -extern int count_pcmd_const_alu; -extern int count_pcmd_const_bra; -extern int count_pcmd_load; -extern int count_pcmd_move; -extern int count_load_instruction; -extern int count_pcmd_store; -extern int count_pcmd_store_comb; -extern int count_dup_instruction; -extern int count_pcmd_op; -extern int count_pcmd_mem; -extern int count_pcmd_met; -extern int count_pcmd_bra; -extern int count_pcmd_table; -extern int count_pcmd_return; -extern int count_pcmd_returnx; -extern int count_check_null; -extern int count_check_bound; -extern int count_max_basic_blocks; -extern int count_basic_blocks; -extern int count_max_javainstr; -extern int count_javainstr; -extern int count_javacodesize; -extern int count_javaexcsize; -extern int count_calls; -extern int count_tryblocks; -extern int count_code_len; -extern int count_data_len; -extern int count_cstub_len; -extern int count_nstub_len; -extern int count_max_new_stack; -extern int count_upper_bound_new_stack; -extern int *count_block_stack; -extern int *count_analyse_iterations; -extern int *count_method_bb_distribution; -extern int *count_block_size_distribution; -extern int *count_store_length; -extern int *count_store_depth; - - -/* global compiler variables */ - -extern classinfo *class; /* class the compiled method belongs to */ -extern methodinfo *method; /* pointer to method info of compiled method */ -extern int mparamcount; /* number of parameters (incl. this) */ -extern u1 *mparamtypes; /* types of all parameters (TYPE_INT, ...) */ - -extern int maxstack; /* maximal JavaVM stack size */ -extern int maxlocals; /* maximal number of local JavaVM variables */ -extern int jcodelength; /* length of JavaVM-codes */ -extern u1 *jcode; /* pointer to start of JavaVM-code */ -extern int exceptiontablelength;/* length of exception table */ -extern xtable *extable; /* pointer to start of exception table */ -extern exceptiontable *raw_extable; - -extern int block_count; /* number of basic blocks */ -extern basicblock *block; /* points to basic block array */ -extern int *block_index; /* a table which contains for every byte of */ - /* JavaVM code a basic block index if at this */ - /* byte there is the start of a basic block */ - -extern int instr_count; /* number of JavaVM instructions */ -extern instruction *instr; /* points to intermediate code instructions */ - -extern int stack_count; /* number of stack elements */ -extern stackelement *stack; /* points to intermediate code instructions */ - -extern bool isleafmethod; /* true if a method doesn't call subroutines */ - -extern basicblock *last_block; /* points to the end of the BB list */ - -/* list of all classes used by the compiled method which have to be */ -/* initialised (if not already done) before execution of this method */ -extern chain *uninitializedclasses; - extern int stackreq[256]; +#if defined(__I386__) +extern bool method_uses_ecx; +extern bool method_uses_edx; +#endif + + /* function prototypes */ methodptr jit_compile (methodinfo *m); /* compile a method with jit compiler */