X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Ffirm%2Fbearch_firm.c;h=1f8c290f630477cb9b5f1f3e68eb9b85a1329d6c;hb=03214ca29ad177e9d428806b442a6011f70ec6fc;hp=595a5439fc074b2e92aa9a49752445fb2031a04b;hpb=6d3f394d9eaa5ba80d658b12c9167088eb5093a4;p=libfirm diff --git a/ir/be/firm/bearch_firm.c b/ir/be/firm/bearch_firm.c index 595a5439f..1f8c290f6 100644 --- a/ir/be/firm/bearch_firm.c +++ b/ir/be/firm/bearch_firm.c @@ -126,10 +126,10 @@ static void *firm_init(void) { 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; @@ -141,7 +141,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]; @@ -204,27 +204,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 void firm_get_call_abi(const void *self, ir_type *method_type, be_abi_call_t *abi) -{ +static ir_type *firm_abi_get_between_type(void *self) { static ir_type *between_type = NULL; - be_abi_call_flags_t flags; - const arch_register_class_t *cls = ®_classes[CLS_DATAB]; - int i, n; - be_abi_call_flags_t call_flags = { { 0, 0, 0, 0, 0 } }; - 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) { @@ -234,7 +246,7 @@ static void firm_get_call_abi(const void *self, ir_type *method_type, be_abi_cal } flags.val = 0; - be_abi_call_set_flags(abi, flags, between_type); + be_abi_call_set_flags(abi, flags, &firm_abi_callbacks); } @@ -585,6 +597,14 @@ 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); +} + #ifdef WITH_LIBCORE static void firm_register_options(lc_opt_entry_t *ent) { @@ -592,9 +612,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, @@ -603,5 +620,9 @@ 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, +#ifdef WITH_LIBCORE + firm_register_options, +#endif };