diff options
author | Alyssa Rosenzweig <[email protected]> | 2019-08-26 15:06:38 -0700 |
---|---|---|
committer | Alyssa Rosenzweig <[email protected]> | 2019-08-30 15:50:23 -0700 |
commit | 3f757425a4ec05f9fb27914bfc17661c2ea53af4 (patch) | |
tree | 262e14e39b91f2673feda28d3eeb46394555e7b2 | |
parent | bbe29149670c06a5cb5bdbd17503aae1b1219788 (diff) |
pan/midgard: Extract instruction sizing helper
The scheduler shouldn't need to worry about this.
Signed-off-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r-- | src/panfrost/midgard/midgard_schedule.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c index 79b9b47b104..8d055f086c9 100644 --- a/src/panfrost/midgard/midgard_schedule.c +++ b/src/panfrost/midgard/midgard_schedule.c @@ -236,6 +236,21 @@ mir_is_scalar(midgard_instruction *ains) return could_scalar; } +/* How many bytes does this ALU instruction add to the bundle? */ + +static unsigned +bytes_for_instruction(midgard_instruction *ains) +{ + if (ains->unit & UNITS_ANY_VECTOR) + return sizeof(midgard_reg_info) + sizeof(midgard_vector_alu); + else if (ains->unit == ALU_ENAB_BRANCH) + return sizeof(midgard_branch_extended); + else if (ains->compact_branch) + return sizeof(ains->br_compact); + else + return sizeof(midgard_reg_info) + sizeof(midgard_scalar_alu); +} + /* Schedules, but does not emit, a single basic block. After scheduling, the * final tag and size of the block are known, which are necessary for branching * */ @@ -468,10 +483,7 @@ schedule_bundle(compiler_context *ctx, midgard_block *block, midgard_instruction bundle.has_embedded_constants = true; } - if (ains->unit & UNITS_ANY_VECTOR) { - bytes_emitted += sizeof(midgard_reg_info); - bytes_emitted += sizeof(midgard_vector_alu); - } else if (ains->compact_branch) { + if (ains->compact_branch) { /* All of r0 has to be written out along with * the branch writeout */ @@ -490,21 +502,13 @@ schedule_bundle(compiler_context *ctx, midgard_block *block, midgard_instruction /* TODO don't leak */ midgard_instruction *move = mem_dup(&ins, sizeof(midgard_instruction)); - bytes_emitted += sizeof(midgard_reg_info); - bytes_emitted += sizeof(midgard_vector_alu); + bytes_emitted += bytes_for_instruction(move); bundle.instructions[packed_idx++] = move; } - - if (ains->unit == ALU_ENAB_BRANCH) { - bytes_emitted += sizeof(midgard_branch_extended); - } else { - bytes_emitted += sizeof(ains->br_compact); - } - } else { - bytes_emitted += sizeof(midgard_reg_info); - bytes_emitted += sizeof(midgard_scalar_alu); } + bytes_emitted += bytes_for_instruction(ains); + /* Defer marking until after writing to allow for break */ scheduled[index] = ains; control |= ains->unit; |