1 /* vm/jit/schedule/schedule.c - architecture independent instruction scheduler
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Christian Thalinger
31 $Id: schedule.c 1965 2005-02-24 19:52:00Z twisti $
40 #include "mm/memory.h"
41 #include "vm/jit/schedule/schedule.h"
44 scheduledata *schedule_init(registerdata *rd)
48 sd = DNEW(scheduledata);
50 /* XXX quick hack: just use a fix number of instructions */
51 sd->mi = DMNEW(minstruction, 100);
53 sd->intregs_read_dep = DMNEW(minstruction*, rd->intregsnum);
54 sd->intregs_write_dep = DMNEW(minstruction*, rd->intregsnum);
56 sd->fltregs_read_dep = DMNEW(minstruction*, rd->fltregsnum);
57 sd->fltregs_write_dep = DMNEW(minstruction*, rd->fltregsnum);
59 /* XXX: memory is currently only one cell */
60 /* sd->memory_write_dep; */
62 /* clear all pointers */
64 MSET(sd->intregs_read_dep, 0, minstruction*, rd->intregsnum);
65 MSET(sd->intregs_write_dep, 0, minstruction*, rd->intregsnum);
67 MSET(sd->fltregs_read_dep, 0, minstruction*, rd->fltregsnum);
68 MSET(sd->fltregs_write_dep, 0, minstruction*, rd->fltregsnum);
70 sd->memory_write_dep = NULL;
76 minstruction *schedule_prepend_minstruction(minstruction *mi)
80 /* add new instruction in front of the list */
82 tmpmi = DNEW(minstruction);
86 tmpmi->opdep[0] = NULL;
87 tmpmi->opdep[1] = NULL;
88 tmpmi->opdep[2] = NULL;
89 tmpmi->issinknode = true; /* initially all nodes are sink nodes */
91 tmpmi->next = mi; /* link to next instruction */
97 /* schedule_calc_priority ******************************************************
99 Calculates the current node's priority by getting highest priority
100 of the dependency nodes, adding this nodes latency plus 1 (for the
103 *******************************************************************************/
105 void schedule_calc_priority(minstruction *mi)
110 /* check all dependencies for their priority */
114 for (i = 0; i < 3; i++) {
116 if (mi->opdep[i]->priority > pathpriority)
117 pathpriority = mi->opdep[i]->priority;
119 /* dependent node is non-sink node */
121 mi->opdep[i]->issinknode = false;
125 mi->priority = pathpriority + mi->latency + 1;
129 /* schedule_do_schedule ********************************************************
133 *******************************************************************************/
135 void schedule_do_schedule(minstruction *mi)
137 minstruction *rootmi;
141 s4 icount; /* number of basic block instruction */
143 /* initialize variables */
149 /* find all sink nodes */
154 /* if current node is a sink node, add it to the sink node list */
156 if (mi->issinknode) {
167 /* walk through the instructions and do the actual scheduling */
169 for (i = 0; i < icount; i++) {
172 /* first, find the highest priority path */
179 printf("bb start ---\n");
186 /* disassinstr(&tmpmi->instr); */
187 printf("%05x", mi->instr);
189 printf(" --> %d, %d, %d: op1=%p, op2=%p, op3=%p\n", mi->issinknode, mi->latency, mi->priority, mi->opdep[0], mi->opdep[1], mi->opdep[2]);
193 printf("bb end ---\n\n");
197 minstruction *schedule_append_minstruction(minstruction *mi)
201 /* add new instruction to the list */
203 tmpmi = DNEW(minstruction);
204 tmpmi->opdep[0] = NULL;
205 tmpmi->opdep[1] = NULL;
206 tmpmi->opdep[2] = NULL;
215 * These are local overrides for various environment variables in Emacs.
216 * Please do not remove this and leave it at the end of the file, where
217 * Emacs will automagically detect them.
218 * ---------------------------------------------------------------------
221 * indent-tabs-mode: t