Merged revisions 8245-8298 via svnmerge from
[cacao.git] / src / vm / jit / jit.h
index 37d9c3bfa6943d824edaa39ff608108cdd42558a..a9dff9f3391bcb7769141d9f76e3ecfcdc69fa3a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jit.h 7483 2007-03-08 13:17:40Z michi $
+   $Id: jit.h 8295 2007-08-11 17:57:24Z michi $
 
 */
 
@@ -36,7 +36,6 @@ typedef struct jitdata jitdata;
 typedef struct stackelement stackelement;
 typedef stackelement *stackptr;
 typedef struct basicblock basicblock;
-typedef struct branchref branchref;
 typedef struct instruction instruction;
 typedef struct insinfo_inline insinfo_inline;
 typedef struct exception_entry exception_entry;
@@ -48,6 +47,7 @@ typedef struct exception_entry exception_entry;
 #include "toolbox/chain.h"
 
 #include "vm/global.h"
+#include "vm/resolve.h"
 
 #include "vm/jit/codegen-common.h"
 #include "vm/jit/reg.h"
@@ -71,7 +71,6 @@ typedef struct exception_entry exception_entry;
 
 #include "vmcore/method.h"
 #include "vmcore/references.h"
-#include "vm/resolve.h"
 
 #if defined(ENABLE_STATISTICS)
 # include "vmcore/statistics.h"
@@ -82,10 +81,26 @@ typedef struct exception_entry exception_entry;
 
 #if defined(ENABLE_STATISTICS)
 # define COUNT(x)        (x)++
-# define COUNT_SPILLS    count_spills++
+# define COUNT_SPILLS             /* use COUNT_(READ|WRITE)_SPILLS instead */
+# define COUNT_READ_SPILLS(var) \
+       switch(var->type) { \
+       case TYPE_FLT: count_spills_read_flt++; break; \
+       case TYPE_DBL: count_spills_read_dbl++; break; \
+       default: count_spills_read_ila++; break; \
+       }
+
+# define COUNT_WRITE_SPILLS(var) \
+       switch(var->type) { \
+       case TYPE_FLT: count_spills_write_flt++; break; \
+       case TYPE_DBL: count_spills_write_dbl++; break; \
+       default: count_spills_write_ila++; break; \
+       }
+
 #else
-# define COUNT(x)        /* nothing */
-# define COUNT_SPILLS    /* nothing */
+# define COUNT(x)                /* nothing */
+# define COUNT_SPILLS            /* nothing */
+# define COUNT_READ_SPILLS(x)    /* nothing */
+# define COUNT_WRITE_SPILLS(x)   /* nothing */
 #endif
 
 typedef struct interface_info interface_info;
@@ -115,8 +130,6 @@ struct jitdata {
 
        instruction     *instructions;    /* ICMDs, valid between parse and stack */
        basicblock      *basicblocks;     /* start of basic block list            */
-       s4              *basicblockindex; /* block index for each JavaPC          */
-                                      /* valid between parse and stack        */
        stackelement    *stack;           /* XXX should become stack.c internal   */
        s4               instructioncount;/* XXX remove this?                     */
        s4               basicblockcount; /* number of basic blocks               */
@@ -125,13 +138,15 @@ struct jitdata {
 
        varinfo         *var;             /* array of variables                   */
        s4               vartop;          /* next free index in var array         */
-    
+
        s4               varcount;        /* number of variables in var array     */
        s4               localcount;      /* number of locals at start of var ar. */
-    s4              *local_map;  /* internal structure to rename(de-coallesc) */
-                                               /* locals and keep the coalescing info for simplereg. */
-                           /* local_map[local_index * 5 + local_type] =          */
-                           /* new_index in rd->var or UNUSED                     */
+    s4              *local_map;       /* map for renaming (de-coallescing)    */
+                                        /* locals and keeping the coalescing info for simplereg. */
+                        /* local_map[javaindex * 5 + type] =                     */
+                        /*     >= 0......index into jd->var, or                  */
+                                        /*     UNUSED....this (javaindex,type) pair is not used  */
+
        s4               maxlocals;       /* max. number of javalocals            */
 
        interface_info  *interface_map;   /* interface variables (for simplereg)  */
@@ -262,8 +277,8 @@ struct stackelement {
 /* branch_target_t: used in TABLESWITCH tables */
 
 typedef union {
-    s4                         insindex; /* used between parse and stack      */
-    basicblock                *block;    /* used from stack analysis onwards  */
+    s4                         insindex; /* used in parse                     */
+    basicblock                *block;    /* valid after parse                 */
 } branch_target_t;
 
 /* lookup_target_t: used in LOOKUPSWITCH tables */
@@ -318,7 +333,7 @@ typedef union {
     float                     f;
     double                    d;
     void                     *anyptr;
-    java_objectheader        *stringconst;       /* for ACONST with string    */
+    java_handle_t            *stringconst;       /* for ACONST with string    */
     classref_or_classinfo     c;                 /* for ACONST with class     */
 } val_operand_t;
 
@@ -326,24 +341,25 @@ typedef union {
 
 typedef union {
        s4                         varindex;
-    basicblock                *block;       /* valid after stack analysis     */
+    basicblock                *block;       /* valid after parse              */
     branch_target_t           *table;       /* for TABLESWITCH                */
     lookup_target_t           *lookup;      /* for LOOKUPSWITCH               */
-    s4                         insindex;    /* used between parse and stack   */
+    s4                         insindex;    /* used in parse                  */
 } dst_operand_t;
 
 /*** flags (32 bits) ***/
 
-#define INS_FLAG_UNRESOLVED    0x01    /* contains unresolved field/meth/class*/
-#define INS_FLAG_CLASS         0x02    /* for ACONST, PUT*CONST with class    */
-#define INS_FLAG_ARRAY         0x04    /* for CHECKCAST/INSTANCEOF with array */
-#define INS_FLAG_CHECK         0x08    /* for *ALOAD|*ASTORE: check index     */
+#define INS_FLAG_BASICBLOCK    0x01    /* marks a basic block start           */
+#define INS_FLAG_UNRESOLVED    0x02    /* contains unresolved field/meth/class*/
+#define INS_FLAG_CLASS         0x04    /* for ACONST, PUT*CONST with class    */
+#define INS_FLAG_ARRAY         0x08    /* for CHECKCAST/INSTANCEOF with array */
+#define INS_FLAG_CHECK         0x10    /* for *ALOAD|*ASTORE: check index     */
                                        /* for BUILTIN: check exception        */
-#define INS_FLAG_KILL_PREV     0x02    /* for *STORE, invalidate prev local   */
-#define INS_FLAG_KILL_NEXT     0x04    /* for *STORE, invalidate next local   */
-#define INS_FLAG_RETADDR       0x08    /* for ASTORE: op is a returnAddress   */
+#define INS_FLAG_KILL_PREV     0x04    /* for *STORE, invalidate prev local   */
+#define INS_FLAG_KILL_NEXT     0x08    /* for *STORE, invalidate next local   */
+#define INS_FLAG_RETADDR       0x10    /* for ASTORE: op is a returnAddress   */
 
-#define INS_FLAG_ID_SHIFT      4
+#define INS_FLAG_ID_SHIFT      5
 #define INS_FLAG_ID_MASK       (~0 << INS_FLAG_ID_SHIFT)
 
 typedef union {
@@ -375,6 +391,9 @@ struct instruction {
 };
 
 
+#define INSTRUCTION_STARTS_BASICBLOCK(iptr) \
+       ((iptr)->flags.bits & INS_FLAG_BASICBLOCK)
+
 #define INSTRUCTION_IS_RESOLVED(iptr) \
        (!((iptr)->flags.bits & INS_FLAG_UNRESOLVED))
 
@@ -475,7 +494,7 @@ struct basicblock {
        instruction  *iinstr;       /* pointer to intermediate code instructions  */
 
        varinfo      *inlocals;     /* copy of locals on block entry              */
-       s4           *javalocals;   /* map from java locals to cacao variables    */
+       s4           *javalocals;   /* map from java locals to cacao variables[+] */
        s4           *invars;       /* array of in-variables at begin of block    */
        s4           *outvars;      /* array of out-variables at end of block     */
        s4            indepth;      /* stack depth at begin of basic block        */
@@ -501,6 +520,25 @@ struct basicblock {
        s4            mpc;          /* machine code pc at start of block          */
 };
 
+/* [+]...the javalocals array: This array is indexed by the javaindex (the    */
+/*       local variable index ocurring in the original bytecode). An element  */
+/*       javalocals[javaindex] encodes where to find the contents of the      */
+/*       original variable at this point in the program.                      */
+/*       There are three cases for javalocals[javaindex]:                     */
+/*           >= 0.......it's an index into the jd->var array, where the       */
+/*                      CACAO variable corresponding to the original local    */
+/*                      can be found.                                         */
+/*           UNUSED.....the original variable is not live at this point       */
+/*           < UNUSED...the original variable contains a returnAddress at     */
+/*                      this point. The number of the block to return to can  */
+/*                      be calculated using RETADDR_FROM_JAVALOCAL:           */
+/*                                                                            */
+/*                      javalocals[javaindex] == JAVALOCAL_FROM_RETADDR(nr)   */
+/*                      RETADDR_FROM_JAVALOCAL(javalocals[javaindex]) == nr   */
+
+#define JAVALOCAL_FROM_RETADDR(nr)  (UNUSED - (1 + (nr)))
+#define RETADDR_FROM_JAVALOCAL(jl)  (UNUSED - (1 + (jl)))
+
 
 /* Macro for initializing newly allocated basic block's. It does not
    need to zero fields, as we zero out the whole basic block array. */
@@ -514,14 +552,6 @@ struct basicblock {
        } while (0)
                        
 
-/* branchref *****************************************************************/
-
-struct branchref {
-       s4         branchpos;       /* patching position in code segment          */
-       branchref *next;            /* next element in branchref list             */
-};
-
-
 /* data-flow constants for the ICMD table ************************************/
 
 #define DF_0_TO_0      0
@@ -1270,7 +1300,7 @@ void jit_init(void);
 void jit_close(void);
 
 /* create a new jitdata */
-jitdata *jit_jitdata_new(codeinfo *code);
+jitdata *jit_jitdata_new(methodinfo *m);
 
 /* compile a method with jit compiler */
 u1 *jit_compile(methodinfo *m);