X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2FTEMPLATE%2Fbearch_TEMPLATE.c;h=d7fa82cde1180eceaa6efcc6e613502a5fe198a9;hb=e1c59206a1d08078fb36e930101eb4b47f959eab;hp=099a7a0023b4e0578db7282fb57668cc2e37bf72;hpb=ea9d6aace596cd1d3c1cfa724943f198b26bc182;p=libfirm diff --git a/ir/be/TEMPLATE/bearch_TEMPLATE.c b/ir/be/TEMPLATE/bearch_TEMPLATE.c index 099a7a002..d7fa82cde 100644 --- a/ir/be/TEMPLATE/bearch_TEMPLATE.c +++ b/ir/be/TEMPLATE/bearch_TEMPLATE.c @@ -263,10 +263,11 @@ static void TEMPLATE_prepare_graph(void *self) { /** * Called immediatly before emit phase. */ -static void TEMPLATE_finish_irg(ir_graph *irg, TEMPLATE_code_gen_t *cg) { - /* TODO: - fix offsets for nodes accessing stack - - ... - */ +static void TEMPLATE_finish_irg(void *self) { + TEMPLATE_code_gen_t *cg = self; + ir_graph *irg = cg->irg; + + dump_ir_block_graph_sched(irg, "-TEMPLATE-finished"); } @@ -294,15 +295,13 @@ static void TEMPLATE_after_ra(void *self) { static void TEMPLATE_emit_and_done(void *self) { TEMPLATE_code_gen_t *cg = self; ir_graph *irg = cg->irg; - FILE *out = cg->out; + FILE *out = cg->isa->out; if (cg->emit_decls) { - TEMPLATE_gen_decls(cg->out); + TEMPLATE_gen_decls(out); cg->emit_decls = 0; } - TEMPLATE_finish_irg(irg, cg); - dump_ir_block_graph_sched(irg, "-TEMPLATE-finished"); TEMPLATE_gen_routine(out, irg, cg); cur_reg_set = NULL; @@ -312,7 +311,7 @@ static void TEMPLATE_emit_and_done(void *self) { free(self); } -static void *TEMPLATE_cg_init(FILE *F, const be_irg_t *birg); +static void *TEMPLATE_cg_init(const be_irg_t *birg); static const arch_code_generator_if_t TEMPLATE_code_gen_if = { TEMPLATE_cg_init, @@ -320,21 +319,22 @@ static const arch_code_generator_if_t TEMPLATE_code_gen_if = { TEMPLATE_before_sched, /* before scheduling hook */ TEMPLATE_before_ra, /* before register allocation hook */ TEMPLATE_after_ra, /* after register allocation hook */ + TEMPLATE_finish_irg, TEMPLATE_emit_and_done }; /** * Initializes the code generator. */ -static void *TEMPLATE_cg_init(FILE *F, const be_irg_t *birg) { +static void *TEMPLATE_cg_init(const be_irg_t *birg) { TEMPLATE_isa_t *isa = (TEMPLATE_isa_t *)birg->main_env->arch_env->isa; TEMPLATE_code_gen_t *cg = xmalloc(sizeof(*cg)); cg->impl = &TEMPLATE_code_gen_if; cg->irg = birg->irg; cg->reg_set = new_set(TEMPLATE_cmp_irn_reg_assoc, 1024); - cg->out = F; cg->arch_env = birg->main_env->arch_env; + cg->isa = isa; cg->birg = birg; FIRM_DBG_REGISTER(cg->mod, "firm.be.TEMPLATE.cg"); @@ -375,7 +375,7 @@ static TEMPLATE_isa_t TEMPLATE_isa_template = { /** * Initializes the backend ISA and opens the output file. */ -static void *TEMPLATE_init(void) { +static void *TEMPLATE_init(FILE *outfile) { static int inited = 0; TEMPLATE_isa_t *isa; @@ -385,6 +385,8 @@ static void *TEMPLATE_init(void) { isa = xcalloc(1, sizeof(*isa)); memcpy(isa, &TEMPLATE_isa_template, sizeof(*isa)); + isa->out = outfile; + TEMPLATE_register_init(isa); TEMPLATE_create_opcodes(); @@ -489,7 +491,7 @@ void TEMPLATE_get_call_abi(const void *self, ir_type *method_type, be_abi_call_t /* be_abi_call_param_reg(abi, i, reg); */ /* default: all parameters on stack */ - be_abi_call_param_stack(abi, i); + be_abi_call_param_stack(abi, i, 4, 0, 0); } /* TODO: set correct return register */ @@ -537,6 +539,38 @@ static const list_sched_selector_t *TEMPLATE_get_list_sched_selector(const void return &TEMPLATE_sched_selector; } +/** + * Returns the necessary byte alignment for storing a register of given class. + */ +static int TEMPLATE_get_reg_class_alignment(const void *self, const arch_register_class_t *cls) { + ir_mode *mode = arch_register_class_mode(cls); + return get_mode_size_bytes(mode); +} + +/** + * Returns the libFirm configuration parameter for this backend. + */ +static const backend_params *TEMPLATE_get_libfirm_params(void) { + static arch_dep_params_t ad = { + 1, /* allow subs */ + 0, /* Muls are fast enough on Firm */ + 31, /* shift would be ok */ + 0, /* no Mulhs */ + 0, /* no Mulhu */ + 0, /* no Mulh */ + }; + static backend_params p = { + NULL, /* no additional opcodes */ + NULL, /* will be set later */ + 0, /* no dword lowering */ + NULL, /* no creator function */ + NULL, /* context for create_intrinsic_fkt */ + }; + + p.dep_param = &ad; + return &p; +} + #ifdef WITH_LIBCORE static void TEMPLATE_register_options(lc_opt_entry_t *ent) { @@ -544,9 +578,6 @@ static void TEMPLATE_register_options(lc_opt_entry_t *ent) #endif /* WITH_LIBCORE */ const arch_isa_if_t TEMPLATE_isa_if = { -#ifdef WITH_LIBCORE - TEMPLATE_register_options, -#endif TEMPLATE_init, TEMPLATE_done, TEMPLATE_get_n_reg_class, @@ -556,4 +587,9 @@ const arch_isa_if_t TEMPLATE_isa_if = { TEMPLATE_get_irn_handler, TEMPLATE_get_code_generator_if, TEMPLATE_get_list_sched_selector, + TEMPLATE_get_reg_class_alignment, + TEMPLATE_get_libfirm_params, +#ifdef WITH_LIBCORE + TEMPLATE_register_options +#endif };