From: Christian Würdig Date: Fri, 24 Feb 2006 10:22:06 +0000 (+0000) Subject: added attribute for load/store X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=23391cf902a336a9973cb6e017865267d26c6a02;p=libfirm added attribute for load/store extended dumper --- diff --git a/ir/be/ia32/ia32_new_nodes.c b/ir/be/ia32/ia32_new_nodes.c index 2f5fd7862..a498094af 100644 --- a/ir/be/ia32/ia32_new_nodes.c +++ b/ir/be/ia32/ia32_new_nodes.c @@ -190,16 +190,16 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) { case dump_node_mode_txt: mode = get_irn_mode(n); - if (is_ia32_Load(n)) { - mode = get_irn_mode(get_irn_n(n, 0)); - } - else if (is_ia32_Store(n)) { - mode = get_irn_mode(get_irn_n(n, 2)); + if (is_ia32_Load(n) || is_ia32_Store(n)) { + mode = get_ia32_ls_mode(n); } if (mode) { fprintf(F, "[%s]", get_mode_name(mode)); } + else { + fprintf(F, "[?NOMODE?]"); + } break; case dump_node_nodeattr_txt: @@ -216,11 +216,13 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) { fprintf(F, "[%s%s]", pref, get_ia32_cnst(n)); } - if (is_ia32_AddrModeS(n)) { - fprintf(F, "[AM S] "); - } - else if (is_ia32_AddrModeD(n)) { - fprintf(F, "[AM D] "); + if (! is_ia32_Lea(n)) { + if (is_ia32_AddrModeS(n)) { + fprintf(F, "[AM S] "); + } + else if (is_ia32_AddrModeD(n)) { + fprintf(F, "[AM D] "); + } } break; @@ -571,6 +573,22 @@ char *get_ia32_cnst(ir_node *node) { return attr->cnst; } +/** + * Gets the mode of the stored/loaded value (only set for Store/Load) + */ +ir_mode *get_ia32_ls_mode(const ir_node *node) { + ia32_attr_t *attr = get_ia32_attr(node); + return attr->ls_mode; +} + +/** + * Sets the mode of the stored/loaded value (only set for Store/Load) + */ +void set_ia32_ls_mode(ir_node *node, ir_mode *mode) { + ia32_attr_t *attr = get_ia32_attr(node); + attr->ls_mode = mode; +} + /** * Returns the argument register requirements of an ia32 node. */ diff --git a/ir/be/ia32/ia32_new_nodes.h b/ir/be/ia32/ia32_new_nodes.h index 00f2fd9ad..794815401 100644 --- a/ir/be/ia32/ia32_new_nodes.h +++ b/ir/be/ia32/ia32_new_nodes.h @@ -112,6 +112,16 @@ void set_ia32_sc(ir_node *node, char *sc); */ char *get_ia32_cnst(ir_node *node); +/** + * Gets the mode of the stored/loaded value (only set for Store/Load) + */ +ir_mode *get_ia32_ls_mode(const ir_node *node); + +/** + * Sets the mode of the stored/loaded value (only set for Store/Load) + */ +void set_ia32_ls_mode(ir_node *node, ir_mode *mode); + /** * Returns the argument register requirements of an ia32 node. */ diff --git a/ir/be/ia32/ia32_nodes_attr.h b/ir/be/ia32/ia32_nodes_attr.h index 0eac7eedd..1555c8f41 100644 --- a/ir/be/ia32/ia32_nodes_attr.h +++ b/ir/be/ia32/ia32_nodes_attr.h @@ -61,6 +61,8 @@ typedef struct _ia32_attr_t { char *sc; /**<< symconst name */ char *cnst; /**<< points to the string representation of the constant value (either tv or sc) */ + ir_mode *ls_mode; /**<< the mode of the stored/loaded value */ + ia32_op_flavour_t op_flav; /**<< flavour of an op (flavour_Div/Mod/DivMod/Mul/Mulh) */ long pn_code; /**<< projnum "types" (e.g. indicate compare operators and argument numbers) */ long n_res; /**<< number of results */ diff --git a/ir/be/ia32/ia32_optimize.c b/ir/be/ia32/ia32_optimize.c index bf14c2f87..cf40e88aa 100644 --- a/ir/be/ia32/ia32_optimize.c +++ b/ir/be/ia32/ia32_optimize.c @@ -387,6 +387,7 @@ static ir_node *fold_addr(ir_node *irn, firm_dbg_module_t *mod, ir_node *noreg) scale = get_tarval_long(get_ia32_Immop_tarval(temp)); if (scale <= 3) { + scale = 1 << scale; index = get_irn_n(temp, 2); DBG((mod, LEVEL_1, "\tgot scaled index %+F\n", index)); diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index 517d12d9e..569b6de6d 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -1107,6 +1107,8 @@ static ir_node *gen_Load(ia32_transform_env_t *env) { } set_ia32_am_support(new_op, ia32_am_Source); + set_ia32_ls_mode(new_op, get_Load_mode(node)); + return new_op; } @@ -1134,6 +1136,7 @@ ir_node *gen_Store(ia32_transform_env_t *env) { } set_ia32_am_support(new_op, ia32_am_Dest); + set_ia32_ls_mode(new_op, get_irn_mode(get_Store_value(node))); return new_op; }