* src/vm/jit/powerpc/linux/md-abi.c (md_param_alloc): Cleaned up
[cacao.git] / src / vm / jit / schedule / schedule.h
index 254194300c4c3cb2c26f9cddb60108d90cd1e701..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 1950 2005-02-17 11:40:01Z twisti $
+   $Id: schedule.h 4357 2006-01-22 23:33:38Z twisti $
 
 */
 
 
 #include "arch.h"
 #include "types.h"
+#include "vm/jit/reg.h"
+
+
+typedef struct scheduledata scheduledata;
+typedef struct minstruction minstruction;
+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 ****************************************************************
+
+   XXX
+
+*******************************************************************************/
+
+struct scheduledata {
+       minstruction  *mi;                  /* machine instruction array          */
+       s4             micount;             /* number of machine instructions     */
+       edgenode      *leaders;             /* list containing leader nodes       */
+
+       edgenode     **intregs_define_dep;
+       edgenode     **fltregs_define_dep;
+    edgenode     **memory_define_dep;
+
+       edgenode     **intregs_use_dep;
+       edgenode     **fltregs_use_dep;
+       edgenode     **memory_use_dep;
+
+       FILE *file;
+};
 
 
 /* minstruction ****************************************************************
 
 *******************************************************************************/
 
-typedef struct minstruction minstruction;
-
 struct minstruction {
-       u4            instr;                /* machine instruction word           */
-       u1            latency;              /* instruction latency                */
-       s4            priority;
-       minstruction *opdep[3];             /* operand dependencies               */
-       minstruction *next;                 /* link to next machine instruction   */
+       u4             instr[2];            /* machine instruction word           */
+       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  */
+       s4             starttime;
+       edgenode      *deps;                /* operand dependencies               */
+       minstruction  *next;                /* link to next machine instruction   */
+};
+
+
+/* edgenode ********************************************************************
+
+   XXX
+
+*******************************************************************************/
+
+/* 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 ********************************************************/
 
-void schedule_do_schedule(minstruction *mi);
-minstruction *schedule_prepend_minstruction(minstruction *mi);
+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, 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);
 
 #endif /* _SCHEDULE_H */