r600g: Add pending output function
authorGlenn Kennard <glenn.kennard@gmail.com>
Sun, 5 Mar 2017 17:26:50 +0000 (18:26 +0100)
committerDave Airlie <airlied@redhat.com>
Thu, 8 Feb 2018 23:53:08 +0000 (09:53 +1000)
Spills have to happen after the VLIW bundle currently
processed, so defer emitting the spill op.

Signed-off-by: Glenn Kennard <glenn.kennard@gmail.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_asm.c
src/gallium/drivers/r600/r600_asm.h

index 5b74be1748aee1958d82d602194269e3cc25047b..7a4dddb7b6cb780a6d04de233e1741632918dc73 100644 (file)
@@ -231,6 +231,15 @@ int r600_bytecode_add_output(struct r600_bytecode *bc,
        return 0;
 }
 
+int r600_bytecode_add_pending_output(struct r600_bytecode *bc,
+               const struct r600_bytecode_output *output)
+{
+       assert(bc->n_pending_outputs + 1 < ARRAY_SIZE(bc->pending_outputs));
+       bc->pending_outputs[bc->n_pending_outputs++] = *output;
+
+       return 0;
+}
+
 /* alu instructions that can ony exits once per group */
 static int is_alu_once_inst(struct r600_bytecode_alu *alu)
 {
@@ -1301,6 +1310,15 @@ int r600_bytecode_add_alu_type(struct r600_bytecode *bc,
        if (nalu->dst.rel && bc->r6xx_nop_after_rel_dst)
                insert_nop_r6xx(bc);
 
+       /* Might need to insert spill write ops after current clause */
+       if (nalu->last && bc->n_pending_outputs) {
+               while (bc->n_pending_outputs) {
+                       r = r600_bytecode_add_output(bc, &bc->pending_outputs[--bc->n_pending_outputs]);
+                       if (r)
+                               return r;
+               }
+       }
+
        return 0;
 }
 
index b8abdf014d7f74b2f9591feba4a5348acae3c339..93ac717fb8f9b6eb9edf56a1d718a80e4f517f03 100644 (file)
@@ -274,6 +274,8 @@ struct r600_bytecode {
        unsigned        index_reg[2]; /* indexing register CF_INDEX_[01] */
        unsigned        debug_id;
        struct r600_isa* isa;
+       struct r600_bytecode_output pending_outputs[5];
+       int n_pending_outputs;
 };
 
 /* eg_asm.c */
@@ -300,6 +302,8 @@ int r600_bytecode_add_gds(struct r600_bytecode *bc,
                const struct r600_bytecode_gds *gds);
 int r600_bytecode_add_output(struct r600_bytecode *bc,
                const struct r600_bytecode_output *output);
+int r600_bytecode_add_pending_output(struct r600_bytecode *bc,
+               const struct r600_bytecode_output *output);
 int r600_bytecode_build(struct r600_bytecode *bc);
 int r600_bytecode_add_cf(struct r600_bytecode *bc);
 int r600_bytecode_add_cfinst(struct r600_bytecode *bc,