From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vk1-xa32.google.com (mail-vk1-xa32.google.com [IPv6:2607:f8b0:4864:20::a32]) by sourceware.org (Postfix) with ESMTPS id 817DE394B013; Thu, 12 May 2022 20:04:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 817DE394B013 Received: by mail-vk1-xa32.google.com with SMTP id j14so3214964vkp.4; Thu, 12 May 2022 13:04:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=M8dLEt/sKUqM9j90m+dIdRtSKmZBmV5BqRROUnxyy3A=; b=t99e4ULkS+LuAkilLCQOqelUe8AfAgEe/qhmqvKLWbEXebzcW4RAuhezyeiJktl+z2 FeU/sBfTPXrQ59GgirwG/DhMPpisdXwbzU0ZdsgJf6hIrkwJ+/SdfnqIBL46pPbpWSd6 cHuevY/ymrzYoyK+3y/HyM1pOWkwT7gc56oq2PFJsL1zZjq6XFaSwTqcvWQGbNBVnh96 xd4Qb6xe8SawAeyrtcXV5h+wwHPZ9Up+81OtwK/hELO6lGR0/a+zEsM5Y3TPcH9Wxu5x YlervJM94nQtB9QuZfjKBMEldNSpcVgzz3sUiCUOsmjA++UvGCj8OHxpFNBIwEdHfsHs oVeA== X-Gm-Message-State: AOAM5316mkFy03q3mB+tu95r6hUdmDN9tubL+tq1O+0wax4wDXl89K3g s+wV62DOnaOOyWsLvrykScDT51S4emGyTN+WQUsjUDzQMWM= X-Google-Smtp-Source: ABdhPJyESANQoDDLxOZLAWslu/8iNbHnuNUhb3zVDpjRp5lYbIDrqRN2a9+eUOZ5aIdIAOvFxaCaCTOqCZeOqtvT2oM= X-Received: by 2002:a1f:5c81:0:b0:351:dddc:a5ef with SMTP id q123-20020a1f5c81000000b00351dddca5efmr976260vkb.19.1652385858796; Thu, 12 May 2022 13:04:18 -0700 (PDT) MIME-Version: 1.0 References: <20220415055132.1257272-1-goldstein.w.n@gmail.com> <20220415172801.1525674-1-goldstein.w.n@gmail.com> <20220415172801.1525674-3-goldstein.w.n@gmail.com> In-Reply-To: From: Sunil Pandey Date: Thu, 12 May 2022 13:03:42 -0700 Message-ID: Subject: Re: [PATCH v3 3/3] x86: Cleanup page cross code in memcmp-avx2-movbe.S To: "H.J. Lu" , Libc-stable Mailing List Cc: Noah Goldstein , GNU C Library Content-Type: multipart/mixed; boundary="000000000000255b2005ded6108b" X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-stable@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-stable mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 May 2022 20:04:21 -0000 --000000000000255b2005ded6108b Content-Type: text/plain; charset="UTF-8" On Fri, Apr 15, 2022 at 10:34 AM H.J. Lu via Libc-alpha wrote: > > On Fri, Apr 15, 2022 at 10:28 AM Noah Goldstein wrote: > > > > Old code was both inefficient and wasted code size. New code (-62 > > bytes) and comparable or better performance in the page cross case. > > > > geometric_mean(N=20) of page cross cases New / Original: 0.960 > > > > size, align0, align1, ret, New Time/Old Time > > 1, 4095, 0, 0, 1.001 > > 1, 4095, 0, 1, 0.999 > > 1, 4095, 0, -1, 1.0 > > 2, 4094, 0, 0, 1.0 > > 2, 4094, 0, 1, 1.0 > > 2, 4094, 0, -1, 1.0 > > 3, 4093, 0, 0, 1.0 > > 3, 4093, 0, 1, 1.0 > > 3, 4093, 0, -1, 1.0 > > 4, 4092, 0, 0, 0.987 > > 4, 4092, 0, 1, 1.0 > > 4, 4092, 0, -1, 1.0 > > 5, 4091, 0, 0, 0.984 > > 5, 4091, 0, 1, 1.002 > > 5, 4091, 0, -1, 1.005 > > 6, 4090, 0, 0, 0.993 > > 6, 4090, 0, 1, 1.001 > > 6, 4090, 0, -1, 1.003 > > 7, 4089, 0, 0, 0.991 > > 7, 4089, 0, 1, 1.0 > > 7, 4089, 0, -1, 1.001 > > 8, 4088, 0, 0, 0.875 > > 8, 4088, 0, 1, 0.881 > > 8, 4088, 0, -1, 0.888 > > 9, 4087, 0, 0, 0.872 > > 9, 4087, 0, 1, 0.879 > > 9, 4087, 0, -1, 0.883 > > 10, 4086, 0, 0, 0.878 > > 10, 4086, 0, 1, 0.886 > > 10, 4086, 0, -1, 0.873 > > 11, 4085, 0, 0, 0.878 > > 11, 4085, 0, 1, 0.881 > > 11, 4085, 0, -1, 0.879 > > 12, 4084, 0, 0, 0.873 > > 12, 4084, 0, 1, 0.889 > > 12, 4084, 0, -1, 0.875 > > 13, 4083, 0, 0, 0.873 > > 13, 4083, 0, 1, 0.863 > > 13, 4083, 0, -1, 0.863 > > 14, 4082, 0, 0, 0.838 > > 14, 4082, 0, 1, 0.869 > > 14, 4082, 0, -1, 0.877 > > 15, 4081, 0, 0, 0.841 > > 15, 4081, 0, 1, 0.869 > > 15, 4081, 0, -1, 0.876 > > 16, 4080, 0, 0, 0.988 > > 16, 4080, 0, 1, 0.99 > > 16, 4080, 0, -1, 0.989 > > 17, 4079, 0, 0, 0.978 > > 17, 4079, 0, 1, 0.981 > > 17, 4079, 0, -1, 0.98 > > 18, 4078, 0, 0, 0.981 > > 18, 4078, 0, 1, 0.98 > > 18, 4078, 0, -1, 0.985 > > 19, 4077, 0, 0, 0.977 > > 19, 4077, 0, 1, 0.979 > > 19, 4077, 0, -1, 0.986 > > 20, 4076, 0, 0, 0.977 > > 20, 4076, 0, 1, 0.986 > > 20, 4076, 0, -1, 0.984 > > 21, 4075, 0, 0, 0.977 > > 21, 4075, 0, 1, 0.983 > > 21, 4075, 0, -1, 0.988 > > 22, 4074, 0, 0, 0.983 > > 22, 4074, 0, 1, 0.994 > > 22, 4074, 0, -1, 0.993 > > 23, 4073, 0, 0, 0.98 > > 23, 4073, 0, 1, 0.992 > > 23, 4073, 0, -1, 0.995 > > 24, 4072, 0, 0, 0.989 > > 24, 4072, 0, 1, 0.989 > > 24, 4072, 0, -1, 0.991 > > 25, 4071, 0, 0, 0.99 > > 25, 4071, 0, 1, 0.999 > > 25, 4071, 0, -1, 0.996 > > 26, 4070, 0, 0, 0.993 > > 26, 4070, 0, 1, 0.995 > > 26, 4070, 0, -1, 0.998 > > 27, 4069, 0, 0, 0.993 > > 27, 4069, 0, 1, 0.999 > > 27, 4069, 0, -1, 1.0 > > 28, 4068, 0, 0, 0.997 > > 28, 4068, 0, 1, 1.0 > > 28, 4068, 0, -1, 0.999 > > 29, 4067, 0, 0, 0.996 > > 29, 4067, 0, 1, 0.999 > > 29, 4067, 0, -1, 0.999 > > 30, 4066, 0, 0, 0.991 > > 30, 4066, 0, 1, 1.001 > > 30, 4066, 0, -1, 0.999 > > 31, 4065, 0, 0, 0.988 > > 31, 4065, 0, 1, 0.998 > > 31, 4065, 0, -1, 0.998 > > --- > > sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S | 98 ++++++++++++-------- > > 1 file changed, 61 insertions(+), 37 deletions(-) > > > > diff --git a/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S b/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S > > index a34ea1645d..210c9925b6 100644 > > --- a/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S > > +++ b/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S > > @@ -429,22 +429,21 @@ L(page_cross_less_vec): > > # ifndef USE_AS_WMEMCMP > > cmpl $8, %edx > > jae L(between_8_15) > > + /* Fall through for [4, 7]. */ > > cmpl $4, %edx > > - jae L(between_4_7) > > + jb L(between_2_3) > > > > - /* Load as big endian to avoid branches. */ > > - movzwl (%rdi), %eax > > - movzwl (%rsi), %ecx > > - shll $8, %eax > > - shll $8, %ecx > > - bswap %eax > > - bswap %ecx > > - movzbl -1(%rdi, %rdx), %edi > > - movzbl -1(%rsi, %rdx), %esi > > - orl %edi, %eax > > - orl %esi, %ecx > > - /* Subtraction is okay because the upper 8 bits are zero. */ > > - subl %ecx, %eax > > + movbe (%rdi), %eax > > + movbe (%rsi), %ecx > > + shlq $32, %rax > > + shlq $32, %rcx > > + movbe -4(%rdi, %rdx), %edi > > + movbe -4(%rsi, %rdx), %esi > > + orq %rdi, %rax > > + orq %rsi, %rcx > > + subq %rcx, %rax > > + /* Fast path for return zero. */ > > + jnz L(ret_nonzero) > > /* No ymm register was touched. */ > > ret > > > > @@ -457,9 +456,33 @@ L(one_or_less): > > /* No ymm register was touched. */ > > ret > > > > + .p2align 4,, 5 > > +L(ret_nonzero): > > + sbbl %eax, %eax > > + orl $1, %eax > > + /* No ymm register was touched. */ > > + ret > > + > > + .p2align 4,, 2 > > +L(zero): > > + xorl %eax, %eax > > + /* No ymm register was touched. */ > > + ret > > + > > .p2align 4 > > L(between_8_15): > > -# endif > > + movbe (%rdi), %rax > > + movbe (%rsi), %rcx > > + subq %rcx, %rax > > + jnz L(ret_nonzero) > > + movbe -8(%rdi, %rdx), %rax > > + movbe -8(%rsi, %rdx), %rcx > > + subq %rcx, %rax > > + /* Fast path for return zero. */ > > + jnz L(ret_nonzero) > > + /* No ymm register was touched. */ > > + ret > > +# else > > /* If USE_AS_WMEMCMP fall through into 8-15 byte case. */ > > vmovq (%rdi), %xmm1 > > vmovq (%rsi), %xmm2 > > @@ -475,16 +498,13 @@ L(between_8_15): > > VPCMPEQ %xmm1, %xmm2, %xmm2 > > vpmovmskb %xmm2, %eax > > subl $0xffff, %eax > > + /* Fast path for return zero. */ > > jnz L(return_vec_0) > > /* No ymm register was touched. */ > > ret > > +# endif > > > > - .p2align 4 > > -L(zero): > > - xorl %eax, %eax > > - ret > > - > > - .p2align 4 > > + .p2align 4,, 10 > > L(between_16_31): > > /* From 16 to 31 bytes. No branch when size == 16. */ > > vmovdqu (%rsi), %xmm2 > > @@ -501,11 +521,17 @@ L(between_16_31): > > VPCMPEQ (%rdi), %xmm2, %xmm2 > > vpmovmskb %xmm2, %eax > > subl $0xffff, %eax > > + /* Fast path for return zero. */ > > jnz L(return_vec_0) > > /* No ymm register was touched. */ > > ret > > > > # ifdef USE_AS_WMEMCMP > > + .p2align 4,, 2 > > +L(zero): > > + xorl %eax, %eax > > + ret > > + > > .p2align 4 > > L(one_or_less): > > jb L(zero) > > @@ -520,22 +546,20 @@ L(one_or_less): > > # else > > > > .p2align 4 > > -L(between_4_7): > > - /* Load as big endian with overlapping movbe to avoid branches. > > - */ > > - movbe (%rdi), %eax > > - movbe (%rsi), %ecx > > - shlq $32, %rax > > - shlq $32, %rcx > > - movbe -4(%rdi, %rdx), %edi > > - movbe -4(%rsi, %rdx), %esi > > - orq %rdi, %rax > > - orq %rsi, %rcx > > - subq %rcx, %rax > > - jz L(zero_4_7) > > - sbbl %eax, %eax > > - orl $1, %eax > > -L(zero_4_7): > > +L(between_2_3): > > + /* Load as big endian to avoid branches. */ > > + movzwl (%rdi), %eax > > + movzwl (%rsi), %ecx > > + bswap %eax > > + bswap %ecx > > + shrl %eax > > + shrl %ecx > > + movzbl -1(%rdi, %rdx), %edi > > + movzbl -1(%rsi, %rdx), %esi > > + orl %edi, %eax > > + orl %esi, %ecx > > + /* Subtraction is okay because the upper bit is zero. */ > > + subl %ecx, %eax > > /* No ymm register was touched. */ > > ret > > # endif > > -- > > 2.25.1 > > > > LGTM. > > Reviewed-by: H.J. Lu > > Thanks. > > -- > H.J. I would like to backport this patch to release branches. Any comments or objections? Conflict resolution patch attached. --Sunil --000000000000255b2005ded6108b Content-Type: application/octet-stream; name="0021-x86-Cleanup-page-cross-code-in-memcmp-avx2-movbe.S.patch" Content-Disposition: attachment; filename="0021-x86-Cleanup-page-cross-code-in-memcmp-avx2-movbe.S.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l33fuhzu0 RnJvbSAzZDc0ZGQ0ZWJjNDA5OGJjN2Y0YjkxYjI3OTQ2ODQ0MjdjNzY5NGRkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOb2FoIEdvbGRzdGVpbiA8Z29sZHN0ZWluLncubkBnbWFpbC5j b20+CkRhdGU6IEZyaSwgMTUgQXByIDIwMjIgMTI6Mjg6MDEgLTA1MDAKU3ViamVjdDogW1BBVENI IDIxLzI2XSB4ODY6IENsZWFudXAgcGFnZSBjcm9zcyBjb2RlIGluIG1lbWNtcC1hdngyLW1vdmJl LlMKCk9sZCBjb2RlIHdhcyBib3RoIGluZWZmaWNpZW50IGFuZCB3YXN0ZWQgY29kZSBzaXplLiBO ZXcgY29kZSAoLTYyCmJ5dGVzKSBhbmQgY29tcGFyYWJsZSBvciBiZXR0ZXIgcGVyZm9ybWFuY2Ug aW4gdGhlIHBhZ2UgY3Jvc3MgY2FzZS4KCmdlb21ldHJpY19tZWFuKE49MjApIG9mIHBhZ2UgY3Jv c3MgY2FzZXMgTmV3IC8gT3JpZ2luYWw6IDAuOTYwCgpzaXplLCBhbGlnbjAsIGFsaWduMSwgcmV0 LCBOZXcgVGltZS9PbGQgVGltZQogICAxLCAgIDQwOTUsICAgICAgMCwgICAwLCAgICAgICAgICAg ICAxLjAwMQogICAxLCAgIDQwOTUsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk5OQogICAx LCAgIDQwOTUsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAgIDEuMAogICAyLCAgIDQwOTQsICAg ICAgMCwgICAwLCAgICAgICAgICAgICAgIDEuMAogICAyLCAgIDQwOTQsICAgICAgMCwgICAxLCAg ICAgICAgICAgICAgIDEuMAogICAyLCAgIDQwOTQsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAg IDEuMAogICAzLCAgIDQwOTMsICAgICAgMCwgICAwLCAgICAgICAgICAgICAgIDEuMAogICAzLCAg IDQwOTMsICAgICAgMCwgICAxLCAgICAgICAgICAgICAgIDEuMAogICAzLCAgIDQwOTMsICAgICAg MCwgIC0xLCAgICAgICAgICAgICAgIDEuMAogICA0LCAgIDQwOTIsICAgICAgMCwgICAwLCAgICAg ICAgICAgICAwLjk4NwogICA0LCAgIDQwOTIsICAgICAgMCwgICAxLCAgICAgICAgICAgICAgIDEu MAogICA0LCAgIDQwOTIsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAgIDEuMAogICA1LCAgIDQw OTEsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk4NAogICA1LCAgIDQwOTEsICAgICAgMCwg ICAxLCAgICAgICAgICAgICAxLjAwMgogICA1LCAgIDQwOTEsICAgICAgMCwgIC0xLCAgICAgICAg ICAgICAxLjAwNQogICA2LCAgIDQwOTAsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk5Mwog ICA2LCAgIDQwOTAsICAgICAgMCwgICAxLCAgICAgICAgICAgICAxLjAwMQogICA2LCAgIDQwOTAs ICAgICAgMCwgIC0xLCAgICAgICAgICAgICAxLjAwMwogICA3LCAgIDQwODksICAgICAgMCwgICAw LCAgICAgICAgICAgICAwLjk5MQogICA3LCAgIDQwODksICAgICAgMCwgICAxLCAgICAgICAgICAg ICAgIDEuMAogICA3LCAgIDQwODksICAgICAgMCwgIC0xLCAgICAgICAgICAgICAxLjAwMQogICA4 LCAgIDQwODgsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjg3NQogICA4LCAgIDQwODgsICAg ICAgMCwgICAxLCAgICAgICAgICAgICAwLjg4MQogICA4LCAgIDQwODgsICAgICAgMCwgIC0xLCAg ICAgICAgICAgICAwLjg4OAogICA5LCAgIDQwODcsICAgICAgMCwgICAwLCAgICAgICAgICAgICAw Ljg3MgogICA5LCAgIDQwODcsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjg3OQogICA5LCAg IDQwODcsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjg4MwogIDEwLCAgIDQwODYsICAgICAg MCwgICAwLCAgICAgICAgICAgICAwLjg3OAogIDEwLCAgIDQwODYsICAgICAgMCwgICAxLCAgICAg ICAgICAgICAwLjg4NgogIDEwLCAgIDQwODYsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjg3 MwogIDExLCAgIDQwODUsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjg3OAogIDExLCAgIDQw ODUsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjg4MQogIDExLCAgIDQwODUsICAgICAgMCwg IC0xLCAgICAgICAgICAgICAwLjg3OQogIDEyLCAgIDQwODQsICAgICAgMCwgICAwLCAgICAgICAg ICAgICAwLjg3MwogIDEyLCAgIDQwODQsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjg4OQog IDEyLCAgIDQwODQsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjg3NQogIDEzLCAgIDQwODMs ICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjg3MwogIDEzLCAgIDQwODMsICAgICAgMCwgICAx LCAgICAgICAgICAgICAwLjg2MwogIDEzLCAgIDQwODMsICAgICAgMCwgIC0xLCAgICAgICAgICAg ICAwLjg2MwogIDE0LCAgIDQwODIsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjgzOAogIDE0 LCAgIDQwODIsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjg2OQogIDE0LCAgIDQwODIsICAg ICAgMCwgIC0xLCAgICAgICAgICAgICAwLjg3NwogIDE1LCAgIDQwODEsICAgICAgMCwgICAwLCAg ICAgICAgICAgICAwLjg0MQogIDE1LCAgIDQwODEsICAgICAgMCwgICAxLCAgICAgICAgICAgICAw Ljg2OQogIDE1LCAgIDQwODEsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjg3NgogIDE2LCAg IDQwODAsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk4OAogIDE2LCAgIDQwODAsICAgICAg MCwgICAxLCAgICAgICAgICAgICAgMC45OQogIDE2LCAgIDQwODAsICAgICAgMCwgIC0xLCAgICAg ICAgICAgICAwLjk4OQogIDE3LCAgIDQwNzksICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk3 OAogIDE3LCAgIDQwNzksICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk4MQogIDE3LCAgIDQw NzksICAgICAgMCwgIC0xLCAgICAgICAgICAgICAgMC45OAogIDE4LCAgIDQwNzgsICAgICAgMCwg ICAwLCAgICAgICAgICAgICAwLjk4MQogIDE4LCAgIDQwNzgsICAgICAgMCwgICAxLCAgICAgICAg ICAgICAgMC45OAogIDE4LCAgIDQwNzgsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk4NQog IDE5LCAgIDQwNzcsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk3NwogIDE5LCAgIDQwNzcs ICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk3OQogIDE5LCAgIDQwNzcsICAgICAgMCwgIC0x LCAgICAgICAgICAgICAwLjk4NgogIDIwLCAgIDQwNzYsICAgICAgMCwgICAwLCAgICAgICAgICAg ICAwLjk3NwogIDIwLCAgIDQwNzYsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk4NgogIDIw LCAgIDQwNzYsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk4NAogIDIxLCAgIDQwNzUsICAg ICAgMCwgICAwLCAgICAgICAgICAgICAwLjk3NwogIDIxLCAgIDQwNzUsICAgICAgMCwgICAxLCAg ICAgICAgICAgICAwLjk4MwogIDIxLCAgIDQwNzUsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAw Ljk4OAogIDIyLCAgIDQwNzQsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk4MwogIDIyLCAg IDQwNzQsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk5NAogIDIyLCAgIDQwNzQsICAgICAg MCwgIC0xLCAgICAgICAgICAgICAwLjk5MwogIDIzLCAgIDQwNzMsICAgICAgMCwgICAwLCAgICAg ICAgICAgICAgMC45OAogIDIzLCAgIDQwNzMsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk5 MgogIDIzLCAgIDQwNzMsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk5NQogIDI0LCAgIDQw NzIsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk4OQogIDI0LCAgIDQwNzIsICAgICAgMCwg ICAxLCAgICAgICAgICAgICAwLjk4OQogIDI0LCAgIDQwNzIsICAgICAgMCwgIC0xLCAgICAgICAg ICAgICAwLjk5MQogIDI1LCAgIDQwNzEsICAgICAgMCwgICAwLCAgICAgICAgICAgICAgMC45OQog IDI1LCAgIDQwNzEsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk5OQogIDI1LCAgIDQwNzEs ICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk5NgogIDI2LCAgIDQwNzAsICAgICAgMCwgICAw LCAgICAgICAgICAgICAwLjk5MwogIDI2LCAgIDQwNzAsICAgICAgMCwgICAxLCAgICAgICAgICAg ICAwLjk5NQogIDI2LCAgIDQwNzAsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk5OAogIDI3 LCAgIDQwNjksICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk5MwogIDI3LCAgIDQwNjksICAg ICAgMCwgICAxLCAgICAgICAgICAgICAwLjk5OQogIDI3LCAgIDQwNjksICAgICAgMCwgIC0xLCAg ICAgICAgICAgICAgIDEuMAogIDI4LCAgIDQwNjgsICAgICAgMCwgICAwLCAgICAgICAgICAgICAw Ljk5NwogIDI4LCAgIDQwNjgsICAgICAgMCwgICAxLCAgICAgICAgICAgICAgIDEuMAogIDI4LCAg IDQwNjgsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk5OQogIDI5LCAgIDQwNjcsICAgICAg MCwgICAwLCAgICAgICAgICAgICAwLjk5NgogIDI5LCAgIDQwNjcsICAgICAgMCwgICAxLCAgICAg ICAgICAgICAwLjk5OQogIDI5LCAgIDQwNjcsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk5 OQogIDMwLCAgIDQwNjYsICAgICAgMCwgICAwLCAgICAgICAgICAgICAwLjk5MQogIDMwLCAgIDQw NjYsICAgICAgMCwgICAxLCAgICAgICAgICAgICAxLjAwMQogIDMwLCAgIDQwNjYsICAgICAgMCwg IC0xLCAgICAgICAgICAgICAwLjk5OQogIDMxLCAgIDQwNjUsICAgICAgMCwgICAwLCAgICAgICAg ICAgICAwLjk4OAogIDMxLCAgIDQwNjUsICAgICAgMCwgICAxLCAgICAgICAgICAgICAwLjk5OAog IDMxLCAgIDQwNjUsICAgICAgMCwgIC0xLCAgICAgICAgICAgICAwLjk5OApSZXZpZXdlZC1ieTog SC5KLiBMdSA8aGpsLnRvb2xzQGdtYWlsLmNvbT4KCihjaGVycnkgcGlja2VkIGZyb20gY29tbWl0 IDIzMTAyNjg2ZWM2N2I4NTZhMmQ0ZmQyNWRkYWExYzBiOGQxNzVjNGYpCi0tLQogc3lzZGVwcy94 ODZfNjQvbXVsdGlhcmNoL21lbWNtcC1hdngyLW1vdmJlLlMgfCA5OCArKysrKysrKysrKystLS0t LS0tLQogMSBmaWxlIGNoYW5nZWQsIDYxIGluc2VydGlvbnMoKyksIDM3IGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL3N5c2RlcHMveDg2XzY0L211bHRpYXJjaC9tZW1jbXAtYXZ4Mi1tb3ZiZS5T IGIvc3lzZGVwcy94ODZfNjQvbXVsdGlhcmNoL21lbWNtcC1hdngyLW1vdmJlLlMKaW5kZXggYTM0 ZWExNjQ1ZC4uMjEwYzk5MjViNiAxMDA2NDQKLS0tIGEvc3lzZGVwcy94ODZfNjQvbXVsdGlhcmNo L21lbWNtcC1hdngyLW1vdmJlLlMKKysrIGIvc3lzZGVwcy94ODZfNjQvbXVsdGlhcmNoL21lbWNt cC1hdngyLW1vdmJlLlMKQEAgLTQyOSwyMiArNDI5LDIxIEBAIEwocGFnZV9jcm9zc19sZXNzX3Zl Yyk6CiAjIGlmbmRlZiBVU0VfQVNfV01FTUNNUAogCWNtcGwJJDgsICVlZHgKIAlqYWUJTChiZXR3 ZWVuXzhfMTUpCisJLyogRmFsbCB0aHJvdWdoIGZvciBbNCwgN10uICAqLwogCWNtcGwJJDQsICVl ZHgKLQlqYWUJTChiZXR3ZWVuXzRfNykKKwlqYglMKGJldHdlZW5fMl8zKQogCi0JLyogTG9hZCBh cyBiaWcgZW5kaWFuIHRvIGF2b2lkIGJyYW5jaGVzLiAgKi8KLQltb3Z6d2wJKCVyZGkpLCAlZWF4 Ci0JbW92endsCSglcnNpKSwgJWVjeAotCXNobGwJJDgsICVlYXgKLQlzaGxsCSQ4LCAlZWN4Ci0J YnN3YXAJJWVheAotCWJzd2FwCSVlY3gKLQltb3Z6YmwJLTEoJXJkaSwgJXJkeCksICVlZGkKLQlt b3Z6YmwJLTEoJXJzaSwgJXJkeCksICVlc2kKLQlvcmwJJWVkaSwgJWVheAotCW9ybAklZXNpLCAl ZWN4Ci0JLyogU3VidHJhY3Rpb24gaXMgb2theSBiZWNhdXNlIHRoZSB1cHBlciA4IGJpdHMgYXJl IHplcm8uICAqLwotCXN1YmwJJWVjeCwgJWVheAorCW1vdmJlCSglcmRpKSwgJWVheAorCW1vdmJl CSglcnNpKSwgJWVjeAorCXNobHEJJDMyLCAlcmF4CisJc2hscQkkMzIsICVyY3gKKwltb3ZiZQkt NCglcmRpLCAlcmR4KSwgJWVkaQorCW1vdmJlCS00KCVyc2ksICVyZHgpLCAlZXNpCisJb3JxCSVy ZGksICVyYXgKKwlvcnEJJXJzaSwgJXJjeAorCXN1YnEJJXJjeCwgJXJheAorCS8qIEZhc3QgcGF0 aCBmb3IgcmV0dXJuIHplcm8uICAqLworCWpueglMKHJldF9ub256ZXJvKQogCS8qIE5vIHltbSBy ZWdpc3RlciB3YXMgdG91Y2hlZC4gICovCiAJcmV0CiAKQEAgLTQ1Nyw5ICs0NTYsMzMgQEAgTChv bmVfb3JfbGVzcyk6CiAJLyogTm8geW1tIHJlZ2lzdGVyIHdhcyB0b3VjaGVkLiAgKi8KIAlyZXQK IAorCS5wMmFsaWduIDQsLCA1CitMKHJldF9ub256ZXJvKToKKwlzYmJsCSVlYXgsICVlYXgKKwlv cmwJJDEsICVlYXgKKwkvKiBObyB5bW0gcmVnaXN0ZXIgd2FzIHRvdWNoZWQuICAqLworCXJldAor CisJLnAyYWxpZ24gNCwsIDIKK0woemVybyk6CisJeG9ybAklZWF4LCAlZWF4CisJLyogTm8geW1t IHJlZ2lzdGVyIHdhcyB0b3VjaGVkLiAgKi8KKwlyZXQKKwogCS5wMmFsaWduIDQKIEwoYmV0d2Vl bl84XzE1KToKLSMgZW5kaWYKKwltb3ZiZQkoJXJkaSksICVyYXgKKwltb3ZiZQkoJXJzaSksICVy Y3gKKwlzdWJxCSVyY3gsICVyYXgKKwlqbnoJTChyZXRfbm9uemVybykKKwltb3ZiZQktOCglcmRp LCAlcmR4KSwgJXJheAorCW1vdmJlCS04KCVyc2ksICVyZHgpLCAlcmN4CisJc3VicQklcmN4LCAl cmF4CisJLyogRmFzdCBwYXRoIGZvciByZXR1cm4gemVyby4gICovCisJam56CUwocmV0X25vbnpl cm8pCisJLyogTm8geW1tIHJlZ2lzdGVyIHdhcyB0b3VjaGVkLiAgKi8KKwlyZXQKKyMgZWxzZQog CS8qIElmIFVTRV9BU19XTUVNQ01QIGZhbGwgdGhyb3VnaCBpbnRvIDgtMTUgYnl0ZSBjYXNlLiAg Ki8KIAl2bW92cQkoJXJkaSksICV4bW0xCiAJdm1vdnEJKCVyc2kpLCAleG1tMgpAQCAtNDc1LDE2 ICs0OTgsMTMgQEAgTChiZXR3ZWVuXzhfMTUpOgogCVZQQ01QRVEJJXhtbTEsICV4bW0yLCAleG1t MgogCXZwbW92bXNrYiAleG1tMiwgJWVheAogCXN1YmwJJDB4ZmZmZiwgJWVheAorCS8qIEZhc3Qg cGF0aCBmb3IgcmV0dXJuIHplcm8uICAqLwogCWpueglMKHJldHVybl92ZWNfMCkKIAkvKiBObyB5 bW0gcmVnaXN0ZXIgd2FzIHRvdWNoZWQuICAqLwogCXJldAorIyBlbmRpZgogCi0JLnAyYWxpZ24g NAotTCh6ZXJvKToKLQl4b3JsCSVlYXgsICVlYXgKLQlyZXQKLQotCS5wMmFsaWduIDQKKwkucDJh bGlnbiA0LCwgMTAKIEwoYmV0d2Vlbl8xNl8zMSk6CiAJLyogRnJvbSAxNiB0byAzMSBieXRlcy4g IE5vIGJyYW5jaCB3aGVuIHNpemUgPT0gMTYuICAqLwogCXZtb3ZkcXUJKCVyc2kpLCAleG1tMgpA QCAtNTAxLDExICs1MjEsMTcgQEAgTChiZXR3ZWVuXzE2XzMxKToKIAlWUENNUEVRCSglcmRpKSwg JXhtbTIsICV4bW0yCiAJdnBtb3Ztc2tiICV4bW0yLCAlZWF4CiAJc3VibAkkMHhmZmZmLCAlZWF4 CisJLyogRmFzdCBwYXRoIGZvciByZXR1cm4gemVyby4gICovCiAJam56CUwocmV0dXJuX3ZlY18w KQogCS8qIE5vIHltbSByZWdpc3RlciB3YXMgdG91Y2hlZC4gICovCiAJcmV0CiAKICMgaWZkZWYg VVNFX0FTX1dNRU1DTVAKKwkucDJhbGlnbiA0LCwgMgorTCh6ZXJvKToKKwl4b3JsCSVlYXgsICVl YXgKKwlyZXQKKwogCS5wMmFsaWduIDQKIEwob25lX29yX2xlc3MpOgogCWpiCUwoemVybykKQEAg LTUyMCwyMiArNTQ2LDIwIEBAIEwob25lX29yX2xlc3MpOgogIyBlbHNlCiAKIAkucDJhbGlnbiA0 Ci1MKGJldHdlZW5fNF83KToKLQkvKiBMb2FkIGFzIGJpZyBlbmRpYW4gd2l0aCBvdmVybGFwcGlu ZyBtb3ZiZSB0byBhdm9pZCBicmFuY2hlcy4KLQkgKi8KLQltb3ZiZQkoJXJkaSksICVlYXgKLQlt b3ZiZQkoJXJzaSksICVlY3gKLQlzaGxxCSQzMiwgJXJheAotCXNobHEJJDMyLCAlcmN4Ci0JbW92 YmUJLTQoJXJkaSwgJXJkeCksICVlZGkKLQltb3ZiZQktNCglcnNpLCAlcmR4KSwgJWVzaQotCW9y cQklcmRpLCAlcmF4Ci0Jb3JxCSVyc2ksICVyY3gKLQlzdWJxCSVyY3gsICVyYXgKLQlqeglMKHpl cm9fNF83KQotCXNiYmwJJWVheCwgJWVheAotCW9ybAkkMSwgJWVheAotTCh6ZXJvXzRfNyk6CitM KGJldHdlZW5fMl8zKToKKwkvKiBMb2FkIGFzIGJpZyBlbmRpYW4gdG8gYXZvaWQgYnJhbmNoZXMu ICAqLworCW1vdnp3bAkoJXJkaSksICVlYXgKKwltb3Z6d2wJKCVyc2kpLCAlZWN4CisJYnN3YXAJ JWVheAorCWJzd2FwCSVlY3gKKwlzaHJsCSVlYXgKKwlzaHJsCSVlY3gKKwltb3Z6YmwJLTEoJXJk aSwgJXJkeCksICVlZGkKKwltb3Z6YmwJLTEoJXJzaSwgJXJkeCksICVlc2kKKwlvcmwJJWVkaSwg JWVheAorCW9ybAklZXNpLCAlZWN4CisJLyogU3VidHJhY3Rpb24gaXMgb2theSBiZWNhdXNlIHRo ZSB1cHBlciBiaXQgaXMgemVyby4gICovCisJc3VibAklZWN4LCAlZWF4CiAJLyogTm8geW1tIHJl Z2lzdGVyIHdhcyB0b3VjaGVkLiAgKi8KIAlyZXQKICMgZW5kaWYKLS0gCjIuMzUuMQoK --000000000000255b2005ded6108b--