summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nv50/nv50_pc_optimize.c
diff options
context:
space:
mode:
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>2010-08-10 17:36:25 +0200
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>2010-08-10 17:36:25 +0200
commit3a68fcfb6b406cf864afbf200e436fc384fd0865 (patch)
tree84e21b6659361cfa6c202c097256365faf97c45c /src/gallium/drivers/nv50/nv50_pc_optimize.c
parentfc1d72d15d929b629be399d977ad05611f01fc59 (diff)
nv50: begin implementing loops
Diffstat (limited to 'src/gallium/drivers/nv50/nv50_pc_optimize.c')
-rw-r--r--src/gallium/drivers/nv50/nv50_pc_optimize.c28
1 files changed, 9 insertions, 19 deletions
diff --git a/src/gallium/drivers/nv50/nv50_pc_optimize.c b/src/gallium/drivers/nv50/nv50_pc_optimize.c
index f2f8d0eaa3..e4b5d321db 100644
--- a/src/gallium/drivers/nv50/nv50_pc_optimize.c
+++ b/src/gallium/drivers/nv50/nv50_pc_optimize.c
@@ -120,15 +120,14 @@ nvi_isnop(struct nv_instruction *nvi)
}
static void
-nv_pc_pass_pre_emission(struct nv_pc *pc, struct nv_basic_block *b)
+nv_pc_pass_pre_emission(void *priv, struct nv_basic_block *b)
{
+ struct nv_pc *pc = (struct nv_pc *)priv;
struct nv_basic_block *in;
struct nv_instruction *nvi, *next;
int j;
uint size, n32 = 0;
- b->priv = 0;
-
for (j = pc->num_blocks - 1; j >= 0 && !pc->bb_list[j]->bin_size; --j);
if (j >= 0) {
in = pc->bb_list[j];
@@ -200,17 +199,6 @@ nv_pc_pass_pre_emission(struct nv_pc *pc, struct nv_basic_block *b)
assert(!b->entry || (b->exit && b->exit->is_long));
pc->bin_size += b->bin_size *= 4;
-
- /* descend CFG */
-
- if (!b->out[0])
- return;
- if (!b->out[1] && ++(b->out[0]->priv) != b->out[0]->num_in)
- return;
-
- for (j = 0; j < 2; ++j)
- if (b->out[j] && b->out[j] != b)
- nv_pc_pass_pre_emission(pc, b->out[j]);
}
int
@@ -219,9 +207,9 @@ nv_pc_exec_pass2(struct nv_pc *pc)
debug_printf("preparing %u blocks for emission\n", pc->num_blocks);
pc->bb_list = CALLOC(pc->num_blocks, sizeof(struct nv_basic_block *));
-
pc->num_blocks = 0;
- nv_pc_pass_pre_emission(pc, pc->root);
+
+ nv_pc_pass_in_order(pc->root, nv_pc_pass_pre_emission, pc);
return 0;
}
@@ -307,8 +295,11 @@ nv_pass_fold_stores(struct nv_pass *ctx, struct nv_basic_block *b)
if (nvi->def[0]->refc > 1)
continue;
- /* cannot MOV immediate to $oX */
- if (nvi->src[0]->value->reg.file == NV_FILE_IMM)
+ /* cannot write to $oX when using immediate */
+ for (j = 0; j < 4 && nvi->src[j]; ++j)
+ if (nvi->src[j]->value->reg.file == NV_FILE_IMM)
+ break;
+ if (j < 4)
continue;
nvi->def[0] = sti->def[0];
@@ -339,7 +330,6 @@ nv_pass_fold_loads(struct nv_pass *ctx, struct nv_basic_block *b)
if (is_immd_move(ld) && nv50_nvi_can_use_imm(nvi, j)) {
nv_reference(ctx->pc, &nvi->src[j], ld->src[0]->value);
- debug_printf("folded immediate %i\n", ld->def[0]->n);
continue;
}