From: Christian Würdig Date: Tue, 4 Jul 2006 15:02:55 +0000 (+0000) Subject: fixed Set emitter: clear target after compare X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=941554fd1e55e62c8bf1878b04843fd51d993467;hp=5c02509261ced7fdd2406700c5953d2db14691f5;p=libfirm fixed Set emitter: clear target after compare --- diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index bdf474fcd..cafb24f83 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -641,9 +641,8 @@ const char *ia32_emit_am(const ir_node *n, ia32_emit_env_t *env) { if (had_output) obstack_printf(obst, "] "); - size = obstack_object_size(obst); - s = obstack_finish(obst); - s[size - 1] = '\0'; + obstack_1grow(obst, '\0'); + s = obstack_finish(obst); return s; } @@ -1091,17 +1090,6 @@ static void Set_emitter(ir_node *irn, ia32_emit_env_t *env) { instr = "sub"; } - /* in case of a PsiCondSet use mov because it doesn't affect the eflags */ - if (is_ia32_PsiCondSet(irn)) { - snprintf(cmd_buf, SNPRINTF_BUF_LEN, "mov %%%s, 0", arch_register_get_name(out)); - } - else { - snprintf(cmd_buf, SNPRINTF_BUF_LEN, "%s %%%s, %%%s", instr, arch_register_get_name(out), arch_register_get_name(out)); - } - - snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* clear target as set modifies only lower 8 bit */"); - IA32_DO_EMIT(irn); - if (is_ia32_CmpSet(irn)) { lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "cmp %s", ia32_emit_binop(irn, env)); } @@ -1118,6 +1106,11 @@ static void Set_emitter(ir_node *irn, ia32_emit_env_t *env) { snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* calculate Psi condition */" ); IA32_DO_EMIT(irn); + /* use mov to clear target because it doesn't affect the eflags */ + snprintf(cmd_buf, SNPRINTF_BUF_LEN, "mov %%%s, 0", arch_register_get_name(out)); + snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* clear target as set modifies only lower 8 bit */"); + IA32_DO_EMIT(irn); + snprintf(cmd_buf, SNPRINTF_BUF_LEN, "set%s %%%s", cmp_suffix, reg8bit); snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* set 1 iff true, 0 otherweise */" ); IA32_DO_EMIT(irn);