Re: [Qemu-devel] [PATCH] target/ppc: Use tcg_gen_lookup_and_goto_ptr

2017-09-22 Thread Thomas Huth
On 30.06.2017 20:37, Richard Henderson wrote:
> Cc: qemu-...@nongnu.org
> Signed-off-by: Richard Henderson 
> ---
>  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 c0cd64d..9aa66f5 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(cpu_nip);
>  }
>  }
>  
> @@ -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(cpu_nip);
>  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)
> 

Using this patch increases the speed of the SLOF firmware boot quite a
bit! The following simple test finishes at least 4 seconds faster when
I've got this patch applied:

time ppc64-softmmu/qemu-system-ppc64 -nographic -vga none \
 -prom-env 'boot-command=power-off'

I also can still run my big endian and my little endian pseries guest
images successfully, so feel free to add my:

Tested-by: Thomas Huth 



Re: [Qemu-devel] [PATCH] target/ppc: Use tcg_gen_lookup_and_goto_ptr

2017-06-30 Thread Emilio G. Cota
On Fri, Jun 30, 2017 at 11:37:36 -0700, Richard Henderson wrote:
> Cc: qemu-...@nongnu.org
> Signed-off-by: Richard Henderson 
> ---
>  target/ppc/translate.c | 23 ---
>  1 file changed, 8 insertions(+), 15 deletions(-)

Tested-by: Emilio G. Cota 

Just measured the speedup for linux-user:

 SPECint06 (test set), ppc64le-linux-user. 
Host: IBM POWER8 @ 3.42 GHz  


  1.6 
+-+--+-++++-+++-++++-+--+-+
   
  | 
  | |   
  | 
  |   after |   
  1.5 
+-+.|...+-+
   
  | 
  | |   
  | 
   **   |   
  1.4 
+-+.+++.+++..*..|.*.+++.+-+
   
  ||   +++ |
   *  | *  ||   
  |||  |
   *  | **  |   
  1.3 
+-+..||..|...*..|.**.|.*+-+
   
  || +++  ** *  
   * +++** | * **   |   
  |  **   |   * |  * * | *  
   ***+++* *+++ *   |   
  1.2 
+-+*.|..*...|...*.|..*.+++.*.|.*.***...*.**.+-+
   
  |  * |  *   |   * |  *  |  *+++*  
   ***   * **   **  |   
  |  * |  * * *+++ *   ***   *  
   ***   * **   * +++*  |   
  1.1 
+-+*+++.*.*.|.*.**...*.+++**...*.***...*.+++.**...**+-+
   
  |  ** * | * **   ***   *  
   ***   *  |  **   **  |   
  |  ** * | * **   ***   *
**   ***   *  |  **   **  |   
1 
+-+**.+++.*+++*.+++.**...***...***...***...****...**+-+
   
  |  **  |  *   *  |  **   ***   ** 
   *   ***   ** | ***   **  |   
  |  **  |  *   ****   ***   ** 
   *   ***   ** | ***   **  |   
  0.9 
+-+**...***...**.|.***...***...***...***...**.|.***...**+-+
   
  |  **   *  | **   ** | ***   ***   ** 
   *   ***   **+++***   **  |   
  |  **   * +++**   **+++***   ***   ** 
   *   ***   **   ***   **  |   
  0.8 
+-+**---******---*****---******---**+-+
   
  400.perlbench 401.bzip2  403.gcc  429.mcf445.gobmk 
456.hmmer458.462.libquantu464.h264r471.omnetpp473.a483.xalancbmk gmean  
   
png: http://imgur.com/a/twj6V

Thanks,

Emilio

PS. If you have spec06, you can very easily generate these plots. See
  https://github.com/cota/runspec-simple/commit/14211b927



[Qemu-devel] [PATCH] target/ppc: Use tcg_gen_lookup_and_goto_ptr

2017-06-30 Thread Richard Henderson
Cc: qemu-...@nongnu.org
Signed-off-by: Richard Henderson 
---
 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 c0cd64d..9aa66f5 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(cpu_nip);
 }
 }
 
@@ -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(cpu_nip);
 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)
-- 
2.9.4