diff mbox

[24/77] ppc: Move exception generation code out of line

Message ID 1447201710-10229-25-git-send-email-benh@kernel.crashing.org
State New
Headers show

Commit Message

Benjamin Herrenschmidt Nov. 11, 2015, 12:27 a.m. UTC
There's no point inlining this, if you hit the exception case you exit
anyway, and not inlining saves about 100K of code size (and cache
footprint).

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 target-ppc/translate.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

Comments

David Gibson Nov. 20, 2015, 7:53 a.m. UTC | #1
On Wed, Nov 11, 2015 at 11:27:37AM +1100, Benjamin Herrenschmidt wrote:
> There's no point inlining this, if you hit the exception case you exit
> anyway,

That doesn't quite seem relevant - IIUC this is affecting inlining in
the code generation path, rather than the code execution path.

> and not inlining saves about 100K of code size (and cache
> footprint).

That sounds like a win, though.

> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
>  target-ppc/translate.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index a5ab2eb..ac62942 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -279,7 +279,8 @@ void gen_update_current_nip(void *opaque)
>      tcg_gen_movi_tl(cpu_nip, ctx->nip);
>  }
>  
> -static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error)
> +static void __attribute__((noinline))
> +gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error)

I thought we generally avoided bare gcc attributes in qemu, but I
don't see a helper macro for it and I do see it used in a few other
places, so I guess its ok.

>  {
>      TCGv_i32 t0, t1;
>      if (ctx->exception == POWERPC_EXCP_NONE) {
> @@ -293,7 +294,8 @@ static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t
>      ctx->exception = (excp);
>  }
>  
> -static inline void gen_exception(DisasContext *ctx, uint32_t excp)
> +static void __attribute__((noinline))
> +gen_exception(DisasContext *ctx, uint32_t excp)
>  {
>      TCGv_i32 t0;
>      if (ctx->exception == POWERPC_EXCP_NONE) {
> @@ -305,7 +307,8 @@ static inline void gen_exception(DisasContext *ctx, uint32_t excp)
>      ctx->exception = (excp);
>  }
>  
> -static inline void gen_debug_exception(DisasContext *ctx)
> +static void __attribute__((noinline))
> +gen_debug_exception(DisasContext *ctx)
>  {
>      TCGv_i32 t0;
>
Benjamin Herrenschmidt Nov. 24, 2015, 12:59 a.m. UTC | #2
On Fri, 2015-11-20 at 18:53 +1100, David Gibson wrote:
> On Wed, Nov 11, 2015 at 11:27:37AM +1100, Benjamin Herrenschmidt
> wrote:
> > There's no point inlining this, if you hit the exception case you
> > exit anyway,
> 
> That doesn't quite seem relevant - IIUC this is affecting inlining in
> the code generation path, rather than the code execution path.

Well, the generation path is also slightly performance sensitive. My
point was making the error path inline wasn't buying us anything.

> > and not inlining saves about 100K of code size (and cache
> > footprint).
> 
> That sounds like a win, though.

Yup.

  .../...

> > -static inline void gen_exception_err(DisasContext *ctx, uint32_t
> > excp, uint32_t error)
> > +static void __attribute__((noinline))
> > +gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t
> > error)
> 
> I thought we generally avoided bare gcc attributes in qemu, but I
> don't see a helper macro for it and I do see it used in a few other
> places, so I guess its ok.

That was my guess too...

> >  {
> >      TCGv_i32 t0, t1;
> >      if (ctx->exception == POWERPC_EXCP_NONE) {
> > @@ -293,7 +294,8 @@ static inline void
> > gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t
> >      ctx->exception = (excp);
> >  }
> >  
> > -static inline void gen_exception(DisasContext *ctx, uint32_t excp)
> > +static void __attribute__((noinline))
> > +gen_exception(DisasContext *ctx, uint32_t excp)
> >  {
> >      TCGv_i32 t0;
> >      if (ctx->exception == POWERPC_EXCP_NONE) {
> > @@ -305,7 +307,8 @@ static inline void gen_exception(DisasContext
> > *ctx, uint32_t excp)
> >      ctx->exception = (excp);
> >  }
> >  
> > -static inline void gen_debug_exception(DisasContext *ctx)
> > +static void __attribute__((noinline))
> > +gen_debug_exception(DisasContext *ctx)
> >  {
> >      TCGv_i32 t0;
> >  
>
diff mbox

Patch

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index a5ab2eb..ac62942 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -279,7 +279,8 @@  void gen_update_current_nip(void *opaque)
     tcg_gen_movi_tl(cpu_nip, ctx->nip);
 }
 
-static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error)
+static void __attribute__((noinline))
+gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error)
 {
     TCGv_i32 t0, t1;
     if (ctx->exception == POWERPC_EXCP_NONE) {
@@ -293,7 +294,8 @@  static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t
     ctx->exception = (excp);
 }
 
-static inline void gen_exception(DisasContext *ctx, uint32_t excp)
+static void __attribute__((noinline))
+gen_exception(DisasContext *ctx, uint32_t excp)
 {
     TCGv_i32 t0;
     if (ctx->exception == POWERPC_EXCP_NONE) {
@@ -305,7 +307,8 @@  static inline void gen_exception(DisasContext *ctx, uint32_t excp)
     ctx->exception = (excp);
 }
 
-static inline void gen_debug_exception(DisasContext *ctx)
+static void __attribute__((noinline))
+gen_debug_exception(DisasContext *ctx)
 {
     TCGv_i32 t0;