pan/midgard: Add mir_choose_instruction stub
In the future, this routine will implement the core scheduling logic to decide which instruction out of the worklist will be scheduled next, in a way that minimizes cycle count and register pressure. In the present, we are more interested in replicating in-order scheduling with the much-more-powerful out-of-order model. So rather than discriminating by a register pressure estimate, we simply choose the latest possible instruction in the worklist. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
@@ -767,6 +767,61 @@ mir_initialize_worklist(BITSET_WORD *worklist, midgard_instruction **instruction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* While scheduling, we need to choose instructions satisfying certain
|
||||||
|
* criteria. As we schedule backwards, we choose the *last* instruction in the
|
||||||
|
* worklist to simulate in-order scheduling. Chosen instructions must satisfy a
|
||||||
|
* given predicate. */
|
||||||
|
|
||||||
|
struct midgard_predicate {
|
||||||
|
/* TAG or ~0 for dont-care */
|
||||||
|
unsigned tag;
|
||||||
|
|
||||||
|
/* True if we want to pop off the chosen instruction */
|
||||||
|
bool destructive;
|
||||||
|
};
|
||||||
|
|
||||||
|
static midgard_instruction *
|
||||||
|
mir_choose_instruction(
|
||||||
|
midgard_instruction **instructions,
|
||||||
|
BITSET_WORD *worklist, unsigned count,
|
||||||
|
struct midgard_predicate *predicate)
|
||||||
|
{
|
||||||
|
/* Parse the predicate */
|
||||||
|
unsigned tag = predicate->tag;
|
||||||
|
|
||||||
|
/* Iterate to find the best instruction satisfying the predicate */
|
||||||
|
unsigned i;
|
||||||
|
BITSET_WORD tmp;
|
||||||
|
|
||||||
|
signed best_index = -1;
|
||||||
|
|
||||||
|
BITSET_FOREACH_SET(i, tmp, worklist, count) {
|
||||||
|
if (tag != ~0 && instructions[i]->type != tag)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Simulate in-order scheduling */
|
||||||
|
if ((signed) i < best_index)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
best_index = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Did we find anything? */
|
||||||
|
|
||||||
|
if (best_index < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* If we found something, remove it from the worklist */
|
||||||
|
assert(best_index < count);
|
||||||
|
|
||||||
|
if (predicate->destructive) {
|
||||||
|
BITSET_CLEAR(worklist, best_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return instructions[best_index];
|
||||||
|
}
|
||||||
|
|
||||||
/* Schedule a single block by iterating its instruction to create bundles.
|
/* Schedule a single block by iterating its instruction to create bundles.
|
||||||
* While we go, tally about the bundle sizes to compute the block size. */
|
* While we go, tally about the bundle sizes to compute the block size. */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user