diff options
-rw-r--r-- | src/gallium/drivers/nv50/nv50_pc_print.c | 12 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv50_pc_regalloc.c | 53 |
2 files changed, 32 insertions, 33 deletions
diff --git a/src/gallium/drivers/nv50/nv50_pc_print.c b/src/gallium/drivers/nv50/nv50_pc_print.c index c2c3eb25bcb..c812dbd066b 100644 --- a/src/gallium/drivers/nv50/nv50_pc_print.c +++ b/src/gallium/drivers/nv50/nv50_pc_print.c @@ -181,9 +181,11 @@ nv_print_address(const char c, int buf, struct nv_value *a, int offset) static INLINE void nv_print_cond(struct nv_instruction *nvi) { - PRINT("%s%s %s$c%i ", + char pfx = nv_value_allocated(nvi->flags_src->value->join) ? '$' : '%'; + + PRINT("%s%s %s%cc%i ", gree, nv_cond_name(nvi->cc), - mgta, nv_value_id(nvi->flags_src->value)); + mgta, pfx, nv_value_id(nvi->flags_src->value)); } static INLINE void @@ -197,8 +199,8 @@ nv_print_value(struct nv_value *value, struct nv_value *ind, ubyte type) if (value->reg.file != NV_FILE_FLAGS) PRINT(" %s%s", gree, nv_type_name(type)); - if (!nv_value_allocated(value)) - reg_pfx = nv_value_allocated(value->join) ? '&' : '%'; + if (!nv_value_allocated(value->join)) + reg_pfx = '%'; switch (value->reg.file) { case NV_FILE_GPR: @@ -301,7 +303,7 @@ nv_print_instruction(struct nv_instruction *i) continue; if (i->src[j]->mod) - PRINT(" %s", nv_modifier_string(i->src[j]->mod)); + PRINT(" %s%s", gree, nv_modifier_string(i->src[j]->mod)); nv_print_ref(i->src[j], (j == nv50_indirect_opnd(i)) ? diff --git a/src/gallium/drivers/nv50/nv50_pc_regalloc.c b/src/gallium/drivers/nv50/nv50_pc_regalloc.c index 3cec219d1ac..568384fd823 100644 --- a/src/gallium/drivers/nv50/nv50_pc_regalloc.c +++ b/src/gallium/drivers/nv50/nv50_pc_regalloc.c @@ -56,6 +56,25 @@ struct nv_pc_pass { uint pass_seq; }; +/* check if bf (future) can be reached from bp (past) */ +static boolean +bb_reachable_by(struct nv_basic_block *bf, struct nv_basic_block *bp, + struct nv_basic_block *bt) +{ + if (bf == bp) + return TRUE; + if (bp == bt) + return FALSE; + + if (bp->out[0] && bp->out[0] != bp && + bb_reachable_by(bf, bp->out[0], bt)) + return TRUE; + if (bp->out[1] && bp->out[1] != bp && + bb_reachable_by(bf, bp->out[1], bt)) + return TRUE; + return FALSE; +} + static void ranges_coalesce(struct nv_range *range) { @@ -422,7 +441,7 @@ pass_generate_phi_movs(struct nv_pc_pass *ctx, struct nv_basic_block *b) if (!i->src[j]) j = 3; else - if (i->src[j]->value->insn->bb == p) + if (bb_reachable_by(pn, i->src[j]->value->insn->bb, b)) break; } if (j >= 4) @@ -580,25 +599,6 @@ live_set_test(struct nv_basic_block *b, struct nv_ref *ref) return b->live_set[n / 32] & (1 << (n % 32)); } -/* check if bf (future) can be reached from bp (past) */ -static boolean -bb_reachable_by(struct nv_basic_block *bf, struct nv_basic_block *bp, - struct nv_basic_block *bt) -{ - if (bf == bp) - return TRUE; - if (bp == bt) - return FALSE; - - if (bp->out[0] && bp->out[0] != bp && - bb_reachable_by(bf, bp->out[0], bt)) - return TRUE; - if (bp->out[1] && bp->out[1] != bp && - bb_reachable_by(bf, bp->out[1], bt)) - return TRUE; - return FALSE; -} - /* The live set of a block contains those values that are live immediately * before the beginning of the block. */ @@ -918,12 +918,6 @@ pass_linear_scan(struct nv_pc_pass *ctx, int iter) return 0; } -static int -pass_eliminate_moves(struct nv_pc_pass *ctx) -{ - return 0; -} - int nv_pc_exec_pass1(struct nv_pc *pc) { @@ -971,6 +965,11 @@ nv_pc_exec_pass1(struct nv_pc *pc) goto out; } +#ifdef NV50_RA_DEBUG_LIVEI + for (i = 0; i < pc->num_values; ++i) + livei_print(&pc->values[i]); +#endif + for (i = 0; i < 2; ++i) { ret = pass_join_values(ctx, i); if (ret) @@ -981,8 +980,6 @@ nv_pc_exec_pass1(struct nv_pc *pc) } assert(!ret && "joining"); - ret = pass_eliminate_moves(ctx); - for (i = 0; i < pc->num_values; ++i) livei_release(&pc->values[i]); |