X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Ffirm%2Fbearch_firm.c;h=a61efbfc1fa707900650d95e7bd3e95b8da46754;hb=2601105986be688124e6023d41304d0e27be4442;hp=e1e934e26858786e070a103773042ebd61dafb17;hpb=bea700ecc61bc5228929abaf9e94de34092a04de;p=libfirm diff --git a/ir/be/firm/bearch_firm.c b/ir/be/firm/bearch_firm.c index e1e934e26..a61efbfc1 100644 --- a/ir/be/firm/bearch_firm.c +++ b/ir/be/firm/bearch_firm.c @@ -20,7 +20,9 @@ #include "ircons_t.h" #include "irgwalk.h" #include "type.h" +#include "irtools.h" +#include "../be_t.h" #include "../bearch.h" #include "../besched.h" #include "../beutil.h" @@ -121,14 +123,14 @@ static int dump_node_Imm(ir_node *n, FILE *F, dump_reason_t reason) { return bad; } -static void *firm_init(void) +static void *firm_init(FILE *outfile) { static struct obstack obst; static int inited = 0; - arch_isa_t *isa = xmalloc(sizeof(*isa)); + arch_isa_t *isa = xmalloc(sizeof(*isa)); int k; - isa->impl = &firm_isa; + isa->impl = &firm_isa; if(inited) return NULL; @@ -140,7 +142,7 @@ static void *firm_init(void) arch_register_class_t *cls = ®_classes[k]; int i; - cls->mode = mode_Is; + cls->mode = mode_Is; for(i = 0; i < cls->n_regs; ++i) { int n; char buf[8]; @@ -203,17 +205,39 @@ static const arch_register_class_t *firm_get_reg_class_for_mode(const void *self return mode_is_datab(irm) ? ®_classes[CLS_DATAB] : NULL; } +static ir_type *firm_abi_get_between_type(void *self) { + static ir_type *between_type = NULL; + + if(!between_type) { + between_type = new_type_class(new_id_from_str("firm_be_between")); + set_type_size_bytes(between_type, 0); + } + + return between_type; +} + +static const be_abi_callbacks_t firm_abi_callbacks = { + NULL, + NULL, + firm_abi_get_between_type, + NULL, + NULL, + NULL, +}; + static void firm_get_call_abi(const void *self, ir_type *method_type, be_abi_call_t *abi) { const arch_register_class_t *cls = ®_classes[CLS_DATAB]; int i, n; + be_abi_call_flags_t flags = { { 0, 0, 0, 0, 0 } }; + for(i = 0, n = get_method_n_params(method_type); i < n; ++i) { ir_type *t = get_method_param_type(method_type, i); if(is_Primitive_type(t)) be_abi_call_param_reg(abi, i, &cls->regs[i]); else - be_abi_call_param_stack(abi, i); + be_abi_call_param_stack(abi, i, 1, 0, 0); } for(i = 0, n = get_method_n_ress(method_type); i < n; ++i) { @@ -222,7 +246,8 @@ static void firm_get_call_abi(const void *self, ir_type *method_type, be_abi_cal be_abi_call_res_reg(abi, i, &cls->regs[i]); } - be_abi_call_set_flags(abi, BE_ABI_NONE, 0); + flags.val = 0; + be_abi_call_set_flags(abi, flags, &firm_abi_callbacks); } @@ -328,7 +353,13 @@ static arch_irn_flags_t firm_get_flags(const void *self, const ir_node *irn) return res; } -static void firm_set_stack_bias(const void *self, ir_node *irn, int bias) { +static void firm_set_stack_bias(const void *self, ir_node *irn, int bias) +{ +} + +static entity *firm_get_frame_entity(const void *self, const ir_node *irn) +{ + return NULL; } static const arch_irn_ops_if_t firm_irn_ops_if = { @@ -337,6 +368,7 @@ static const arch_irn_ops_if_t firm_irn_ops_if = { firm_get_irn_reg, firm_classify, firm_get_flags, + firm_get_frame_entity, firm_set_stack_bias }; @@ -477,16 +509,11 @@ typedef struct _firm_code_gen_t { } firm_code_gen_t; -static void clear_link(ir_node *irn, void *data) -{ - set_irn_link(irn, NULL); -} - static void firm_prepare_graph(void *self) { firm_code_gen_t *cg = self; - irg_walk_graph(cg->irg, clear_link, localize_const_walker, NULL); + irg_walk_graph(cg->irg, firm_clear_link, localize_const_walker, NULL); irg_walk_graph(cg->irg, NULL, prepare_walker, NULL); } @@ -527,28 +554,32 @@ static void firm_before_ra(void *self) irg_walk_graph(cg->irg, imm_scheduler, NULL, NULL); } +static void firm_after_ra(void *self) +{ +} + static void firm_codegen_done(void *self) { free(self); } -static void *firm_cg_init(FILE *file_handle, ir_graph *irg, const arch_env_t *env); +static void *firm_cg_init(const be_irg_t *birg); static const arch_code_generator_if_t firm_code_gen_if = { firm_cg_init, + NULL, firm_prepare_graph, firm_before_sched, firm_before_ra, - NULL, /* lower spill */ - NULL, /* lower reload */ + firm_after_ra, firm_codegen_done }; -static void *firm_cg_init(FILE *file_handle, ir_graph *irg, const arch_env_t *env) +static void *firm_cg_init(const be_irg_t *birg) { firm_code_gen_t *cg = xmalloc(sizeof(*cg)); cg->impl = &firm_code_gen_if; - cg->irg = irg; + cg->irg = birg->irg; return cg; } @@ -562,6 +593,37 @@ static const list_sched_selector_t *firm_get_list_sched_selector(const void *sel return trivial_selector; } +/** + * Returns the necessary byte alignment for storing a register of given class. + */ +static int firm_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 *firm_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 */ + }; + + p.dep_param = &ad; + return &p; +} + #ifdef WITH_LIBCORE static void firm_register_options(lc_opt_entry_t *ent) { @@ -569,9 +631,6 @@ static void firm_register_options(lc_opt_entry_t *ent) #endif const arch_isa_if_t firm_isa = { -#ifdef WITH_LIBCORE - firm_register_options, -#endif firm_init, firm_done, firm_get_n_reg_class, @@ -580,5 +639,10 @@ const arch_isa_if_t firm_isa = { firm_get_call_abi, firm_get_irn_handler, firm_get_code_generator_if, - firm_get_list_sched_selector + firm_get_list_sched_selector, + firm_get_reg_class_alignment, + firm_get_libfirm_params, +#ifdef WITH_LIBCORE + firm_register_options, +#endif };