X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fbearch.c;h=5cd7cbaf46ad71313e133c837ed4d3f5fda63ecc;hb=67c0573183f113a00eca153a9b80724641cd8e20;hp=d21611db59c7d1374f368394fd015665aa08d068;hpb=a9132de4425fe5540d316e1a2c7fd37635464514;p=libfirm diff --git a/ir/be/bearch.c b/ir/be/bearch.c index d21611db5..5cd7cbaf4 100644 --- a/ir/be/bearch.c +++ b/ir/be/bearch.c @@ -39,7 +39,7 @@ #include "irprintf.h" -static const arch_register_req_t no_requirement = { +arch_register_req_t const arch_no_requirement = { arch_register_req_type_none, NULL, NULL, @@ -47,21 +47,6 @@ static const arch_register_req_t no_requirement = { 0, 0 }; -const arch_register_req_t *arch_no_register_req = &no_requirement; - -static reg_out_info_t dummy_info = { - NULL, - &no_requirement -}; - -/* Initialize the architecture environment struct. */ -arch_env_t *arch_env_begin_codegeneration(const arch_isa_if_t *isa_if, - be_main_env_t *main_env) -{ - arch_env_t *arch_env = isa_if->begin_codegeneration(main_env); - arch_env->main_env = main_env; - return arch_env; -} /** * Get the isa responsible for a node. @@ -99,17 +84,6 @@ int arch_get_sp_bias(ir_node *irn) return ops->get_sp_bias(irn); } -arch_inverse_t *arch_get_inverse(const ir_node *irn, int i, arch_inverse_t *inverse, struct obstack *obstack) -{ - const arch_irn_ops_t *ops = get_irn_ops(irn); - - if (ops->get_inverse) { - return ops->get_inverse(irn, i, inverse, obstack); - } else { - return NULL; - } -} - int arch_possible_memory_operand(const ir_node *irn, unsigned int i) { const arch_irn_ops_t *ops = get_irn_ops(irn); @@ -143,31 +117,9 @@ int arch_get_op_estimated_cost(const ir_node *irn) } } -static reg_out_info_t *get_out_info(const ir_node *node) -{ - size_t pos = 0; - const backend_info_t *info; - assert(get_irn_mode(node) != mode_T); - if (is_Proj(node)) { - pos = get_Proj_proj(node); - node = get_Proj_pred(node); - } - - info = be_get_info(node); - /* We have a problem with the switch-node where there can be arbitrary - * Proj-numbers, so we can't easily allocate an array big-enough to hold - * all of them. So until we rewrite Switch-nodes we need this special case - */ - if (info->out_infos == NULL) - return &dummy_info; - assert(pos < ARR_LEN(info->out_infos)); - return &info->out_infos[pos]; -} - static reg_out_info_t *get_out_info_n(const ir_node *node, unsigned pos) { const backend_info_t *info = be_get_info(node); - assert(!is_Proj(node)); assert(pos < (unsigned)ARR_LEN(info->out_infos)); return &info->out_infos[pos]; } @@ -205,58 +157,37 @@ void arch_set_irn_register(ir_node *node, const arch_register_t *reg) out->reg = reg; } -const arch_register_req_t *arch_get_irn_register_req(const ir_node *node) -{ - reg_out_info_t *out = get_out_info(node); - return out->req; -} - -arch_irn_flags_t arch_get_irn_flags(const ir_node *node) -{ - backend_info_t *info; - if (is_Proj(node)) - return arch_irn_flags_not_scheduled; - - info = be_get_info(node); - return info->flags; -} - void arch_set_irn_flags(ir_node *node, arch_irn_flags_t flags) { - backend_info_t *info; - - /* setting flags is only supported for instructions currently. - * (mainly because we found no use for it yet and saved the space for - * be_infos for them */ - assert(!is_Proj(node)); - info = be_get_info(node); + backend_info_t *const info = be_get_info(node); info->flags = flags; } void arch_add_irn_flags(ir_node *node, arch_irn_flags_t flags) { - backend_info_t *info; - assert(!is_Proj(node)); - info = be_get_info(node); + backend_info_t *const info = be_get_info(node); info->flags |= flags; } bool arch_reg_is_allocatable(const arch_register_req_t *req, const arch_register_t *reg) { - if (reg->type & arch_register_type_joker) - return true; - if (req->type == arch_register_req_type_none) + assert(req->type != arch_register_req_type_none); + if (req->cls != reg->reg_class) return false; - if (req->type & arch_register_req_type_limited) { - if (reg->reg_class != req->cls) - return false; + if (reg->type & arch_register_type_virtual) + return true; + if (arch_register_req_is(req, limited)) return rbitset_is_set(req->limited, reg->index); - } - return req->cls == reg->reg_class; + return true; } -void arch_dump_register_req(FILE *F, const arch_register_req_t *req, +/** + * Print information about a register requirement in human readable form + * @param F output stream/file + * @param req The requirements structure to format. + */ +static void arch_dump_register_req(FILE *F, const arch_register_req_t *req, const ir_node *node) { if (req == NULL || req->type == arch_register_req_type_none) { @@ -286,7 +217,7 @@ void arch_dump_register_req(FILE *F, const arch_register_req_t *req, fprintf(F, " same as"); for (i = 0; 1U << i <= other; ++i) { if (other & (1U << i)) { - ir_fprintf(F, " %+F", get_irn_n(skip_Proj_const(node), i)); + ir_fprintf(F, " #%d (%+F)", i, get_irn_n(skip_Proj_const(node), i)); } } } @@ -298,7 +229,7 @@ void arch_dump_register_req(FILE *F, const arch_register_req_t *req, fprintf(F, " different from"); for (i = 0; 1U << i <= other; ++i) { if (other & (1U << i)) { - ir_fprintf(F, " %+F", get_irn_n(skip_Proj_const(node), i)); + ir_fprintf(F, " #%d (%+F)", i, get_irn_n(skip_Proj_const(node), i)); } } } @@ -319,26 +250,26 @@ void arch_dump_register_req(FILE *F, const arch_register_req_t *req, void arch_dump_reqs_and_registers(FILE *F, const ir_node *node) { - int n_ins = get_irn_arity(node); + backend_info_t *const info = be_get_info(node); + int const n_ins = get_irn_arity(node); + /* don't fail on invalid graphs */ + if (!info || (!info->in_reqs && n_ins != 0) || !info->out_infos) { + fprintf(F, "invalid register requirements!!!\n"); + return; + } + for (int i = 0; i < n_ins; ++i) { const arch_register_req_t *req = arch_get_irn_register_req_in(node, i); fprintf(F, "inreq #%d = ", i); arch_dump_register_req(F, req, node); fputs("\n", F); } - unsigned n_outs = arch_get_irn_n_outs(node); - for (unsigned o = 0; o < n_outs; ++o) { + be_foreach_out(node, o) { const arch_register_req_t *req = arch_get_irn_register_req_out(node, o); fprintf(F, "outreq #%u = ", o); arch_dump_register_req(F, req, node); - fputs("\n", F); - } - for (unsigned o = 0; o < n_outs; ++o) { - const arch_register_t *reg = arch_get_irn_register_out(node, o); - const arch_register_req_t *req = arch_get_irn_register_req_out(node, o); - if (req->cls == NULL) - continue; - fprintf(F, "reg #%u = %s\n", o, reg != NULL ? reg->name : "n/a"); + const arch_register_t *reg = arch_get_irn_register_out(node, o); + fprintf(F, " [%s]\n", reg != NULL ? reg->name : "n/a"); } fprintf(F, "flags =");