[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é ?! -+-