pan/bi: Respect shift when printing immediates
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sat, 21 Mar 2020 22:42:58 +0000 (18:42 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 22 Mar 2020 03:32:35 +0000 (03:32 +0000)
We allow packing multiple immediates in, but we were missing this in the
print.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4276>

src/panfrost/bifrost/bi_print.c
src/panfrost/bifrost/bir.c
src/panfrost/bifrost/compiler.h

index 73de74381cccf9389a7ea245af4afda194a93de2..5f53e4b98c131a8affa2c388edaf03e4d591af89 100644 (file)
@@ -166,7 +166,7 @@ bi_print_index(FILE *fp, bi_instruction *ins, unsigned index)
         else if (index & BIR_INDEX_UNIFORM)
                 fprintf(fp, "u%u", index & ~BIR_INDEX_UNIFORM);
         else if (index & BIR_INDEX_CONSTANT)
-                fprintf(fp, "#0x%" PRIx64, ins->constant.u64);
+                fprintf(fp, "#0x%" PRIx64, bi_get_immediate(ins, index));
         else if (index & BIR_INDEX_ZERO)
                 fprintf(fp, "#0");
         else if (index & BIR_IS_REG)
index f110564aa642e49a5520730814edad0341afd9b6..cb24f4590961c08d96c1e8f0318dfe19025b30e5 100644 (file)
@@ -136,3 +136,11 @@ bi_bytemask_of_read_components(bi_instruction *ins, unsigned node)
 
         return mask;
 }
+
+uint64_t
+bi_get_immediate(bi_instruction *ins, unsigned index)
+{
+        assert(index & BIR_INDEX_CONSTANT);
+        unsigned shift = index & ~BIR_INDEX_CONSTANT;
+        return ins->constant.u64 >> shift;
+}
index b09bd536729a10fe3261ad94dfedd338c75d22d0..b8eeb64f9ac1166d70ecd47cfc9de5305740133b 100644 (file)
@@ -394,7 +394,7 @@ bi_remove_instruction(bi_instruction *ins)
  *
  *  Fixed register: do not allocate register, do not collect $200.
  *  Uniform: access a uniform register given by low bits.
- *  Constant: access the specified constant 
+ *  Constant: access the specified constant (specifies a bit offset / shift)
  *  Zero: special cased to avoid wasting a constant
  *  Passthrough: a bifrost_packed_src to passthrough T/T0/T1
  */
@@ -537,6 +537,7 @@ uint16_t bi_from_bytemask(uint16_t bytemask, unsigned bytes);
 unsigned bi_get_component_count(bi_instruction *ins, unsigned s);
 unsigned bi_load32_components(bi_instruction *ins);
 uint16_t bi_bytemask_of_read_components(bi_instruction *ins, unsigned node);
+uint64_t bi_get_immediate(bi_instruction *ins, unsigned index);
 
 /* BIR passes */