mirror of https://gitee.com/openkylin/qemu.git
sparc64: fix wrpstate and wrtl on delay slot
Use TCG local to work around TCG register flush due to a branch. Thanks to Artyom Tarasenko, Igor Kovalenko and Aurelien Jarno. Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
711c21280b
commit
a2589e5cf2
|
@ -3505,16 +3505,28 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||||
tcg_gen_mov_tl(cpu_tbr, cpu_tmp0);
|
tcg_gen_mov_tl(cpu_tbr, cpu_tmp0);
|
||||||
break;
|
break;
|
||||||
case 6: // pstate
|
case 6: // pstate
|
||||||
save_state(dc, cpu_cond);
|
{
|
||||||
gen_helper_wrpstate(cpu_tmp0);
|
TCGv r_tmp = tcg_temp_local_new();
|
||||||
dc->npc = DYNAMIC_PC;
|
|
||||||
|
tcg_gen_mov_tl(r_tmp, cpu_tmp0);
|
||||||
|
save_state(dc, cpu_cond);
|
||||||
|
gen_helper_wrpstate(r_tmp);
|
||||||
|
tcg_temp_free(r_tmp);
|
||||||
|
dc->npc = DYNAMIC_PC;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 7: // tl
|
case 7: // tl
|
||||||
save_state(dc, cpu_cond);
|
{
|
||||||
tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
|
TCGv r_tmp = tcg_temp_local_new();
|
||||||
tcg_gen_st_i32(cpu_tmp32, cpu_env,
|
|
||||||
offsetof(CPUSPARCState, tl));
|
tcg_gen_mov_tl(r_tmp, cpu_tmp0);
|
||||||
dc->npc = DYNAMIC_PC;
|
save_state(dc, cpu_cond);
|
||||||
|
tcg_gen_trunc_tl_i32(cpu_tmp32, r_tmp);
|
||||||
|
tcg_temp_free(r_tmp);
|
||||||
|
tcg_gen_st_i32(cpu_tmp32, cpu_env,
|
||||||
|
offsetof(CPUSPARCState, tl));
|
||||||
|
dc->npc = DYNAMIC_PC;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 8: // pil
|
case 8: // pil
|
||||||
gen_helper_wrpil(cpu_tmp0);
|
gen_helper_wrpil(cpu_tmp0);
|
||||||
|
|
Loading…
Reference in New Issue