Generate code from the dag in topological sort order.

Nicely, the need for dag_gencode to recurse seems to have been removed.

At least for a simple case, correct code is generated :)

	switch.r:49:    case 1:         *to = *from++;
	003b loadbi.i *(from + 0), .tmp10
	003c add.i from, .imm, from
	003d storep.i .tmp10, *to
This commit is contained in:
Bill Currie 2012-11-18 13:10:19 +09:00
parent 1452dcca9a
commit c5fa4fe92a
2 changed files with 8 additions and 11 deletions

View file

@ -61,6 +61,7 @@ typedef struct dagnode_s {
st_type_t type; ///< type of node (st_node = leaf)
daglabel_t *label; ///< ident/const if leaf node, or operator
etype_t tl;
struct operand_s *value; ///< operand holding the value of this node
/// \name child nodes
/// if \a children[0] is null, the rest must be null as well. Similar for
/// \a children[1].

View file

@ -492,21 +492,18 @@ generate_assignments (dag_t *dag, sblock_t *block, operand_t *src,
return dst;
}
static operand_t *dag_gencode (dag_t *dag, sblock_t *block,
const dagnode_t *dagnode);
static operand_t *
make_operand (dag_t *dag, sblock_t *block, const dagnode_t *dagnode, int index)
{
operand_t *op;
op = dag_gencode (dag, block, dagnode->children[index]);
op = dagnode->children[index]->value;
op = fix_op_type (op, dagnode->types[index]);
return op;
}
static operand_t *
dag_gencode (dag_t *dag, sblock_t *block, const dagnode_t *dagnode)
static void
dag_gencode (dag_t *dag, sblock_t *block, dagnode_t *dagnode)
{
operand_t *operands[3] = {0, 0, 0};
operand_t *dst = 0;
@ -570,15 +567,14 @@ dag_gencode (dag_t *dag, sblock_t *block, const dagnode_t *dagnode)
sblock_add_statement (block, st);
break;
}
return dst;
dagnode->value = dst;
}
void
dag_generate (dag_t *dag, sblock_t *block)
{
set_iter_t *node_iter;
int i;
for (node_iter = set_first (dag->roots); node_iter;
node_iter = set_next (node_iter))
dag_gencode (dag, block, dag->nodes[node_iter->member]);
for (i = 0; i < dag->num_nodes; i++)
dag_gencode (dag, block, dag->nodes[dag->topo[i]]);
}