X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_new_nodes.c;h=41bf6f9dbd23d62b07cec6d2df0beb9c9d736cf6;hb=e07b61c6ed5d198a484761f8a40a4f26520d964d;hp=c56207ba1cb6026c1424f2c181d3e69bdb1e9dcb;hpb=feb5634874f1fdc45754eecd035925cdb8bf6dba;p=libfirm diff --git a/ir/be/ia32/ia32_new_nodes.c b/ir/be/ia32/ia32_new_nodes.c index c56207ba1..41bf6f9db 100644 --- a/ir/be/ia32/ia32_new_nodes.c +++ b/ir/be/ia32/ia32_new_nodes.c @@ -107,7 +107,7 @@ 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_different) { + if (reqs[i]->type & arch_register_req_type_must_be_different) { unsigned other = reqs[i]->other_different; int i; @@ -257,17 +257,14 @@ static int ia32_dump_node(ir_node *n, FILE *F, dump_reason_t reason) { /* dump supported am */ fprintf(F, "AM support = "); switch (get_ia32_am_support(n)) { - case ia32_am_None: - fprintf(F, "none"); - break; - case ia32_am_Source: - fprintf(F, "source only (Load)"); - break; + case ia32_am_none: fputs("none\n", F); break; + case ia32_am_unary: fputs("source (unary)\n", F); break; + case ia32_am_binary: fputs("source (binary)\n", F); break; + default: - fprintf(F, "unknown (%d)", get_ia32_am_support(n)); + fprintf(F, "unknown (%d)\n", get_ia32_am_support(n)); break; } - fprintf(F, "\n"); /* dump AM offset */ if(get_ia32_am_offs_int(n) != 0) { @@ -288,26 +285,21 @@ static int ia32_dump_node(ir_node *n, FILE *F, dump_reason_t reason) { if (is_ia32_SwitchJmp(n)) { fprintf(F, "pn_code = %ld\n", get_ia32_condcode(n)); } else if (is_ia32_CMov(n) || is_ia32_Set(n) || is_ia32_Jcc(n)) { + ia32_attr_t *attr = get_ia32_attr(n); long pnc = get_ia32_condcode(n); - fprintf(F, "pn_code = %ld (%s)\n", pnc, get_pnc_string(pnc)); + fprintf(F, "pn_code = 0x%lX (%s)\n", pnc, get_pnc_string(pnc & pn_Cmp_True)); + fprintf(F, "ins_permuted = %u \n", attr->data.ins_permuted); + fprintf(F, "cmp_unsigned = %u \n", attr->data.cmp_unsigned); } else if (is_ia32_CopyB(n) || is_ia32_CopyB_i(n)) { fprintf(F, "size = %u\n", get_ia32_copyb_size(n)); } - /* dump n_res */ fprintf(F, "n_res = %d\n", get_ia32_n_res(n)); - - /* dump use_frame */ fprintf(F, "use_frame = %d\n", is_ia32_use_frame(n)); - - /* commutative */ fprintf(F, "commutative = %d\n", is_ia32_commutative(n)); - - /* need stackent */ fprintf(F, "need stackent = %d\n", is_ia32_need_stackent(n)); - - /* dump latency */ + fprintf(F, "is reload = %d\n", is_ia32_is_reload(n)); fprintf(F, "latency = %d\n", get_ia32_latency(n)); /* dump flags */ @@ -329,6 +321,9 @@ static int ia32_dump_node(ir_node *n, FILE *F, dump_reason_t reason) { if (flags & arch_irn_flags_modify_sp) { fprintf(F, " modify_sp"); } + if (flags & arch_irn_flags_modify_flags) { + fprintf(F, " modify_flags"); + } } fprintf(F, " (%d)\n", flags); @@ -473,15 +468,8 @@ void set_ia32_op_type(ir_node *node, ia32_op_type_t tp) { attr->data.tp = tp; } -/** - * Gets the supported address mode of an ia32 node - */ -ia32_am_type_t get_ia32_am_support(const ir_node *node) { - const ia32_attr_t *attr = get_ia32_attr_const(node); - return attr->data.am_support; -} - -ia32_am_arity_t get_ia32_am_arity(const ir_node *node) { +ia32_am_type_t get_ia32_am_support(const ir_node *node) +{ const ia32_attr_t *attr = get_ia32_attr_const(node); return attr->data.am_arity; } @@ -489,15 +477,10 @@ ia32_am_arity_t get_ia32_am_arity(const ir_node *node) { /** * Sets the supported address mode of an ia32 node */ -void set_ia32_am_support(ir_node *node, ia32_am_type_t am_tp, - ia32_am_arity_t arity) { - ia32_attr_t *attr = get_ia32_attr(node); - attr->data.am_support = am_tp; - attr->data.am_arity = arity; - - assert((am_tp == ia32_am_None && arity == ia32_am_arity_none) || - (am_tp != ia32_am_None && - ((arity == ia32_am_unary) || (arity == ia32_am_binary) || (arity == ia32_am_ternary)))); +void set_ia32_am_support(ir_node *node, ia32_am_type_t arity) +{ + ia32_attr_t *attr = get_ia32_attr(node); + attr->data.am_arity = arity; } /** @@ -573,7 +556,8 @@ int get_ia32_am_scale(const ir_node *node) { * Sets the index register scale for address mode. */ void set_ia32_am_scale(ir_node *node, int scale) { - ia32_attr_t *attr = get_ia32_attr(node); + ia32_attr_t *attr = get_ia32_attr(node); + assert(0 <= scale && scale < 4 && "AM scale out of range"); attr->data.am_scale = scale; } @@ -653,6 +637,36 @@ int is_ia32_need_stackent(const ir_node *node) { return attr->data.need_stackent; } +void set_ia32_is_reload(ir_node *node) { + ia32_attr_t *attr = get_ia32_attr(node); + attr->data.is_reload = 1; +} + +int is_ia32_is_reload(const ir_node *node) { + const ia32_attr_t *attr = get_ia32_attr_const(node); + return attr->data.is_reload; +} + +void set_ia32_is_spill(ir_node *node) { + ia32_attr_t *attr = get_ia32_attr(node); + attr->data.is_spill = 1; +} + +int is_ia32_is_spill(const ir_node *node) { + const ia32_attr_t *attr = get_ia32_attr_const(node); + return attr->data.is_spill; +} + +void set_ia32_is_remat(ir_node *node) { + ia32_attr_t *attr = get_ia32_attr(node); + attr->data.is_remat = 1; +} + +int is_ia32_is_remat(const ir_node *node) { + const ia32_attr_t *attr = get_ia32_attr_const(node); + return attr->data.is_remat; +} + /** * Gets the mode of the stored/loaded value (only set for Store/Load) */ @@ -864,7 +878,7 @@ const be_execution_unit_t ***get_ia32_exec_units(const ir_node *node) { */ unsigned get_ia32_exc_label(const ir_node *node) { const ia32_attr_t *attr = get_ia32_attr_const(node); - return attr->data.except_label; + return attr->data.has_except_label; } /** @@ -872,7 +886,27 @@ unsigned get_ia32_exc_label(const ir_node *node) { */ void set_ia32_exc_label(ir_node *node, unsigned flag) { ia32_attr_t *attr = get_ia32_attr(node); - attr->data.except_label = flag; + attr->data.has_except_label = flag; +} + +/** + * Return the exception label id. + */ +ir_label_t get_ia32_exc_label_id(const ir_node *node) { + const ia32_attr_t *attr = get_ia32_attr_const(node); + + assert(attr->data.has_except_label); + return attr->exc_label; +} + +/** + * Assign the exception label id. + */ +void set_ia32_exc_label_id(ir_node *node, ir_label_t id) { + ia32_attr_t *attr = get_ia32_attr(node); + + assert(attr->data.has_except_label); + attr->exc_label = id; } #ifndef NDEBUG @@ -1130,7 +1164,7 @@ int ia32_compare_attr(const ia32_attr_t *a, const ia32_attr_t *b) { if (a->data.tp != b->data.tp) return 1; - if (a->data.except_label != b->data.except_label) + if (a->data.has_except_label != b->data.has_except_label) return 1; if (a->data.ins_permuted != b->data.ins_permuted @@ -1208,6 +1242,15 @@ int ia32_compare_asm_attr(ir_node *a, ir_node *b) return 0; } +/** + * Hash function for Immediates + */ +static unsigned ia32_hash_Immediate(const ir_node *irn) { + const ia32_immediate_attr_t *a = get_ia32_immediate_attr_const(irn); + + return HASH_PTR(a->symconst) + (a->sc_sign << 16) + a->offset; +} + /** Compare node attributes for Immediates. */ static int ia32_compare_immediate_attr(ir_node *a, ir_node *b)