diff options
author | Alyssa Rosenzweig <[email protected]> | 2020-01-31 08:11:13 -0500 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-02-02 15:51:06 +0000 |
commit | a12fe52cbc86b2d33cd5a726ce1020cdcd6c064c (patch) | |
tree | 6fbfb9132727192dfa6c5bb716e67ba3480aff14 /src/panfrost/midgard | |
parent | b74212e70153f3a199a60a95d003208144f5fac9 (diff) |
pan/midgard: Break out one-src read_components
For constant packing, this is interesting to break down further.
Signed-off-by: Alyssa Rosenzweig <[email protected]>
Reviewed-by: Boris Brezillon <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3653>
Diffstat (limited to 'src/panfrost/midgard')
-rw-r--r-- | src/panfrost/midgard/compiler.h | 1 | ||||
-rw-r--r-- | src/panfrost/midgard/mir.c | 53 |
2 files changed, 31 insertions, 23 deletions
diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index ef89589ced6..8a187e18572 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -530,6 +530,7 @@ bool mir_special_index(compiler_context *ctx, unsigned idx); unsigned mir_use_count(compiler_context *ctx, unsigned value); bool mir_is_written_before(compiler_context *ctx, midgard_instruction *ins, unsigned node); uint16_t mir_bytemask_of_read_components(midgard_instruction *ins, unsigned node); +uint16_t mir_bytemask_of_read_components_index(midgard_instruction *ins, unsigned i); midgard_reg_mode mir_typesize(midgard_instruction *ins); midgard_reg_mode mir_srcsize(midgard_instruction *ins, unsigned i); unsigned mir_bytes_for_mode(midgard_reg_mode mode); diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c index d4ce935934c..c3f1eaafb00 100644 --- a/src/panfrost/midgard/mir.c +++ b/src/panfrost/midgard/mir.c @@ -466,40 +466,47 @@ mir_bytemask_of_read_components_single(unsigned *swizzle, unsigned inmask, midga } uint16_t -mir_bytemask_of_read_components(midgard_instruction *ins, unsigned node) +mir_bytemask_of_read_components_index(midgard_instruction *ins, unsigned i) { uint16_t mask = 0; - if (node == ~0) - return 0; + /* Branch writeout uses all components */ + if (ins->compact_branch && ins->writeout && (i == 0)) + return 0xFFFF; - mir_foreach_src(ins, i) { - if (ins->src[i] != node) continue; + /* Conditional branches read one 32-bit component = 4 bytes (TODO: multi branch??) */ + if (ins->compact_branch && ins->branch.conditional && (i == 0)) + return 0xF; - /* Branch writeout uses all components */ - if (ins->compact_branch && ins->writeout && (i == 0)) - return 0xFFFF; + /* ALU ops act componentwise so we need to pay attention to + * their mask. Texture/ldst does not so we don't clamp source + * readmasks based on the writemask */ + unsigned qmask = (ins->type == TAG_ALU_4) ? ins->mask : ~0; - /* Conditional branches read one 32-bit component = 4 bytes (TODO: multi branch??) */ - if (ins->compact_branch && ins->branch.conditional && (i == 0)) - return 0xF; + /* Handle dot products and things */ + if (ins->type == TAG_ALU_4 && !ins->compact_branch) { + unsigned props = alu_opcode_props[ins->alu.op].props; - /* ALU ops act componentwise so we need to pay attention to - * their mask. Texture/ldst does not so we don't clamp source - * readmasks based on the writemask */ - unsigned qmask = (ins->type == TAG_ALU_4) ? ins->mask : ~0; + unsigned channel_override = GET_CHANNEL_COUNT(props); - /* Handle dot products and things */ - if (ins->type == TAG_ALU_4 && !ins->compact_branch) { - unsigned props = alu_opcode_props[ins->alu.op].props; + if (channel_override) + qmask = mask_of(channel_override); + } - unsigned channel_override = GET_CHANNEL_COUNT(props); + return mir_bytemask_of_read_components_single(ins->swizzle[i], qmask, mir_srcsize(ins, i)); +} - if (channel_override) - qmask = mask_of(channel_override); - } +uint16_t +mir_bytemask_of_read_components(midgard_instruction *ins, unsigned node) +{ + uint16_t mask = 0; + + if (node == ~0) + return 0; - mask |= mir_bytemask_of_read_components_single(ins->swizzle[i], qmask, mir_srcsize(ins, i)); + mir_foreach_src(ins, i) { + if (ins->src[i] != node) continue; + mask |= mir_bytemask_of_read_components_index(ins, i); } return mask; |