*/
void (*before_ra)(void *self);
+ /**
+ * Called after register allocation to lower Spills to Stores
+ */
+ ir_node *(*lower_spill)(void *self, ir_node *spill);
+
+ /**
+ * Called after register allocation to lower Reloads to Loads
+ */
+ ir_node *(*lower_reload)(void *self, ir_node *reload);
+
/**
* Called after everything happened.
* The code generator must also be de-allocated here.
* @param self The this pointer.
* @return Some code generator interface.
*/
- const arch_code_generator_if_t *(*get_code_generator)(void *self);
+ const arch_code_generator_if_t *(*get_code_generator_if)(void *self);
/**
* Get the list scheduler to use.
for(i = 0, n = get_irp_n_irgs(); i < n; ++i) {
ir_graph *irg = get_irp_irg(i);
- arch_code_generator_t *cg;
const arch_code_generator_if_t *cg_if;
DBG((env.dbg, LEVEL_2, "====> IRG: %F\n", irg));
current_ir_graph = irg;
/* Get the code generator interface. */
- cg_if = isa->impl->get_code_generator(isa);
+ cg_if = isa->impl->get_code_generator_if(isa);
/* get a code generator for this graph. */
- cg = cg_if->init(file_handle, irg, env.arch_env);
+ env.cg = cg_if->init(file_handle, irg, env.arch_env);
/* create the code generator and generate code. */
prepare_graph(&env, irg);
- arch_code_generator_prepare_graph(cg);
+ arch_code_generator_prepare_graph(env.cg);
edges_deactivate(irg);
dead_node_elimination(irg);
dump(DUMP_PREPARED, irg, "-prepared", dump_ir_block_graph);
/* Schedule the graphs. */
- arch_code_generator_before_sched(cg);
+ arch_code_generator_before_sched(env.cg);
list_sched(isa, irg);
dump(DUMP_SCHED, irg, "-sched", dump_ir_block_graph_sched);
sched_verify_irg(irg);
/* Do register allocation */
- arch_code_generator_before_ra(cg);
+ arch_code_generator_before_ra(env.cg);
ra->allocate(&env, irg);
dump(DUMP_RA, irg, "-ra", dump_ir_block_graph_sched);
- arch_code_generator_done(cg);
+ arch_code_generator_done(env.cg);
dump(DUMP_FINAL, irg, "-end", dump_ir_block_graph_sched);
}
static void *firm_cg_init(FILE *file_handle, ir_graph *irg, const arch_env_t *env);
-static const arch_code_generator_if_t firm_code_gen = {
+static const arch_code_generator_if_t firm_code_gen_if = {
firm_cg_init,
firm_prepare_graph,
firm_before_sched,
firm_before_ra,
+ NULL, /* lower spill */
+ NULL, /* lower reload */
firm_codegen_done
};
static void *firm_cg_init(FILE *file_handle, ir_graph *irg, const arch_env_t *env)
{
firm_code_gen_t *cg = xmalloc(sizeof(*cg));
- cg->impl = &firm_code_gen;
+ cg->impl = &firm_code_gen_if;
cg->irg = irg;
return cg;
}
-static const arch_code_generator_if_t *firm_get_code_generator(void *self)
+static const arch_code_generator_if_t *firm_get_code_generator_if(void *self)
{
- return &firm_code_gen;
+ return &firm_code_gen_if;
}
static const list_sched_selector_t *firm_get_list_sched_selector(const void *self) {
firm_get_n_reg_class,
firm_get_reg_class,
firm_get_irn_handler,
- firm_get_code_generator,
+ firm_get_code_generator_if,
firm_get_list_sched_selector
};