diff mbox

[1.1] target-xtensa: fix CCOUNT for conditional branches

Message ID 1338160713-22393-1-git-send-email-jcmvbkbc@gmail.com
State New
Headers show

Commit Message

Max Filippov May 27, 2012, 11:18 p.m. UTC
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>
---
 target-xtensa/translate.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

Comments

Blue Swirl June 9, 2012, 11:30 a.m. UTC | #1
Thanks, applied.

On Sun, May 27, 2012 at 11:18 PM, Max Filippov <jcmvbkbc@gmail.com> wrote:
> 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>
> ---
>  target-xtensa/translate.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
> index 521c0e6..a542a31 100644
> --- a/target-xtensa/translate.c
> +++ b/target-xtensa/translate.c
> @@ -388,6 +388,7 @@ static bool gen_check_loop_end(DisasContext *dc, int slot)
>             dc->next_pc == dc->lend) {
>         int label = gen_new_label();
>
> +        gen_advance_ccount(dc);
>         tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label);
>         tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1);
>         gen_jumpi(dc, dc->lbeg, slot);
> @@ -410,6 +411,7 @@ static void gen_brcond(DisasContext *dc, TCGCond cond,
>  {
>     int label = gen_new_label();
>
> +    gen_advance_ccount(dc);
>     tcg_gen_brcond_i32(cond, t0, t1, label);
>     gen_jumpi_check_loop_end(dc, 0);
>     gen_set_label(label);
> --
> 1.7.7.6
>
diff mbox

Patch

diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
index 521c0e6..a542a31 100644
--- a/target-xtensa/translate.c
+++ b/target-xtensa/translate.c
@@ -388,6 +388,7 @@  static bool gen_check_loop_end(DisasContext *dc, int slot)
             dc->next_pc == dc->lend) {
         int label = gen_new_label();
 
+        gen_advance_ccount(dc);
         tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label);
         tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1);
         gen_jumpi(dc, dc->lbeg, slot);
@@ -410,6 +411,7 @@  static void gen_brcond(DisasContext *dc, TCGCond cond,
 {
     int label = gen_new_label();
 
+    gen_advance_ccount(dc);
     tcg_gen_brcond_i32(cond, t0, t1, label);
     gen_jumpi_check_loop_end(dc, 0);
     gen_set_label(label);