From 09386bbf9b717b6669b11390ab2cbb13230a368b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Fri, 24 Feb 2006 09:54:57 +0000 Subject: [PATCH] fixed some bugs --- ir/be/ia32/ia32_new_nodes.c | 62 ++++++++++++++++++++++++++++--------- ir/be/ia32/ia32_optimize.c | 2 +- ir/be/ia32/ia32_transform.c | 9 +++++- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/ir/be/ia32/ia32_new_nodes.c b/ir/be/ia32/ia32_new_nodes.c index 9d836677c..2f5fd7862 100644 --- a/ir/be/ia32/ia32_new_nodes.c +++ b/ir/be/ia32/ia32_new_nodes.c @@ -190,10 +190,7 @@ 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 (mode == mode_BB || mode == mode_ANY || mode == mode_BAD || mode == mode_T) { - mode = NULL; - } - else if (is_ia32_Load(n)) { + if (is_ia32_Load(n)) { mode = get_irn_mode(get_irn_n(n, 0)); } else if (is_ia32_Store(n)) { @@ -219,8 +216,11 @@ 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) || is_ia32_AddrModeD(n)) { - fprintf(F, "[AM] "); + if (is_ia32_AddrModeS(n)) { + fprintf(F, "[AM S] "); + } + else if (is_ia32_AddrModeD(n)) { + fprintf(F, "[AM D] "); } break; @@ -273,6 +273,9 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) { case ia32_AddrModeS: fprintf(F, "AM Source (Load)"); break; + default: + fprintf(F, "unknown (%d)", attr->tp); + break; } fprintf(F, "\n"); @@ -292,9 +295,33 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) { case ia32_am_Full: fprintf(F, "full"); break; + default: + fprintf(F, "unknown (%d)", attr->am_support); + break; } fprintf(F, "\n"); + /* dump am flavour */ + fprintf(F, "AM flavour ="); + if (attr->am_flavour == ia32_am_N) { + fprintf(F, " none"); + } + else { + if (attr->am_flavour & ia32_O) { + fprintf(F, " O"); + } + if (attr->am_flavour & ia32_B) { + fprintf(F, " B"); + } + if (attr->am_flavour & ia32_I) { + fprintf(F, " I"); + } + if (attr->am_flavour & ia32_S) { + fprintf(F, " S"); + } + } + fprintf(F, " (%d)\n", attr->am_flavour); + /* dump AM offset */ fprintf(F, "AM offset = "); if (attr->am_offs) { @@ -316,16 +343,21 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) { /* dump flags */ fprintf(F, "flags ="); - if (attr->flags & arch_irn_flags_dont_spill) { - fprintf(F, " unspillable"); + if (attr->flags == arch_irn_flags_none) { + fprintf(F, " none"); } - if (attr->flags & arch_irn_flags_rematerializable) { - fprintf(F, " remat"); - } - if (attr->flags & arch_irn_flags_ignore) { - fprintf(F, " ignore"); + else { + if (attr->flags & arch_irn_flags_dont_spill) { + fprintf(F, " unspillable"); + } + if (attr->flags & arch_irn_flags_rematerializable) { + fprintf(F, " remat"); + } + if (attr->flags & arch_irn_flags_ignore) { + fprintf(F, " ignore"); + } } - fprintf(F, "\n"); + fprintf(F, " (%d)\n", attr->flags); fprintf(F, "=== IA32 attr end ===\n"); /* end of: case dump_node_info_txt */ @@ -418,7 +450,7 @@ ia32_am_flavour_t get_ia32_am_flavour(const ir_node *node) { */ void set_ia32_am_flavour(ir_node *node, ia32_am_flavour_t am_flavour) { ia32_attr_t *attr = get_ia32_attr(node); - attr->am_support = am_flavour; + attr->am_flavour = am_flavour; } /** diff --git a/ir/be/ia32/ia32_optimize.c b/ir/be/ia32/ia32_optimize.c index 0bbca13b7..bf14c2f87 100644 --- a/ir/be/ia32/ia32_optimize.c +++ b/ir/be/ia32/ia32_optimize.c @@ -397,7 +397,7 @@ static ir_node *fold_addr(ir_node *irn, firm_dbg_module_t *mod, ir_node *noreg) /* ok, we can create a new LEA */ if (dolea) { - res = new_rd_ia32_Lea(dbg, irg, block, base, index, mode); + res = new_rd_ia32_Lea(dbg, irg, block, base, index, mode_Is); /* add the old offset of a previous LEA */ if (offs) { diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index da460e3b2..517d12d9e 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -841,7 +841,14 @@ static ir_node *gen_DivMod(ia32_transform_env_t *env, ir_node *op1, ir_node *op2 * @return The created ia32 fDiv node */ static ir_node *gen_Quot(ia32_transform_env_t *env, ir_node *op1, ir_node *op2) { - return gen_binop(env, op1, op2, new_rd_ia32_fDiv); + ir_node *noreg = ia32_new_NoReg_gp(env->cg); + ir_node *nomem = new_rd_NoMem(env->irg); + ir_node *new_op; + + new_op = new_rd_ia32_fDiv(env->dbg, env->irg, env->block, noreg, noreg, op1, op2, nomem, env->mode); + set_ia32_am_support(new_op, ia32_am_Source); + + return new_op; } -- 2.20.1