r600g: Add pending output function
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>
This commit is contained in:
committed by
Dave Airlie
parent
9c48a139b0
commit
9d31596d7a
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user