bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH mig] Add static branch prediction to type checks


From: Samuel Thibault
Subject: Re: [PATCH mig] Add static branch prediction to type checks
Date: Mon, 1 Dec 2014 19:41:12 +0100
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Mon 01 Dec 2014 19:06:10 +0100, a écrit :
> Annotate generated type checks with static branch prediction
> optimizing well-formed messages.

Ack.

> * utils.c (WriteBogusDefines): Define `mig_unlikely' if not defined.
> * server.c: Use `mig_unlikely' in generated type checks.
> * user.c: Likewise.
> ---
>  server.c | 21 ++++++++++++---------
>  user.c   | 27 +++++++++++++++------------
>  utils.c  |  9 +++++++--
>  3 files changed, 34 insertions(+), 23 deletions(-)
> 
> diff --git a/server.c b/server.c
> index bcdeb0b..56ccfc7 100644
> --- a/server.c
> +++ b/server.c
> @@ -402,16 +402,16 @@ WriteCheckHead(FILE *file, const routine_t *rt)
>       fprintf(file, "\tmsgh_simple = !(In0P->Head.msgh_bits & 
> MACH_MSGH_BITS_COMPLEX);\n");
>  
>      if (rt->rtNumRequestVar > 0)
> -     fprintf(file, "\tif ((msgh_size < %d)",
> +     fprintf(file, "\tif (mig_unlikely ((msgh_size < %d)",
>               rt->rtRequestSize);
>      else
> -     fprintf(file, "\tif ((In0P->Head.msgh_size != %d)",
> +     fprintf(file, "\tif (mig_unlikely ((In0P->Head.msgh_size != %d)",
>               rt->rtRequestSize);
>  
>      if (rt->rtSimpleCheckRequest)
>       fprintf(file, " ||\n\t    %s(In0P->Head.msgh_bits & 
> MACH_MSGH_BITS_COMPLEX)",
>               rt->rtSimpleReceiveRequest ? "" : "!");
> -    fprintf(file, ")\n");
> +    fprintf(file, "))\n");
>      WriteMsgError(file, "MIG_BAD_ARGUMENTS");
>      fprintf(file, "#endif\t/* TypeCheck */\n");
>      fprintf(file, "\n");
> @@ -429,7 +429,7 @@ WriteTypeCheck(FILE *file, const argument_t *arg)
>               arg->argRequestPos, arg->argTTName, arg->argVarName);
>      else
>      {
> -     fprintf(file, "\tif (");
> +     fprintf(file, "\tif (mig_unlikely (");
>       if (!it->itIndefinite) {
>           fprintf(file, "(In%dP->%s%s.msgt_inline != %s) ||\n\t    ",
>               arg->argRequestPos, arg->argTTName,
> @@ -457,7 +457,7 @@ WriteTypeCheck(FILE *file, const argument_t *arg)
>                   arg->argRequestPos, arg->argTTName,
>                   arg->argLongForm ? "l" : "",
>                   it->itNumber);
> -     fprintf(file, "\t    (In%dP->%s.msgt%s_size != %d))\n",
> +     fprintf(file, "\t    (In%dP->%s.msgt%s_size != %d)))\n",
>               arg->argRequestPos, arg->argTTName,
>               arg->argLongForm ? "l" : "",
>               it->itSize);
> @@ -515,9 +515,10 @@ WriteCheckMsgSize(FILE *file, const argument_t *arg)
>      if (arg->argRequestPos == rt->rtMaxRequestPos)
>      {
>       fprintf(file, "#if\tTypeCheck\n");
> -     fprintf(file, "\tif (msgh_size != %d + (", rt->rtRequestSize);
> +     fprintf(file, "\tif (mig_unlikely (msgh_size != %d + (",
> +             rt->rtRequestSize);
>       WriteCheckArgSize(file, arg);
> -     fprintf(file, "))\n");
> +     fprintf(file, ")))\n");
>  
>       WriteMsgError(file, "MIG_BAD_ARGUMENTS");
>       fprintf(file, "#endif\t/* TypeCheck */\n");
> @@ -545,10 +546,12 @@ WriteCheckMsgSize(FILE *file, const argument_t *arg)
>          it won't underflow. */
>  
>       if (LastVarArg)
> -         fprintf(file, "\tif (msgh_size != %d + msgh_size_delta)\n",
> +         fprintf(file,
> +                 "\tif (mig_unlikely (msgh_size != %d + msgh_size_delta))\n",
>               rt->rtRequestSize);
>       else
> -         fprintf(file, "\tif (msgh_size < %d + msgh_size_delta)\n",
> +         fprintf(file,
> +                 "\tif (mig_unlikely (msgh_size < %d + msgh_size_delta))\n",
>               rt->rtRequestSize);
>       WriteMsgError(file, "MIG_BAD_ARGUMENTS");
>  
> diff --git a/user.c b/user.c
> index f4a6cd5..5451a03 100644
> --- a/user.c
> +++ b/user.c
> @@ -686,7 +686,7 @@ WriteRequestArgs(FILE *file, const routine_t *rt)
>  static void
>  WriteCheckIdentity(FILE *file, const routine_t *rt)
>  {
> -    fprintf(file, "\tif (OutP->Head.msgh_id != %d) {\n",
> +    fprintf(file, "\tif (mig_unlikely (OutP->Head.msgh_id != %d)) {\n",
>           rt->rtNumber + SubsystemBase + 100);
>      fprintf(file, "\t\tif (OutP->Head.msgh_id == 
> MACH_NOTIFY_SEND_ONCE)\n\t");
>      WriteMsgError(file, rt, "MIG_SERVER_DIED");
> @@ -708,16 +708,17 @@ WriteCheckIdentity(FILE *file, const routine_t *rt)
>           fprintf(file, "\tmsgh_size = OutP->Head.msgh_size;\n\n");
>  
>       fprintf(file,
> -         "\tif ((OutP->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n");
> +         "\tif (mig_unlikely ("
> +         "(OutP->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n");
>       if (rt->rtNoReplyArgs)
> -         fprintf(file, "\t    (OutP->Head.msgh_size != %d))\n",
> +         fprintf(file, "\t    (OutP->Head.msgh_size != %d)))\n",
>                       rt->rtReplySize);
>       else {
>           fprintf(file, "\t    ((msgh_size %s %d) &&\n",
>               (rt->rtNumReplyVar > 0) ? "<" : "!=",
>               rt->rtReplySize);
>           fprintf(file, "\t     ((msgh_size != sizeof(mig_reply_header_t)) 
> ||\n");
> -         fprintf(file, "\t      (OutP->RetCode == KERN_SUCCESS))))\n");
> +         fprintf(file, "\t      (OutP->RetCode == KERN_SUCCESS)))))\n");
>       }
>      }
>      else {
> @@ -727,7 +728,7 @@ WriteCheckIdentity(FILE *file, const routine_t *rt)
>       fprintf(file, "\tmsgh_simple = !(OutP->Head.msgh_bits & 
> MACH_MSGH_BITS_COMPLEX);\n");
>       fprintf(file, "\n");
>  
> -     fprintf(file, "\tif (((msgh_size %s %d)",
> +     fprintf(file, "\tif (mig_unlikely (((msgh_size %s %d)",
>               (rt->rtNumReplyVar > 0) ? "<" : "!=",
>               rt->rtReplySize);
>  
> @@ -740,7 +741,7 @@ WriteCheckIdentity(FILE *file, const routine_t *rt)
>  
>       fprintf(file, "\t    ((msgh_size != sizeof(mig_reply_header_t)) ||\n");
>       fprintf(file, "\t     !msgh_simple ||\n");
> -     fprintf(file, "\t     (OutP->RetCode == KERN_SUCCESS)))\n");
> +     fprintf(file, "\t     (OutP->RetCode == KERN_SUCCESS))))\n");
>      }
>      WriteMsgError(file, rt, "MIG_TYPE_ERROR");
>      fprintf(file, "#endif\t/* TypeCheck */\n");
> @@ -778,7 +779,7 @@ WriteTypeCheck(FILE *file, const argument_t *arg)
>      }
>      else
>      {
> -     fprintf(file, "\tif (");
> +     fprintf(file, "\tif (mig_unlikely (");
>       if (!it->itIndefinite) {
>           fprintf(file, "(OutP->%s%s.msgt_inline != %s) ||\n\t    ",
>               arg->argTTName,
> @@ -806,7 +807,7 @@ WriteTypeCheck(FILE *file, const argument_t *arg)
>                   arg->argTTName,
>                   arg->argLongForm ? "l" : "",
>                   it->itNumber);
> -     fprintf(file, "\t    (OutP->%s.msgt%s_size != %d))\n",
> +     fprintf(file, "\t    (OutP->%s.msgt%s_size != %d)))\n",
>               arg->argTTName,
>               arg->argLongForm ? "l" : "",
>               it->itSize);
> @@ -861,10 +862,10 @@ WriteCheckMsgSize(FILE *file, const argument_t *arg)
>      if (arg->argReplyPos == rt->rtMaxReplyPos)
>      {
>       fprintf(file, "#if\tTypeCheck\n");
> -     fprintf(file, "\tif (msgh_size != %d + (",
> +     fprintf(file, "\tif (mig_unlikely (msgh_size != %d + (",
>               rt->rtReplySize);
>       WriteCheckArgSize(file, arg);
> -     fprintf(file, "))\n");
> +     fprintf(file, ")))\n");
>  
>       WriteMsgError(file, rt, "MIG_TYPE_ERROR");
>       fprintf(file, "#endif\t/* TypeCheck */\n");
> @@ -892,10 +893,12 @@ WriteCheckMsgSize(FILE *file, const argument_t *arg)
>          it won't underflow. */
>  
>       if (LastVarArg)
> -         fprintf(file, "\tif (msgh_size != %d + msgh_size_delta)\n",
> +         fprintf(file,
> +             "\tif (mig_unlikely (msgh_size != %d + msgh_size_delta))\n",
>               rt->rtReplySize);
>       else
> -         fprintf(file, "\tif (msgh_size < %d + msgh_size_delta)\n",
> +         fprintf(file,
> +             "\tif (mig_unlikely (msgh_size < %d + msgh_size_delta))\n",
>               rt->rtReplySize);
>       WriteMsgError(file, rt, "MIG_TYPE_ERROR");
>  
> diff --git a/utils.c b/utils.c
> index 6c42bc3..396e743 100644
> --- a/utils.c
> +++ b/utils.c
> @@ -60,6 +60,11 @@ WriteBogusDefines(FILE *file)
>      fprintf(file, "#endif\n");
>      fprintf(file, "\n");
>  
> +    fprintf(file, "#ifndef\tmig_unlikely\n");
> +    fprintf(file, "#define\tmig_unlikely(X)\t__builtin_expect (!! (X), 
> 0)\n");
> +    fprintf(file, "#endif\n");
> +    fprintf(file, "\n");
> +
>      fprintf(file, "#ifndef\tTypeCheck\n");
>      fprintf(file, "#define\tTypeCheck 1\n");
>      fprintf(file, "#endif\n");
> @@ -70,11 +75,11 @@ WriteBogusDefines(FILE *file)
>      fprintf(file, "#endif\n");
>      fprintf(file, "\n");
>  
> -    fprintf(file, "#define BAD_TYPECHECK(type, check) ({\\\n");
> +    fprintf(file, "#define BAD_TYPECHECK(type, check) mig_unlikely (({\\\n");
>      fprintf(file,
>           "  union { mach_msg_type_t t; unsigned32_t w; } _t, _c;\\\n");
>      fprintf(file,
> -         "  _t.t = *(type); _c.t = *(check); _t.w != _c.w; })\n");
> +         "  _t.t = *(type); _c.t = *(check);_t.w != _c.w; }))\n");
>  }
>  
>  void
> -- 
> 2.1.3
> 

-- 
Samuel
<d> bah à défaut de ligne TGV, ils ont un GR
 -+- #ens-mim - comment ça, paumé ?! -+-



reply via email to

[Prev in Thread] Current Thread [Next in Thread]