pan/bi: Try to reuse constants in ALU
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 15 Apr 2020 14:39:42 +0000 (10:39 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 17 Apr 2020 20:25:35 +0000 (16:25 -0400)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4615>

src/panfrost/bifrost/bifrost_compile.c

index adddef794ef825459674089909d74c5339e1208d..9671a485c2a7a3aa2eb914d41cfbeb1cbeeafd4d 100644 (file)
@@ -483,9 +483,18 @@ bi_copy_src(bi_instruction *alu, nir_alu_instr *instr, unsigned i, unsigned to,
 
         /* Try to inline a constant */
         if (nir_src_is_const(instr->src[i].src) && *constants_left && (dest_bits == bits)) {
-                alu->constant.u64 |=
-                        (nir_src_as_uint(instr->src[i].src)) << *constant_shift;
+                uint64_t mask = (1ull << dest_bits) - 1;
+                uint64_t cons = nir_src_as_uint(instr->src[i].src);
+
+                /* Try to reuse a constant */
+                for (unsigned i = 0; i < (*constant_shift); i += dest_bits) {
+                        if (((alu->constant.u64 >> i) & mask) == cons) {
+                                alu->src[to] = BIR_INDEX_CONSTANT | i;
+                                return;
+                        }
+                }
 
+                alu->constant.u64 |= cons << *constant_shift;
                 alu->src[to] = BIR_INDEX_CONSTANT | (*constant_shift);
                 --(*constants_left);
                 (*constant_shift) += dest_bits;