pan/bi: Pack FMA IADD/ISUB 32
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 4 May 2020 18:28:47 +0000 (14:28 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 4 May 2020 18:45:15 +0000 (18:45 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4890>

src/panfrost/bifrost/bi_pack.c
src/panfrost/bifrost/bifrost.h

index d877602bdb2dfd1645445edab45ac0413986e2ea..90d63be6ff7554320d23b0e44bab6c9513fa0f86 100644 (file)
@@ -1149,7 +1149,20 @@ bi_pack_fma_round(bi_instruction *ins, struct bi_registers *regs)
 
         return bi_pack_fma_1src(ins, regs, op);
 }
+
+static unsigned
+bi_pack_fma_imath(bi_instruction *ins, struct bi_registers *regs)
+{
+        /* Scheduler: only ADD can have 8/16-bit imath */
+        assert(ins->dest_type == nir_type_int32 || ins->dest_type == nir_type_uint32);
+
+        unsigned op = ins->op.imath == BI_IMATH_ADD
+                ? BIFROST_FMA_IADD_32
+                : BIFROST_FMA_ISUB_32;
+
+        return bi_pack_fma_2src(ins, regs, op);
+}
+
 static unsigned
 bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
 {
@@ -1172,7 +1185,7 @@ bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
         case BI_FREXP:
                 return bi_pack_fma_frexp(bundle.fma, regs);
         case BI_IMATH:
-                unreachable("Packing todo");
+                return bi_pack_fma_imath(bundle.fma, regs);
         case BI_MINMAX:
                 return bi_pack_fma_addmin(bundle.fma, regs);
         case BI_MOV:
index cc26e281ea422647d2f66f151aa864c20e314f9d..15e44251c1ac1b14a12207a9e4cb4d3e1eaeb01a 100644 (file)
@@ -115,6 +115,9 @@ struct bifrost_fma_inst {
         unsigned op   : 20;
 } __attribute__((packed));
 
+#define BIFROST_FMA_IADD_32 (0x4ff98 >> 3)
+#define BIFROST_FMA_ISUB_32 (0x4ffd8 >> 3)
+
 struct bifrost_fma_2src {
         unsigned src0 : 3;
         unsigned src1 : 3;