mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-20 10:43:29 +00:00
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:
parent
1452dcca9a
commit
c5fa4fe92a
2 changed files with 8 additions and 11 deletions
|
@ -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].
|
||||
|
|
|
@ -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]]);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue