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
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:
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)) ?
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)
{
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)
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.
*/
return 0;
}
-static int
-pass_eliminate_moves(struct nv_pc_pass *ctx)
-{
- return 0;
-}
-
int
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)
}
assert(!ret && "joining");
- ret = pass_eliminate_moves(ctx);
-
for (i = 0; i < pc->num_values; ++i)
livei_release(&pc->values[i]);