From 855eec93b10579ffdffada8dc39b87314db4e646 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Date: Mon, 4 Nov 2019 22:20:59 -0500 Subject: pan/midgard: Expand 64-bit writemasks Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> --- src/panfrost/midgard/helpers.h | 12 +++++++----- src/panfrost/midgard/midgard_emit.c | 6 ++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/panfrost/midgard/helpers.h b/src/panfrost/midgard/helpers.h index b8600118260..9cfb9fe780f 100644 --- a/src/panfrost/midgard/helpers.h +++ b/src/panfrost/midgard/helpers.h @@ -244,17 +244,19 @@ struct mir_ldst_op_props { /* This file is common, so don't define the tables themselves. #include * midgard_op.h if you need that, or edit midgard_ops.c directly */ -/* Duplicate bits to convert a 4-bit writemask to duplicated 8-bit format, - * which is used for 32-bit vector units */ +/* Duplicate bits to convert a per-component to duplicated 8-bit format, + * which is used for vector units */ static inline unsigned -expand_writemask_32(unsigned mask) +expand_writemask(unsigned mask, unsigned channels) { unsigned o = 0; + unsigned factor = 8 / channels; + unsigned expanded = (1 << factor) - 1; - for (int i = 0; i < 4; ++i) + for (unsigned i = 0; i < channels; ++i) if (mask & (1 << i)) - o |= (3 << (2 * i)); + o |= (expanded << (factor * i)); return o; } diff --git a/src/panfrost/midgard/midgard_emit.c b/src/panfrost/midgard/midgard_emit.c index 0ba404d13e8..57f8726c770 100644 --- a/src/panfrost/midgard/midgard_emit.c +++ b/src/panfrost/midgard/midgard_emit.c @@ -279,8 +279,10 @@ emit_alu_bundle(compiler_context *ctx, midgard_scalar_alu scalarized; if (ins->unit & UNITS_ANY_VECTOR) { - if (ins->alu.reg_mode == midgard_reg_mode_32) - ins->alu.mask = expand_writemask_32(ins->mask); + if (ins->alu.reg_mode == midgard_reg_mode_64) + ins->alu.mask = expand_writemask(ins->mask, 2); + else if (ins->alu.reg_mode == midgard_reg_mode_32) + ins->alu.mask = expand_writemask(ins->mask, 4); else ins->alu.mask = ins->mask; -- cgit v1.2.3