From 941554fd1e55e62c8bf1878b04843fd51d993467 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Tue, 4 Jul 2006 15:02:55 +0000 Subject: [PATCH 1/1] fixed Set emitter: clear target after compare --- ir/be/ia32/ia32_emitter.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) 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); -- 2.20.1