pan/bi: Implement FMA/MOV without modifiers
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 19 Mar 2020 20:58:48 +0000 (16:58 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 22 Mar 2020 03:32:34 +0000 (03:32 +0000)
We split off MOV from FMOV since the canonical move on Bifrost doesn't
accept modifiers. (We can still do fmov, but with something like add-0.)
This will also make copyprop a little nicer, I think. Anyway, the
non-modifier version we can implement as-is for FMA.

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

src/panfrost/bifrost/bi_pack.c
src/panfrost/bifrost/bi_tables.c
src/panfrost/bifrost/bifrost.h
src/panfrost/bifrost/bifrost_compile.c
src/panfrost/bifrost/compiler.h

index 2494cb55cdd808637e328b5c013443588386f95c..16a1266b5a8f1689462ff4c55e38999314381471 100644 (file)
@@ -362,6 +362,17 @@ bi_pack_fma_add(bi_instruction *ins, struct bi_registers *regs)
         RETURN_PACKED(pack);
 }
 
+static unsigned
+bi_pack_fma_1src(bi_instruction *ins, struct bi_registers *regs, unsigned op)
+{
+        struct bifrost_fma_inst pack = {
+                .src0 = bi_get_src(ins, regs, 0, true),
+                .op = op
+        };
+
+        RETURN_PACKED(pack);
+}
+
 static unsigned
 bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
 {
@@ -381,7 +392,10 @@ bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
         case BI_FREXP:
         case BI_ISUB:
         case BI_MINMAX:
+                return BIFROST_FMA_NOP;
         case BI_MOV:
+                return bi_pack_fma_1src(bundle.fma, regs, BIFROST_FMA_OP_MOV);
+        case BI_FMOV:
         case BI_SHIFT:
         case BI_SWIZZLE:
         case BI_ROUND:
@@ -499,6 +513,7 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
         case BI_LOAD_VAR_ADDRESS:
         case BI_MINMAX:
         case BI_MOV:
+        case BI_FMOV:
         case BI_SHIFT:
         case BI_STORE:
         case BI_STORE_VAR:
index 72d2ccf2155c94b99d9e401cba1835bf1cc90af1..729c4800393410f1403c2cb093ee56f978534058 100644 (file)
@@ -45,7 +45,8 @@ unsigned bi_class_props[BI_NUM_CLASSES] = {
         [BI_LOAD_VAR]          = BI_SCHED_HI_LATENCY | BI_SCHED_ADD | BI_VECTOR | BI_DATA_REG_DEST,
         [BI_LOAD_VAR_ADDRESS]  = BI_SCHED_HI_LATENCY | BI_SCHED_ADD,
         [BI_MINMAX]            = BI_GENERIC | BI_SCHED_ALL,
-        [BI_MOV]               = BI_MODS | BI_SCHED_ALL,
+        [BI_MOV]               = BI_SCHED_ALL,
+        [BI_FMOV]               = BI_MODS | BI_SCHED_ALL,
         [BI_SHIFT]             = BI_SCHED_ALL,
         [BI_STORE]             = BI_SCHED_HI_LATENCY | BI_SCHED_ADD | BI_VECTOR | BI_DATA_REG_SRC,
         [BI_STORE_VAR]                 = BI_SCHED_HI_LATENCY | BI_SCHED_ADD | BI_VECTOR | BI_DATA_REG_SRC,
index dac4ad190dd556b2887ca9414bc690970627fa10..5ec8c495465284d6b494707e080b7dd5c5c7055e 100644 (file)
@@ -95,6 +95,9 @@ enum bifrost_packed_src {
         BIFROST_SRC_PASS_ADD = 7,
 };
 
+#define BIFROST_FMA_EXT (0xe0000)
+#define BIFROST_FMA_OP_MOV BIFROST_FMA_EXT | (0x32d)
+
 struct bifrost_fma_inst {
         unsigned src0 : 3;
         unsigned op   : 20;
index 0755d1313fc5bd18677f047860b4205c548dd89e..7d050678115d69e902abe2a67f9fd358d2602e7f 100644 (file)
@@ -375,6 +375,7 @@ bi_class_for_nir_alu(nir_op op)
         case nir_op_fsat:
         case nir_op_fneg:
         case nir_op_fabs:
+                return BI_FMOV;
         case nir_op_mov:
                 return BI_MOV;
 
@@ -480,16 +481,16 @@ emit_alu(bi_context *ctx, nir_alu_instr *instr)
                 alu.src[2] = BIR_INDEX_ZERO; /* FMA */
                 break;
         case nir_op_fsat:
-                alu.outmod = BIFROST_SAT; /* MOV */
+                alu.outmod = BIFROST_SAT; /* FMOV */
                 break;
         case nir_op_fneg:
-                alu.src_neg[0] = true; /* MOV */
+                alu.src_neg[0] = true; /* FMOV */
                 break;
         case nir_op_fabs:
-                alu.src_abs[0] = true; /* MOV */
+                alu.src_abs[0] = true; /* FMOV */
                 break;
         case nir_op_fsub:
-                alu.src_neg[1] = true; /* ADD */
+                alu.src_neg[1] = true; /* FADD */
                 break;
         case nir_op_fmax:
         case nir_op_imax:
index 483a282b57d0d947c6667ea95add145a6b694bb3..d7d80d5c8a95cdc5ba7f3fe812b7b45f0841eb3b 100644 (file)
@@ -57,6 +57,7 @@ enum bi_class {
         BI_CSEL,
         BI_DISCARD,
         BI_FMA,
+        BI_FMOV,
         BI_FREXP,
         BI_ISUB,
         BI_LOAD,