X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fbearch.c;h=63ac05d9430d0336877bfe7825a5e183f0b68888;hb=5aba9af4ba804d64083d0c5899284ff8dfacf832;hp=7f3bb4d283ab4b4984dcad08a129d711bfd2e29f;hpb=91751396f87009d8f81d4888cfdce739e4a6c0fd;p=libfirm diff --git a/ir/be/bearch.c b/ir/be/bearch.c index 7f3bb4d28..63ac05d94 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,12 +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, @@ -99,17 +93,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,32 +126,11 @@ 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, int 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 >= 0 && pos < (int)ARR_LEN(info->out_infos)); + assert(pos < (unsigned)ARR_LEN(info->out_infos)); return &info->out_infos[pos]; } @@ -179,7 +141,8 @@ const arch_register_t *arch_get_irn_register(const ir_node *node) return out->reg; } -const arch_register_t *arch_get_irn_register_out(const ir_node *node, int pos) +const arch_register_t *arch_get_irn_register_out(const ir_node *node, + unsigned pos) { const reg_out_info_t *out = get_out_info_n(node, pos); return out->reg; @@ -191,7 +154,7 @@ const arch_register_t *arch_get_irn_register_in(const ir_node *node, int pos) return arch_get_irn_register(op); } -void arch_set_irn_register_out(ir_node *node, int pos, +void arch_set_irn_register_out(ir_node *node, unsigned pos, const arch_register_t *reg) { reg_out_info_t *out = get_out_info_n(node, pos); @@ -204,22 +167,6 @@ 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; @@ -243,16 +190,14 @@ void arch_add_irn_flags(ir_node *node, arch_irn_flags_t 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 (arch_register_get_class(reg) != req->cls) - return false; - return rbitset_is_set(req->limited, arch_register_get_index(reg)); - } - return req->cls == arch_register_get_class(reg); + if (reg->type & arch_register_type_virtual) + return true; + if (req->type & arch_register_req_type_limited) + return rbitset_is_set(req->limited, reg->index); + return true; } void arch_dump_register_req(FILE *F, const arch_register_req_t *req, @@ -318,32 +263,30 @@ 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); - int n_outs = arch_get_irn_n_outs(node); - arch_irn_flags_t flags = arch_get_irn_flags(node); - int i; - - for (i = 0; i < n_ins; ++i) { + int n_ins = get_irn_arity(node); + 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); } - for (i = 0; i < n_outs; ++i) { - const arch_register_req_t *req = arch_get_irn_register_req_out(node, i); - fprintf(F, "outreq #%d = ", i); + unsigned n_outs = arch_get_irn_n_outs(node); + for (unsigned o = 0; o < n_outs; ++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 (i = 0; i < n_outs; ++i) { - const arch_register_t *reg = arch_get_irn_register_out(node, i); - const arch_register_req_t *req = arch_get_irn_register_req_out(node, i); + 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 #%d = %s\n", i, reg != NULL ? reg->name : "n/a"); + fprintf(F, "reg #%u = %s\n", o, reg != NULL ? reg->name : "n/a"); } fprintf(F, "flags ="); + arch_irn_flags_t flags = arch_get_irn_flags(node); if (flags == arch_irn_flags_none) { fprintf(F, " none"); } else { @@ -363,5 +306,5 @@ void arch_dump_reqs_and_registers(FILE *F, const ir_node *node) fprintf(F, " not_scheduled"); } } - fprintf(F, " (%d)\n", (int)flags); + fprintf(F, " (0x%x)\n", (unsigned)flags); }