target-openrisc: Remove unnecessary code generated by jump instructions
The sr_f variable is only used for the l.bf and l.bnf instructions. For clarity the code is also rewritten using a switch statement instead of if chaining. Signed-off-by: Sebastian Macke <sebastian@macke.de> Reviewed-by: Jia Liu <proljc@gmail.com> Signed-off-by: Jia Liu <proljc@gmail.com>
This commit is contained in:
parent
352367e8bb
commit
da1d77597b
|
@ -209,42 +209,49 @@ static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest)
|
||||||
static void gen_jump(DisasContext *dc, uint32_t imm, uint32_t reg, uint32_t op0)
|
static void gen_jump(DisasContext *dc, uint32_t imm, uint32_t reg, uint32_t op0)
|
||||||
{
|
{
|
||||||
target_ulong tmp_pc;
|
target_ulong tmp_pc;
|
||||||
int lab = gen_new_label();
|
|
||||||
TCGv sr_f = tcg_temp_new();
|
|
||||||
/* N26, 26bits imm */
|
/* N26, 26bits imm */
|
||||||
tmp_pc = sign_extend((imm<<2), 26) + dc->pc;
|
tmp_pc = sign_extend((imm<<2), 26) + dc->pc;
|
||||||
tcg_gen_andi_tl(sr_f, cpu_sr, SR_F);
|
|
||||||
|
|
||||||
if (op0 == 0x00) { /* l.j */
|
switch (op0) {
|
||||||
|
case 0x00: /* l.j */
|
||||||
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
||||||
} else if (op0 == 0x01) { /* l.jal */
|
break;
|
||||||
|
case 0x01: /* l.jal */
|
||||||
tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
|
tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
|
||||||
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
||||||
} else if (op0 == 0x03) { /* l.bnf */
|
break;
|
||||||
|
case 0x03: /* l.bnf */
|
||||||
|
case 0x04: /* l.bf */
|
||||||
|
{
|
||||||
|
int lab = gen_new_label();
|
||||||
|
TCGv sr_f = tcg_temp_new();
|
||||||
tcg_gen_movi_tl(jmp_pc, dc->pc+8);
|
tcg_gen_movi_tl(jmp_pc, dc->pc+8);
|
||||||
tcg_gen_brcondi_i32(TCG_COND_EQ, sr_f, SR_F, lab);
|
tcg_gen_andi_tl(sr_f, cpu_sr, SR_F);
|
||||||
|
tcg_gen_brcondi_i32(op0 == 0x03 ? TCG_COND_EQ : TCG_COND_NE,
|
||||||
|
sr_f, SR_F, lab);
|
||||||
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
||||||
gen_set_label(lab);
|
gen_set_label(lab);
|
||||||
} else if (op0 == 0x04) { /* l.bf */
|
tcg_temp_free(sr_f);
|
||||||
tcg_gen_movi_tl(jmp_pc, dc->pc+8);
|
}
|
||||||
tcg_gen_brcondi_i32(TCG_COND_NE, sr_f, SR_F, lab);
|
break;
|
||||||
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
case 0x11: /* l.jr */
|
||||||
gen_set_label(lab);
|
|
||||||
} else if (op0 == 0x11) { /* l.jr */
|
|
||||||
tcg_gen_mov_tl(jmp_pc, cpu_R[reg]);
|
tcg_gen_mov_tl(jmp_pc, cpu_R[reg]);
|
||||||
} else if (op0 == 0x12) { /* l.jalr */
|
break;
|
||||||
|
case 0x12: /* l.jalr */
|
||||||
tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
|
tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
|
||||||
tcg_gen_mov_tl(jmp_pc, cpu_R[reg]);
|
tcg_gen_mov_tl(jmp_pc, cpu_R[reg]);
|
||||||
} else {
|
break;
|
||||||
|
default:
|
||||||
gen_illegal_exception(dc);
|
gen_illegal_exception(dc);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
tcg_temp_free(sr_f);
|
|
||||||
dc->delayed_branch = 2;
|
dc->delayed_branch = 2;
|
||||||
dc->tb_flags |= D_FLAG;
|
dc->tb_flags |= D_FLAG;
|
||||||
gen_sync_flags(dc);
|
gen_sync_flags(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void dec_calc(DisasContext *dc, uint32_t insn)
|
static void dec_calc(DisasContext *dc, uint32_t insn)
|
||||||
{
|
{
|
||||||
uint32_t op0, op1, op2;
|
uint32_t op0, op1, op2;
|
||||||
|
|
Loading…
Reference in New Issue