pan/midgard: Expand 64-bit writemasks
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 5 Nov 2019 03:20:59 +0000 (22:20 -0500)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 15 Nov 2019 20:08:46 +0000 (20:08 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/helpers.h
src/panfrost/midgard/midgard_emit.c

index b86001182602633a3d5a71865f07fe420fab4399..9cfb9fe780f14fffe3a657a3b405ab8f45f0d9fd 100644 (file)
@@ -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;
 }
index 0ba404d13e8a142708729b7ff4f6112d525c5959..57f8726c770131477dc9cbe7530ba3c28d9145d3 100644 (file)
@@ -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;