diff mbox series

[v2] target/ppc: Use tcg_gen_lookup_and_goto_ptr

Message ID 20171027165814.29122-1-richard.henderson@linaro.org
State New
Headers show
Series [v2] target/ppc: Use tcg_gen_lookup_and_goto_ptr | expand

Commit Message

Richard Henderson Oct. 27, 2017, 4:58 p.m. UTC
From: Richard Henderson <rth@twiddle.net>

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
Rebased and updated for changes to tcg_gen_lookup_and_goto_ptr.

---
 target/ppc/translate.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

Comments

David Gibson Oct. 27, 2017, 9:45 p.m. UTC | #1
On Fri, Oct 27, 2017 at 06:58:14PM +0200, Richard Henderson wrote:
> From: Richard Henderson <rth@twiddle.net>
> 
> Signed-off-by: Richard Henderson <rth@twiddle.net>

Applied,thanks.

> ---
> Rebased and updated for changes to tcg_gen_lookup_and_goto_ptr.
> 
> ---
>  target/ppc/translate.c | 23 ++++++++---------------
>  1 file changed, 8 insertions(+), 15 deletions(-)
> 
> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> index 998fbed848..4075fc8589 100644
> --- a/target/ppc/translate.c
> +++ b/target/ppc/translate.c
> @@ -3419,7 +3419,7 @@ static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
>  }
>  
>  /***                                Branch                                 ***/
> -static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
> +static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
>  {
>      if (NARROW_MODE(ctx)) {
>          dest = (uint32_t) dest;
> @@ -3441,7 +3441,7 @@ static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
>                  gen_debug_exception(ctx);
>              }
>          }
> -        tcg_gen_exit_tb(0);
> +        tcg_gen_lookup_and_goto_ptr();
>      }
>  }
>  
> @@ -3479,7 +3479,7 @@ static void gen_b(DisasContext *ctx)
>  #define BCOND_CTR 2
>  #define BCOND_TAR 3
>  
> -static inline void gen_bcond(DisasContext *ctx, int type)
> +static void gen_bcond(DisasContext *ctx, int type)
>  {
>      uint32_t bo = BO(ctx->opcode);
>      TCGLabel *l1;
> @@ -3543,26 +3543,19 @@ static inline void gen_bcond(DisasContext *ctx, int type)
>          } else {
>              gen_goto_tb(ctx, 0, li);
>          }
> -        if ((bo & 0x14) != 0x14) {
> -            gen_set_label(l1);
> -            gen_goto_tb(ctx, 1, ctx->nip);
> -        }
>      } else {
>          if (NARROW_MODE(ctx)) {
>              tcg_gen_andi_tl(cpu_nip, target, (uint32_t)~3);
>          } else {
>              tcg_gen_andi_tl(cpu_nip, target, ~3);
>          }
> -        tcg_gen_exit_tb(0);
> -        if ((bo & 0x14) != 0x14) {
> -            gen_set_label(l1);
> -            gen_update_nip(ctx, ctx->nip);
> -            tcg_gen_exit_tb(0);
> -        }
> -    }
> -    if (type == BCOND_LR || type == BCOND_CTR || type == BCOND_TAR) {
> +        tcg_gen_lookup_and_goto_ptr();
>          tcg_temp_free(target);
>      }
> +    if ((bo & 0x14) != 0x14) {
> +        gen_set_label(l1);
> +        gen_goto_tb(ctx, 1, ctx->nip);
> +    }
>  }
>  
>  static void gen_bc(DisasContext *ctx)
Daniel Henrique Barboza Nov. 14, 2017, 4:05 p.m. UTC | #2
On 10/27/2017 02:58 PM, Richard Henderson wrote:
> From: Richard Henderson <rth@twiddle.net>
>
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
> Rebased and updated for changes to tcg_gen_lookup_and_goto_ptr.
>
> ---

I am experiencing a remarkable performance boost running a simple scenario
up to SLOF prompt with this patch. It takes 50 seconds on average to get 
to SLOF
prompt as is now on my Lenovo laptop, upstream qemu and default pseries
machine. With this patch it takes 21 seconds average.


Reviewed-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>

>   target/ppc/translate.c | 23 ++++++++---------------
>   1 file changed, 8 insertions(+), 15 deletions(-)
>
> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> index 998fbed848..4075fc8589 100644
> --- a/target/ppc/translate.c
> +++ b/target/ppc/translate.c
> @@ -3419,7 +3419,7 @@ static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
>   }
>
>   /***                                Branch                                 ***/
> -static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
> +static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
>   {
>       if (NARROW_MODE(ctx)) {
>           dest = (uint32_t) dest;
> @@ -3441,7 +3441,7 @@ static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
>                   gen_debug_exception(ctx);
>               }
>           }
> -        tcg_gen_exit_tb(0);
> +        tcg_gen_lookup_and_goto_ptr();
>       }
>   }
>
> @@ -3479,7 +3479,7 @@ static void gen_b(DisasContext *ctx)
>   #define BCOND_CTR 2
>   #define BCOND_TAR 3
>
> -static inline void gen_bcond(DisasContext *ctx, int type)
> +static void gen_bcond(DisasContext *ctx, int type)
>   {
>       uint32_t bo = BO(ctx->opcode);
>       TCGLabel *l1;
> @@ -3543,26 +3543,19 @@ static inline void gen_bcond(DisasContext *ctx, int type)
>           } else {
>               gen_goto_tb(ctx, 0, li);
>           }
> -        if ((bo & 0x14) != 0x14) {
> -            gen_set_label(l1);
> -            gen_goto_tb(ctx, 1, ctx->nip);
> -        }
>       } else {
>           if (NARROW_MODE(ctx)) {
>               tcg_gen_andi_tl(cpu_nip, target, (uint32_t)~3);
>           } else {
>               tcg_gen_andi_tl(cpu_nip, target, ~3);
>           }
> -        tcg_gen_exit_tb(0);
> -        if ((bo & 0x14) != 0x14) {
> -            gen_set_label(l1);
> -            gen_update_nip(ctx, ctx->nip);
> -            tcg_gen_exit_tb(0);
> -        }
> -    }
> -    if (type == BCOND_LR || type == BCOND_CTR || type == BCOND_TAR) {
> +        tcg_gen_lookup_and_goto_ptr();
>           tcg_temp_free(target);
>       }
> +    if ((bo & 0x14) != 0x14) {
> +        gen_set_label(l1);
> +        gen_goto_tb(ctx, 1, ctx->nip);
> +    }
>   }
>
>   static void gen_bc(DisasContext *ctx)
diff mbox series

Patch

diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index 998fbed848..4075fc8589 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -3419,7 +3419,7 @@  static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
 }
 
 /***                                Branch                                 ***/
-static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
+static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
 {
     if (NARROW_MODE(ctx)) {
         dest = (uint32_t) dest;
@@ -3441,7 +3441,7 @@  static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
                 gen_debug_exception(ctx);
             }
         }
-        tcg_gen_exit_tb(0);
+        tcg_gen_lookup_and_goto_ptr();
     }
 }
 
@@ -3479,7 +3479,7 @@  static void gen_b(DisasContext *ctx)
 #define BCOND_CTR 2
 #define BCOND_TAR 3
 
-static inline void gen_bcond(DisasContext *ctx, int type)
+static void gen_bcond(DisasContext *ctx, int type)
 {
     uint32_t bo = BO(ctx->opcode);
     TCGLabel *l1;
@@ -3543,26 +3543,19 @@  static inline void gen_bcond(DisasContext *ctx, int type)
         } else {
             gen_goto_tb(ctx, 0, li);
         }
-        if ((bo & 0x14) != 0x14) {
-            gen_set_label(l1);
-            gen_goto_tb(ctx, 1, ctx->nip);
-        }
     } else {
         if (NARROW_MODE(ctx)) {
             tcg_gen_andi_tl(cpu_nip, target, (uint32_t)~3);
         } else {
             tcg_gen_andi_tl(cpu_nip, target, ~3);
         }
-        tcg_gen_exit_tb(0);
-        if ((bo & 0x14) != 0x14) {
-            gen_set_label(l1);
-            gen_update_nip(ctx, ctx->nip);
-            tcg_gen_exit_tb(0);
-        }
-    }
-    if (type == BCOND_LR || type == BCOND_CTR || type == BCOND_TAR) {
+        tcg_gen_lookup_and_goto_ptr();
         tcg_temp_free(target);
     }
+    if ((bo & 0x14) != 0x14) {
+        gen_set_label(l1);
+        gen_goto_tb(ctx, 1, ctx->nip);
+    }
 }
 
 static void gen_bc(DisasContext *ctx)