X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fia32%2Fia32_new_nodes.c;h=9440be9976449943667faf01c67f6baaff002001;hb=99bb87e21131c71877ef9ddaaa1dd2781fd9417a;hp=e716c5847fabab1017dc550902db7ca88e0a1743;hpb=2d61612857ee98aa3273e239833530c057ecd8d5;p=libfirm diff --git a/ir/be/ia32/ia32_new_nodes.c b/ir/be/ia32/ia32_new_nodes.c index e716c5847..9440be997 100644 --- a/ir/be/ia32/ia32_new_nodes.c +++ b/ir/be/ia32/ia32_new_nodes.c @@ -24,7 +24,7 @@ * @version $Id$ * * This file implements the creation of the achitecture specific firm opcodes - * and the coresponding node constructors for the ia32 assembler irg. + * and the corresponding node constructors for the ia32 assembler irg. */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -96,7 +96,9 @@ static void dump_reg_req(FILE *F, ir_node *n, const arch_register_req_t **reqs, } if (reqs[i]->type & arch_register_req_type_should_be_same) { - ir_fprintf(F, " same as %+F", get_irn_n(n, reqs[i]->other_same)); + ir_fprintf(F, " same as %+F", get_irn_n(n, reqs[i]->other_same[0])); + if (reqs[i]->other_same[1] != -1) + ir_fprintf(F, " or %+F", get_irn_n(n, reqs[i]->other_same[1])); } if (reqs[i]->type & arch_register_req_type_should_be_different) { @@ -276,17 +278,11 @@ static int ia32_dump_node(ir_node *n, FILE *F, dump_reason_t reason) { fprintf(F, "AM scale = %d\n", get_ia32_am_scale(n)); /* dump pn code */ - if(is_ia32_SwitchJmp(n)) { + if(is_ia32_SwitchJmp(n) || is_ia32_CopyB(n) || is_ia32_CopyB_i(n)) { fprintf(F, "pn_code = %ld\n", get_ia32_pncode(n)); } else { - if(get_ia32_pncode(n) & ia32_pn_Cmp_Unsigned) { - long pnc = get_ia32_pncode(n); - fprintf(F, "pn_code = %ld (%s, unsigned)\n", - pnc, get_pnc_string(pnc & ~ia32_pn_Cmp_Unsigned)); - } else { - fprintf(F, "pn_code = %ld (%s)\n", get_ia32_pncode(n), - get_pnc_string(get_ia32_pncode(n))); - } + fprintf(F, "pn_code = %ld (%s)\n", get_ia32_pncode(n), + get_pnc_string(get_ia32_pncode(n))); } /* dump n_res */ @@ -540,6 +536,19 @@ void set_ia32_am_scale(ir_node *node, int scale) { attr->data.am_scale = scale; } +void ia32_copy_am_attrs(ir_node *to, const ir_node *from) +{ + set_ia32_ls_mode(to, get_ia32_ls_mode(from)); + set_ia32_am_scale(to, get_ia32_am_scale(from)); + set_ia32_am_sc(to, get_ia32_am_sc(from)); + if(is_ia32_am_sc_sign(from)) + set_ia32_am_sc_sign(to); + add_ia32_am_offs_int(to, get_ia32_am_offs_int(from)); + set_ia32_frame_ent(to, get_ia32_frame_ent(from)); + if (is_ia32_use_frame(from)) + set_ia32_use_frame(to); +} + /** * Sets the uses_frame flag. */ @@ -782,22 +791,6 @@ int get_ia32_n_res(const ir_node *node) { return ARR_LEN(attr->slots); } -/** - * Returns the flavour of an ia32 node, - */ -ia32_op_flavour_t get_ia32_flavour(const ir_node *node) { - const ia32_attr_t *attr = get_ia32_attr_const(node); - return attr->data.op_flav; -} - -/** - * Sets the flavour of an ia32 node to flavour_Div/Mod/DivMod/Mul/Mulh. - */ -void set_ia32_flavour(ir_node *node, ia32_op_flavour_t op_flav) { - ia32_attr_t *attr = get_ia32_attr(node); - attr->data.op_flav = op_flav; -} - /** * Returns the projnum code. */ @@ -973,12 +966,14 @@ int get_ia32_out_regnr(const ir_node *node, int pos) { void ia32_swap_left_right(ir_node *node) { - ir_node *left = get_irn_n(node, 2); - ir_node *right = get_irn_n(node, 3); + ia32_attr_t *attr = get_ia32_attr(node); + ir_node *left = get_irn_n(node, n_ia32_binary_left); + ir_node *right = get_irn_n(node, n_ia32_binary_right); + assert(is_ia32_commutative(node)); - set_irn_n(node, 2, right); - set_irn_n(node, 3, left); - set_ia32_pncode(node, get_inversed_pnc(get_ia32_pncode(node))); + attr->data.ins_permuted = !attr->data.ins_permuted; + set_irn_n(node, n_ia32_binary_left, right); + set_irn_n(node, n_ia32_binary_right, left); } /** @@ -1002,10 +997,9 @@ void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const be_execution_unit_t ***execution_units, int n_res, unsigned latency) { - ir_graph *irg = get_irn_irg(node); - struct obstack *obst = get_irg_obstack(irg); - ia32_attr_t *attr = get_ia32_attr(node); - arch_register_t**slots; + ir_graph *irg = get_irn_irg(node); + struct obstack *obst = get_irg_obstack(irg); + ia32_attr_t *attr = get_ia32_attr(node); set_ia32_flags(node, flags); set_ia32_in_req_all(node, in_reqs); @@ -1020,8 +1014,9 @@ void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, attr->out_flags = NEW_ARR_D(int, obst, n_res); memset(attr->out_flags, 0, n_res * sizeof(attr->out_flags[0])); - attr->slots = slots = NEW_ARR_D(arch_register_t*, obst, n_res); - memset(slots, 0, n_res * sizeof(slots[0])); + attr->slots = NEW_ARR_D(const arch_register_t*, obst, n_res); + /* void* cast to suppress an incorrect warning on MSVC */ + memset((void*)attr->slots, 0, n_res * sizeof(attr->slots[0])); } void @@ -1106,13 +1101,16 @@ int ia32_compare_attr(const ia32_attr_t *a, const ia32_attr_t *b) { if(a->pn_code != b->pn_code) return 1; - if (a->data.tp != b->data.tp - || a->data.op_flav != b->data.op_flav) + if (a->data.tp != b->data.tp) return 1; if (a->data.except_label != b->data.except_label) return 1; + if (a->data.ins_permuted != b->data.ins_permuted + || a->data.cmp_unsigned != b->data.cmp_unsigned) + return 1; + return 0; }