* Removed all Id tags.
[cacao.git] / src / vm / jit / schedule / schedule.h
index e4129ca741226cd255bd1c9a407c37b16b31425a..b94e3f3882071c27a6b12b17a92106b88c0570aa 100644 (file)
@@ -1,10 +1,10 @@
 /* src/vm/jit/schedule/schedule.h - architecture independent instruction
                                     scheduler
 
-   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
+   Copyright (C) 1996-2005, 2006 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.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
-   Contact: cacao@complang.tuwien.ac.at
+   Contact: cacao@cacaojvm.org
 
    Authors: Christian Thalinger
 
    Changes:
 
-   $Id: schedule.h 1985 2005-03-04 17:09:13Z twisti $
-
 */
 
 
 
 typedef struct scheduledata scheduledata;
 typedef struct minstruction minstruction;
-typedef struct nodelink nodelink;
+typedef struct edgenode edgenode;
+typedef struct opcycles opcycles;
 
 
 /* machine instruction flags **************************************************/
 
-#define SCHEDULE_LEADER    0x01
+#define SCHEDULE_LEADER         0x01
+#define SCHEDULE_SINK           0x02
+
+#define SCHEDULE_UNIT_ALU       0x04
+#define SCHEDULE_UNIT_MEM       0x08
+#define SCHEDULE_UNIT_BRANCH    0x10
+
+
+#define M_SCHEDULE_SET_EXCEPTION_POINT    /*  if (jd->exceptiontablelength > 0) { schedule_do_schedule(sd); schedule_reset(sd, rd); } */
+
+
+struct opcycles {
+       s1 firstcycle;
+       s1 lastcycle;
+};
 
 
 /* scheduledata ****************************************************************
@@ -61,15 +74,17 @@ typedef struct nodelink nodelink;
 struct scheduledata {
        minstruction  *mi;                  /* machine instruction array          */
        s4             micount;             /* number of machine instructions     */
-       nodelink      *leaders;             /* list containing sink nodes         */
+       edgenode      *leaders;             /* list containing leader nodes       */
 
-       s4            *intregs_define_dep;
-       s4            *fltregs_define_dep;
-    s4            *memory_define_dep;
+       edgenode     **intregs_define_dep;
+       edgenode     **fltregs_define_dep;
+    edgenode     **memory_define_dep;
 
-       nodelink     **intregs_use_dep;
-       nodelink     **fltregs_use_dep;
-       nodelink     **memory_use_dep;
+       edgenode     **intregs_use_dep;
+       edgenode     **fltregs_use_dep;
+       edgenode     **memory_use_dep;
+
+       FILE *file;
 };
 
 
@@ -83,38 +98,46 @@ struct scheduledata {
 struct minstruction {
        u4             instr[2];            /* machine instruction word           */
        u1             flags;
-       u1             startcycle;          /* start pipeline cycle               */
-       u1             endcycle;            /* end pipeline cycle                 */
+#if 1
+       s1             startcycle;          /* start pipeline cycle               */
+       s1             endcycle;            /* end pipeline cycle                 */
+#endif
+       opcycles       op[4];
        s4             priority;            /* priority of this instruction node  */
-       nodelink      *deps;                /* operand dependencies               */
+       s4             starttime;
+       edgenode      *deps;                /* operand dependencies               */
        minstruction  *next;                /* link to next machine instruction   */
 };
 
 
-/* nodelink ********************************************************************
+/* edgenode ********************************************************************
 
    XXX
 
 *******************************************************************************/
 
-struct nodelink {
-       s4        minode;                   /* pointer to machine instruction     */
-       nodelink *next;                     /* link to next node                  */
+/* TODO rename to edgenode */
+struct edgenode {
+       s4        minum;                    /* machine instruction number         */
+       s1        opnum;                    /* dependency operand number          */
+       s1        opnum2;
+       s1        latency;
+       edgenode *next;                     /* link to next node                  */
 };
 
 
 /* function prototypes ********************************************************/
 
-scheduledata *schedule_init(registerdata *rd);
-void schedule_setup(scheduledata *sd, registerdata *rd);
+scheduledata *schedule_init(methodinfo *m, registerdata *rd);
+void schedule_reset(scheduledata *sd, registerdata *rd);
+void schedule_close(scheduledata *sd);
 
 void schedule_calc_priority(minstruction *mi);
 
-void schedule_add_define_dep(scheduledata *sd, s4 *define_dep, nodelink **use_dep);
-void schedule_add_use_dep(scheduledata *sd, s4 *define_dep, nodelink **use_dep);
-
-void schedule_add_memory_define_dep(scheduledata *sd);
-void schedule_add_memory_use_dep(scheduledata *sd);
+/*  void schedule_add_define_dep(scheduledata *sd, s1 operand, s4 *define_dep, edgenode **use_dep); */
+/*  void schedule_add_use_dep(scheduledata *sd, s1 operand, s4 *define_dep, edgenode **use_dep); */
+void schedule_add_define_dep(scheduledata *sd, s1 opnum, edgenode **define_dep, edgenode **use_dep);
+void schedule_add_use_dep(scheduledata *sd, s1 opnum, edgenode **define_dep, edgenode **use_dep);
 
 void schedule_do_schedule(scheduledata *sd);