mirror of https://github.com/proxmox/mirror_qemu
target-xtensa: fix CCOUNT for conditional branches
Taken conditional branches fail to update CCOUNT register because accumulated ccount_delta is reset during translation of non-taken branch. To fix it only update CCOUNT once per conditional branch instruction translation. This fixes guest linux freeze on LTP waitpid06 test. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>master
parent
9d70c4b7b8
commit
d865f30739
|
@ -388,6 +388,7 @@ static bool gen_check_loop_end(DisasContext *dc, int slot)
|
||||||
dc->next_pc == dc->lend) {
|
dc->next_pc == dc->lend) {
|
||||||
int label = gen_new_label();
|
int label = gen_new_label();
|
||||||
|
|
||||||
|
gen_advance_ccount(dc);
|
||||||
tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label);
|
tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label);
|
||||||
tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1);
|
tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1);
|
||||||
gen_jumpi(dc, dc->lbeg, slot);
|
gen_jumpi(dc, dc->lbeg, slot);
|
||||||
|
@ -410,6 +411,7 @@ static void gen_brcond(DisasContext *dc, TCGCond cond,
|
||||||
{
|
{
|
||||||
int label = gen_new_label();
|
int label = gen_new_label();
|
||||||
|
|
||||||
|
gen_advance_ccount(dc);
|
||||||
tcg_gen_brcond_i32(cond, t0, t1, label);
|
tcg_gen_brcond_i32(cond, t0, t1, label);
|
||||||
gen_jumpi_check_loop_end(dc, 0);
|
gen_jumpi_check_loop_end(dc, 0);
|
||||||
gen_set_label(label);
|
gen_set_label(label);
|
||||||
|
|
Loading…
Reference in New Issue