X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Ffirm%2Fbearch_firm.c;h=96f42a3160e01a73044b981ab5aa2cb9d63626df;hb=17e47394fa72025d14172a2acef2d258a067aa42;hp=54212fb0dd43d6a35e2ef77cdf3dd4eeaadae627;hpb=6977acc37dcd9cb20658f3b8d368ec87de1a1b68;p=libfirm diff --git a/ir/be/firm/bearch_firm.c b/ir/be/firm/bearch_firm.c index 54212fb0d..96f42a316 100644 --- a/ir/be/firm/bearch_firm.c +++ b/ir/be/firm/bearch_firm.c @@ -21,9 +21,11 @@ #include "irgwalk.h" #include "type.h" +#include "../be_t.h" #include "../bearch.h" #include "../besched.h" #include "../beutil.h" +#include "../beabi.h" #define N_REGS 3 @@ -38,7 +40,7 @@ typedef struct { static arch_register_t datab_regs[N_REGS]; static arch_register_class_t reg_classes[] = { - { "datab", N_REGS, datab_regs }, + { "datab", N_REGS, NULL, datab_regs }, }; static ir_op *op_push; @@ -136,9 +138,10 @@ static void *firm_init(void) obstack_init(&obst); for(k = 0; k < N_CLASSES; ++k) { - const arch_register_class_t *cls = ®_classes[k]; + arch_register_class_t *cls = ®_classes[k]; int i; + cls->mode = mode_Is; for(i = 0; i < cls->n_regs; ++i) { int n; char buf[8]; @@ -196,6 +199,41 @@ static const arch_register_class_t *firm_get_reg_class(const void *self, int i) return ®_classes[i]; } +static const arch_register_class_t *firm_get_reg_class_for_mode(const void *self, const ir_mode *irm) +{ + 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 *between_type = NULL; + const arch_register_class_t *cls = ®_classes[CLS_DATAB]; + int i, n; + + if(!between_type) { + between_type = new_type_class(new_id_from_str("firm_be_between")); + set_type_size_bytes(between_type, 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); + } + + for(i = 0, n = get_method_n_ress(method_type); i < n; ++i) { + ir_type *t = get_method_res_type(method_type, i); + if(is_Primitive_type(t)) + be_abi_call_res_reg(abi, i, &cls->regs[i]); + } + + be_abi_call_set_flags(abi, BE_ABI_NONE, between_type); +} + + static const arch_register_req_t firm_std_reg_req = { arch_register_req_type_normal, ®_classes[CLS_DATAB], @@ -298,12 +336,23 @@ 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 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 = { firm_get_irn_reg_req, firm_set_irn_reg, firm_get_irn_reg, firm_classify, - firm_get_flags + firm_get_flags, + firm_get_frame_entity, + firm_set_stack_bias }; static const arch_irn_ops_t firm_irn_ops = { @@ -493,16 +542,12 @@ static void firm_before_ra(void *self) irg_walk_graph(cg->irg, imm_scheduler, NULL, NULL); } -static const arch_register_t *firm_get_stack_register(void *self) { - return &datab_regs[0]; -} - 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(FILE *file_handle, const be_irg_t *birg); static const arch_code_generator_if_t firm_code_gen_if = { firm_cg_init, @@ -511,15 +556,14 @@ static const arch_code_generator_if_t firm_code_gen_if = { firm_before_ra, NULL, /* lower spill */ NULL, /* lower reload */ - firm_get_stack_register, firm_codegen_done }; -static void *firm_cg_init(FILE *file_handle, ir_graph *irg, const arch_env_t *env) +static void *firm_cg_init(FILE *file_handle, 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; } @@ -533,10 +577,6 @@ static const list_sched_selector_t *firm_get_list_sched_selector(const void *sel return trivial_selector; } -static long firm_handle_call_proj(const void *self, ir_node *proj, int is_keep) { - return get_Proj_proj(proj); -} - #ifdef WITH_LIBCORE static void firm_register_options(lc_opt_entry_t *ent) { @@ -551,8 +591,9 @@ const arch_isa_if_t firm_isa = { firm_done, firm_get_n_reg_class, firm_get_reg_class, + firm_get_reg_class_for_mode, + firm_get_call_abi, firm_get_irn_handler, firm_get_code_generator_if, - firm_get_list_sched_selector, - firm_handle_call_proj + firm_get_list_sched_selector };