On 10/29/2013 12:04 PM, Sebastian Macke wrote:
{
int lab = gen_new_label();
- dc->btaken = tcg_temp_local_new();
- tcg_gen_movi_tl(jmp_pc, dc->pc+8);
- tcg_gen_movi_tl(dc->btaken, 0);
+ tcg_gen_movi_tl(jmp_pc, 0);
tcg_gen_brcondi_i32(op0 == 0x03 ? TCG_COND_NE : TCG_COND_EQ,
cpu_srf, 0, lab);
- tcg_gen_movi_tl(dc->btaken, 1);
tcg_gen_movi_tl(jmp_pc, tmp_pc);
gen_set_label(lab);
You can now use movcond here:
tcg_gen_movi_i32(jmp_pc, tmp_pc);
tcg_gen_movcond_i32(jmp_pc, cpu_srf, zero, jmp_pc, zero,
op0 == 0x03 ? TCG_COND_NE : TCG_COND_EQ);
Although I'd wonder about just using setcond instead, since I think
the value stored in jmp_pc here is also stored in dc->j_target, leading
to the right behaviour...
case JUMP_BRANCH:
{
int l1 = gen_new_label();
- tcg_gen_brcondi_tl(TCG_COND_NE, dc->btaken, 0, l1);
+ tcg_gen_brcondi_tl(TCG_COND_NE, jmp_pc, 0, l1);
gen_goto_tb(dc, 1, dc->pc);
gen_set_label(l1);
- tcg_temp_free(dc->btaken);
gen_goto_tb(dc, 0, dc->j_target);
break;
... here.
+ case JUMP_BRANCH_DELAYED:
+ {
+ int l1 = gen_new_label();
+ tcg_gen_brcondi_tl(TCG_COND_NE, jmp_pc, 0, l1);
+ gen_goto_tb(dc, 1, dc->pc);
+ gen_set_label(l1);
+ tcg_gen_mov_tl(cpu_pc, jmp_pc);
+ tcg_gen_exit_tb(0);
+ break;
...
+
+ dc->delayed_branch = !!(dc->tb_flags & D_FLAG);
+ if ((dc->delayed_branch) && (dc->tb_flags&B_FLAG)) {
+ dc->j_state = JUMP_BRANCH_DELAYED;
+ }
+
And thus I can't see how these additions are actually useful?
If I've missed something, and the last hunk needs to be retained,
then please fix the coding style:
if (dc->delayed_branch && (dc->tb_flags & B_FLAG)) {