X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_emitter.c;h=528816ed118471072f25724236def71ed6e1c76e;hb=c5e0cbdb8a4a48b8ab3e0a90d258f664301f241f;hp=f6af1ebf2045a8612afa3b9508f4f61c8a9b1c45;hpb=efb9c974f1075ae432f48d4e8bd7683c438efa4b;p=libfirm diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index f6af1ebf2..528816ed1 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -587,7 +587,7 @@ const char *ia32_emit_am(const ir_node *n, ia32_emit_env_t *env) { /* obstack_free with NULL results in an uninitialized obstack */ obstack_init(obst); - p = pointer_size(mode, has_x87_register(n)); + p = pointer_size(mode, has_x87_register(n) || is_ia32_GetST0(n) || is_ia32_SetST0(n)); if (p) obstack_printf(obst, "%s ", p); @@ -951,7 +951,7 @@ static void emit_ia32_xCondJmp(ir_node *irn, ia32_emit_env_t *env) { lc_esnprintf(ia32_get_arg_env(), cmd_buf, SNPRINTF_BUF_LEN, "ucomis%M %s", irn, ia32_emit_binop(irn, env)); lc_esnprintf(ia32_get_arg_env(), cmnt_buf, SNPRINTF_BUF_LEN, "/* %+F */", irn); IA32_DO_EMIT(irn); - finish_CondJmp(F, irn, get_ia32_res_mode(irn)); + finish_CondJmp(F, irn, mode_F); } @@ -1073,13 +1073,11 @@ static void emit_ia32_xCmpCMov(ir_node *irn, ia32_emit_env_t *env) { CMov_emitter(irn, env); } -static void Set_emitter(ir_node *irn, ia32_emit_env_t *env) { +static void Set_emitter(ir_node *irn, ir_mode *mode, ia32_emit_env_t *env) { FILE *F = env->out; const lc_arg_env_t *arg_env = ia32_get_arg_env(); - ir_mode *mode = get_irn_mode(get_irn_n(irn, 0)); int is_unsigned = mode_is_float(mode) || ! mode_is_signed(mode); const char *cmp_suffix = get_cmp_suffix(get_ia32_pncode(irn), is_unsigned); - const char *instr = "xor"; const char *reg8bit; char cmd_buf[SNPRINTF_BUF_LEN]; @@ -1089,16 +1087,11 @@ static void Set_emitter(ir_node *irn, ia32_emit_env_t *env) { out = arch_get_irn_register(env->arch_env, irn); reg8bit = ia32_get_mapped_reg_name(env->isa->regs_8bit, out); - if (env->isa->opt_arch == arch_pentium_4) { - /* P4 prefers sub r, r, others xor r, r */ - instr = "sub"; - } - if (is_ia32_CmpSet(irn)) { lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "cmp %s", ia32_emit_binop(irn, env)); } else if (is_ia32_xCmpSet(irn)) { - lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "ucomis%M %s", get_irn_n(irn, 0), ia32_emit_binop(irn, env)); + lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "ucomis%M %s", get_irn_n(irn, 2), ia32_emit_binop(irn, env)); } else if (is_ia32_PsiCondSet(irn)) { /* omit compare because flags are already set by And/Or */ @@ -1121,15 +1114,15 @@ static void Set_emitter(ir_node *irn, ia32_emit_env_t *env) { } static void emit_ia32_CmpSet(ir_node *irn, ia32_emit_env_t *env) { - Set_emitter(irn, env); + Set_emitter(irn, get_irn_mode(get_irn_n(irn, 2)), env); } static void emit_ia32_PsiCondSet(ir_node *irn, ia32_emit_env_t *env) { - Set_emitter(irn, env); + Set_emitter(irn, get_irn_mode(get_irn_n(irn, 0)), env); } static void emit_ia32_xCmpSet(ir_node *irn, ia32_emit_env_t *env) { - Set_emitter(irn, env); + Set_emitter(irn, get_irn_mode(get_irn_n(irn, 2)), env); } static void emit_ia32_xCmp(ir_node *irn, ia32_emit_env_t *env) {