pan/bi: Pack ADD IADD/ISUB for 8/16/32
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 4 May 2020 18:37:04 +0000 (14:37 -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 90d63be6ff7554320d23b0e44bab6c9513fa0f86..741ed133fc880880f85040a6a0dea99036217d3e 100644 (file)
@@ -1625,6 +1625,32 @@ bi_pack_add_cmp(bi_instruction *ins, struct bi_registers *regs)
         }
 }
 
+static unsigned
+bi_pack_add_imath(bi_instruction *ins, struct bi_registers *regs)
+{
+        /* TODO: 32+16 add */
+        assert(ins->src_types[0] == ins->src_types[1]);
+        unsigned sz = nir_alu_type_get_type_size(ins->src_types[0]);
+        enum bi_imath_op p = ins->op.imath;
+
+        unsigned op = 0;
+
+        if (sz == 8) {
+                op = (p == BI_IMATH_ADD) ? BIFROST_ADD_IADD_8 :
+                        BIFROST_ADD_ISUB_8;
+        } else if (sz == 16) {
+                op = (p == BI_IMATH_ADD) ? BIFROST_ADD_IADD_16 :
+                        BIFROST_ADD_ISUB_16;
+        } else if (sz == 32) {
+                op = (p == BI_IMATH_ADD) ? BIFROST_ADD_IADD_32 :
+                        BIFROST_ADD_ISUB_32;
+        } else {
+                unreachable("64-bit todo");
+        }
+
+        return bi_pack_add_2src(ins, regs, op);
+}
+
 static unsigned
 bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
 {
@@ -1649,7 +1675,9 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
         case BI_DISCARD:
                 return bi_pack_add_discard(bundle.add, regs);
         case BI_FREXP:
+                unreachable("Packing todo");
         case BI_IMATH:
+                return bi_pack_add_imath(bundle.add, regs);
         case BI_LOAD:
                 unreachable("Packing todo");
         case BI_LOAD_ATTR:
index 15e44251c1ac1b14a12207a9e4cb4d3e1eaeb01a..31ef76a4d5a798796d0563ee51a83fbd89dc2847 100644 (file)
@@ -195,6 +195,13 @@ struct bifrost_add_discard {
 #define BIFROST_ADD_OP_LD_UBO_4 (0x0c220 >> 3)
 #define BIFROST_ADD_SEL_16(swiz) ((0xea60 >> 3) | (swiz))
 
+#define BIFROST_ADD_IADD_8  (0x17880 >> 3)
+#define BIFROST_ADD_IADD_16 (0x17900 >> 3)
+#define BIFROST_ADD_IADD_32 (0x178c0 >> 3)
+#define BIFROST_ADD_ISUB_8  (0x17a80 >> 3)
+#define BIFROST_ADD_ISUB_16 (0x17b00 >> 3)
+#define BIFROST_ADD_ISUB_32 (0x17ac0 >> 3)
+
 struct bifrost_add_2src {
         unsigned src0 : 3;
         unsigned src1 : 3;