pan/mdg: Don't generate conversions for fp16 LUTs
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 7 May 2020 19:43:21 +0000 (15:43 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 21 May 2020 17:49:14 +0000 (17:49 +0000)
We can just set the register mode appropriately and then we don't have
to care anywhere else, and there's no extra NIR to chew through. Make
sure we include sqrt too.

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

src/panfrost/midgard/midgard_compile.c
src/panfrost/midgard/midgard_nir_algebraic.py

index 4b97013ebc9b4dd02afd528d80f5cfa2ac632322..643fe114b0da9438fe74e9d304b396841fe822bc 100644 (file)
@@ -561,6 +561,27 @@ reg_mode_for_nir(nir_alu_instr *instr)
         unsigned dst_bitsize = nir_dest_bit_size(instr->dest.dest);
         unsigned max_bitsize = MAX2(src_bitsize, dst_bitsize);
 
+        /* We don't have fp16 LUTs, so we'll want to emit code like:
+         *
+         *      vlut.fsinr hr0, hr0
+         *
+         * where both input and output are 16-bit but the operation is carried
+         * out in 32-bit
+         */
+
+        switch (instr->op) {
+        case nir_op_fsqrt:
+        case nir_op_frcp:
+        case nir_op_frsq:
+        case nir_op_fsin:
+        case nir_op_fcos:
+        case nir_op_fexp2:
+        case nir_op_flog2:
+                max_bitsize = MAX2(max_bitsize, 32);
+        default:
+                break;
+        }
+
         switch (max_bitsize) {
         case 8:
                 return midgard_reg_mode_8;
index 8dc72bcf561b2e7d4b98dde4066ec05bcd079571..daaaafdd30ea5634f173fcb50659390dee57cc3b 100644 (file)
@@ -93,12 +93,6 @@ for op in ('u2u', 'i2i', 'f2f', 'i2f', 'u2f', 'f2i', 'f2u'):
             srcsz *= 2
         dstsz *= 2
 
-# Midgard outputs fp32 for specials. The f2f32 will be folded in later.
-SPECIAL = ['fexp2', 'flog2', 'fsin', 'fcos', 'frcp', 'frsq']
-
-for op in SPECIAL:
-        converts += [((op + '@16', a), ('f2f16', (op, ('f2f32', a))))]
-
 # Try to force constants to the right
 constant_switch = [
         # fge gets flipped to fle, so we invert to keep the order