pan/bi: Measure distance between blocks

For branch offset calculation.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5260>
This commit is contained in:
Alyssa Rosenzweig
2020-05-28 13:49:59 -04:00
committed by Marge Bot
parent 64c49ab1fc
commit 682b63cdc2
2 changed files with 47 additions and 0 deletions
+46
View File
@@ -89,3 +89,49 @@ bi_clause_quadwords(bi_clause *clause)
return Y + DIV_ROUND_UP(constants, 2);
}
/* Measures the number of quadwords a branch jumps. Bifrost relative offsets
* are from the beginning of a clause so to jump forward we count the current
* clause length, but to jump backwards we do not. */
signed
bi_block_offset(bi_context *ctx, bi_clause *start, bi_block *target)
{
/* Signed since we might jump backwards */
signed ret = 0;
/* Determine if the block we're branching to is strictly greater in
* source order */
bool forwards = target->base.name > start->block->base.name;
if (forwards) {
/* We have to jump through this block from the start of this
* clause to the end */
bi_foreach_clause_in_block_from(start->block, clause, start) {
ret += bi_clause_quadwords(clause);
}
/* We then need to jump through every clause of every following
* block until the target */
bi_foreach_block_from(ctx, start->block, _blk) {
bi_block *blk = (bi_block *) _blk;
/* Don't double-count the first block */
if (blk == start->block)
continue;
/* End just before the target */
if (blk == target)
break;
/* Count every clause in the block */
bi_foreach_clause_in_block(blk, clause) {
ret += bi_clause_quadwords(clause);
}
}
} else {
unreachable("Backwards branching is to-do");
}
return ret;
}
+1
View File
@@ -602,6 +602,7 @@ bool bi_is_live_after(bi_context *ctx, bi_block *block, bi_instruction *start, i
bool bi_can_insert_bundle(bi_clause *clause, bool constant);
unsigned bi_clause_quadwords(bi_clause *clause);
signed bi_block_offset(bi_context *ctx, bi_clause *start, bi_block *target);
/* Code emit */