* src/vm/jit/powerpc/linux/md-abi.c (md_param_alloc): Cleaned up
[cacao.git] / src / vm / jit / schedule / schedule.h
index f762c6ee7414ddfa57d088340bbd2c732ad27250..9ae07e0f59f093a392b3726b1ffac1e6668ff638 100644 (file)
@@ -1,9 +1,10 @@
-/* vm/jit/schedule/schedule.h - architecture independent instruction scheduler
+/* 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 1973 2005-03-02 16:27:05Z twisti $
+   $Id: schedule.h 4357 2006-01-22 23:33:38Z 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_SINK           0x02
+
+#define SCHEDULE_UNIT_ALU       0x04
+#define SCHEDULE_UNIT_MEM       0x08
+#define SCHEDULE_UNIT_BRANCH    0x10
+
+
+#define M_SCHEDULE_SET_EXCEPTION_POINT    /*  if (cd->exceptiontablelength > 0) { schedule_do_schedule(sd); schedule_reset(sd, rd); } */
+
+
+struct opcycles {
+       s1 firstcycle;
+       s1 lastcycle;
+};
 
 
 /* scheduledata ****************************************************************
@@ -55,15 +76,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       */
+
+       edgenode     **intregs_define_dep;
+       edgenode     **fltregs_define_dep;
+    edgenode     **memory_define_dep;
 
-       s4            *intregs_define_dep;
-       s4            *fltregs_define_dep;
-    s4            *memory_define_dep;
+       edgenode     **intregs_use_dep;
+       edgenode     **fltregs_use_dep;
+       edgenode     **memory_use_dep;
 
-       nodelink     **intregs_use_dep;
-       nodelink     **fltregs_use_dep;
-       nodelink     **memory_use_dep;
+       FILE *file;
 };
 
 
@@ -76,39 +99,47 @@ struct scheduledata {
 
 struct minstruction {
        u4             instr[2];            /* machine instruction word           */
-       u1             latency;             /* instruction latency                */
+       u1             flags;
+#if 1
+       s1             startcycle;          /* start pipeline cycle               */
+       s1             endcycle;            /* end pipeline cycle                 */
+#endif
+       opcycles       op[4];
        s4             priority;            /* priority of this instruction node  */
-       bool           leader;
-       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_calc_priority(minstruction *mi);
-
-void schedule_add_int_define_dep(scheduledata *sd, s4 reg);
-void schedule_add_flt_define_dep(scheduledata *sd, s4 reg);
+scheduledata *schedule_init(methodinfo *m, registerdata *rd);
+void schedule_reset(scheduledata *sd, registerdata *rd);
+void schedule_close(scheduledata *sd);
 
-void schedule_add_int_use_dep(scheduledata *sd, s4 reg);
-void schedule_add_flt_use_dep(scheduledata *sd, s4 reg);
+void schedule_calc_priority(minstruction *mi);
 
-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);