Re: [Qemu-devel] [PATCH] target/ppc: Use tcg_gen_lookup_and_goto_ptr
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
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
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