freedreno/ir3: add put_dst()
authorRob Clark <robdclark@gmail.com>
Sun, 21 May 2017 16:33:45 +0000 (12:33 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 23 May 2017 16:26:35 +0000 (12:26 -0400)
Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c

index 9181d35b5f71d4b18b1743fa12ba7b64390c4b45..2bcedd509f80b67ce0b50b5cc49311e6e6c96344 100644 (file)
@@ -101,6 +101,10 @@ struct ir3_compile {
         */
        struct hash_table *addr_ht;
 
+       /* last dst array, for indirect we need to insert a var-store.
+        */
+       struct ir3_instruction **last_dst;
+
        /* maps nir_block to ir3_block, mostly for the purposes of
         * figuring out the blocks successors
         */
@@ -361,6 +365,8 @@ __get_dst(struct ir3_compile *ctx, void *key, unsigned n)
        struct ir3_instruction **value =
                ralloc_array(ctx->def_ht, struct ir3_instruction *, n);
        _mesa_hash_table_insert(ctx->def_ht, key, value);
+       compile_assert(ctx, !ctx->last_dst);
+       ctx->last_dst = value;
        return value;
 }
 
@@ -375,6 +381,12 @@ get_dst(struct ir3_compile *ctx, nir_dest *dst, unsigned n)
        }
 }
 
+static void
+put_dst(struct ir3_compile *ctx, nir_dest *dst)
+{
+       ctx->last_dst = NULL;
+}
+
 static struct ir3_instruction **
 get_dst_ssa(struct ir3_compile *ctx, nir_ssa_def *dst, unsigned n)
 {
@@ -736,6 +748,7 @@ emit_alu(struct ir3_compile *ctx, nir_alu_instr *alu)
                        dst[i] = ir3_MOV(b, src[i], TYPE_U32);
                }
 
+               put_dst(ctx, &alu->dest.dest);
                return;
        }
 
@@ -1016,6 +1029,8 @@ emit_alu(struct ir3_compile *ctx, nir_alu_instr *alu)
                                nir_op_infos[alu->op].name);
                break;
        }
+
+       put_dst(ctx, &alu->dest.dest);
 }
 
 /* handles direct/indirect UBO reads: */
@@ -1562,6 +1577,9 @@ emit_intrinsic(struct ir3_compile *ctx, nir_intrinsic_instr *intr)
                                nir_intrinsic_infos[intr->intrinsic].name);
                break;
        }
+
+       if (info->has_dest)
+               put_dst(ctx, &intr->dest);
 }
 
 static void
@@ -1846,6 +1864,8 @@ emit_tex(struct ir3_compile *ctx, nir_tex_instr *tex)
                                                           factor, 0);
                }
        }
+
+       put_dst(ctx, &tex->dest);
 }
 
 static void
@@ -1869,6 +1889,8 @@ emit_tex_query_levels(struct ir3_compile *ctx, nir_tex_instr *tex)
         */
        if (ctx->levels_add_one)
                dst[0] = ir3_ADD_U(b, dst[0], 0, create_immed(b, 1), 0);
+
+       put_dst(ctx, &tex->dest);
 }
 
 static void
@@ -1929,6 +1951,8 @@ emit_phi(struct ir3_compile *ctx, nir_phi_instr *nphi)
        phi->phi.nphi = nphi;
 
        dst[0] = phi;
+
+       put_dst(ctx, &nphi->dest);
 }
 
 /* phi instructions are left partially constructed.  We don't resolve