target-sh4: simplify comparisons after a 'and' op

When a TCG variable is anded with a value and the compared with the same
value, we can simply invert the comparison and compare it with 0. The
generated code is smaller.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Aurelien Jarno 2011-01-14 20:39:18 +01:00
parent 4f6493ff8a
commit 6f396c8f38

View File

@ -332,7 +332,7 @@ static inline void gen_branch_slot(uint32_t delayed_pc, int t)
tcg_gen_movi_i32(cpu_delayed_pc, delayed_pc); tcg_gen_movi_i32(cpu_delayed_pc, delayed_pc);
sr = tcg_temp_new(); sr = tcg_temp_new();
tcg_gen_andi_i32(sr, cpu_sr, SR_T); tcg_gen_andi_i32(sr, cpu_sr, SR_T);
tcg_gen_brcondi_i32(TCG_COND_NE, sr, t ? SR_T : 0, label); tcg_gen_brcondi_i32(t ? TCG_COND_EQ:TCG_COND_NE, sr, 0, label);
tcg_gen_ori_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE); tcg_gen_ori_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE);
gen_set_label(label); gen_set_label(label);
} }
@ -347,7 +347,7 @@ static void gen_conditional_jump(DisasContext * ctx,
l1 = gen_new_label(); l1 = gen_new_label();
sr = tcg_temp_new(); sr = tcg_temp_new();
tcg_gen_andi_i32(sr, cpu_sr, SR_T); tcg_gen_andi_i32(sr, cpu_sr, SR_T);
tcg_gen_brcondi_i32(TCG_COND_EQ, sr, SR_T, l1); tcg_gen_brcondi_i32(TCG_COND_NE, sr, 0, l1);
gen_goto_tb(ctx, 0, ifnott); gen_goto_tb(ctx, 0, ifnott);
gen_set_label(l1); gen_set_label(l1);
gen_goto_tb(ctx, 1, ift); gen_goto_tb(ctx, 1, ift);
@ -362,7 +362,7 @@ static void gen_delayed_conditional_jump(DisasContext * ctx)
l1 = gen_new_label(); l1 = gen_new_label();
ds = tcg_temp_new(); ds = tcg_temp_new();
tcg_gen_andi_i32(ds, cpu_flags, DELAY_SLOT_TRUE); tcg_gen_andi_i32(ds, cpu_flags, DELAY_SLOT_TRUE);
tcg_gen_brcondi_i32(TCG_COND_EQ, ds, DELAY_SLOT_TRUE, l1); tcg_gen_brcondi_i32(TCG_COND_NE, ds, 0, l1);
gen_goto_tb(ctx, 1, ctx->pc + 2); gen_goto_tb(ctx, 1, ctx->pc + 2);
gen_set_label(l1); gen_set_label(l1);
tcg_gen_andi_i32(cpu_flags, cpu_flags, ~DELAY_SLOT_TRUE); tcg_gen_andi_i32(cpu_flags, cpu_flags, ~DELAY_SLOT_TRUE);